我需要在Microsoft SQL Server 2000中进行复杂的导入操作。由于使用DTS太复杂,我正试图用一小段C#程序来完成,但当我需要导入CSV文件时出现问题:该文件使用分号作为字段分隔符,而不是逗号,我无法让.NET的OLE DB提供者识别它。
我已经在网上找到了各种“解决方案”,例如在连接字符串中使用
这是我正在使用的实际代码:
有没有关于如何使用分号作为字段分隔符而不依赖外部库的想法?
注: 1. “不依赖外部库”是因为我需要直接将文件导入数据库,而我找到的任何库都不能做到这一点(它们返回字符串),而我们的PHB(公司老板)不会为商业解决方案花一分钱。 2. 我知道可以通过DTS导入文件,但我需要在导入之前和之后执行复杂的工作流程和文件修改,并且那样会导致跳进和跳出DTS。 3. 对我来说,在DTS内部完成所有操作并不实际,因为我在ActiveX和VBScript编码方面不太熟练。
感谢您的帮助,Andrea。
编辑1-@andyb:
我已经在网上找到了各种“解决方案”,例如在连接字符串中使用
Extended Properties="Text; Format=Delimited"
或者``Extended Properties="Text; Format=Delimited(;)"以及使用schema.ini文件,但都没有成功。这是我正在使用的实际代码:
DataTable Table = new DataTable();
using (OleDbConnection Connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=\"Text;HDR=Yes;Format=Delimited\""))
{
Connection.Open();
using (OleDbCommand Command = Connection.CreateCommand())
{
Command.CommandText = "select [Field 1], [Field 2] from [file.csv]";
using (OleDbDataAdapter Adapter = new OleDbDataAdapter(Command))
{
Adapter.Fill(Table);
}
}
}
using (SqlConnection Connection = new SqlConnection("Data Source=server; Initial Catalog=database; User Id=user; Password=password;"))
{
Connection.Open();
using (SqlCommand Command = Connection.CreateCommand())
{
Command.CommandText = "insert into [table] ([field_1], [field_2], ...) values (@field_1, @field_2, ...)";
Command.Parameters.Add("field_1", SqlDbType.Date, 0, "Field 1");
Command.Parameters.Add("field_2", SqlDbType.VarChar, 100, "Field 2");
...
using (SqlDataAdapter Adapter = new SqlDataAdapter())
{
Adapter.InsertCommand = Command;
Adapter.Update(Table);
}
}
}
有没有关于如何使用分号作为字段分隔符而不依赖外部库的想法?
注: 1. “不依赖外部库”是因为我需要直接将文件导入数据库,而我找到的任何库都不能做到这一点(它们返回字符串),而我们的PHB(公司老板)不会为商业解决方案花一分钱。 2. 我知道可以通过DTS导入文件,但我需要在导入之前和之后执行复杂的工作流程和文件修改,并且那样会导致跳进和跳出DTS。 3. 对我来说,在DTS内部完成所有操作并不实际,因为我在ActiveX和VBScript编码方面不太熟练。
感谢您的帮助,Andrea。
编辑1-@andyb:
schema.ini
方法的测试程序代码:String ConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=\"Text\"", Environment.CurrentDirectory);
DataTable Table = new DataTable();
using (OleDbConnection Connection = new OleDbConnection(ConnectionString))
{
Connection.Open();
using (OleDbCommand Command = Connection.CreateCommand())
{
Command.CommandText = "select * from [file.csv]";
using (OleDbDataAdapter Adapter = new OleDbDataAdapter(Command))
{
Adapter.Fill(Table);
}
}
}