已经问过here类似的问题。但是OP没有按要求添加代码。所以我会在这里做。该代码使用INSERT INTO写入CSV。
我尝试过准备/未准备好的DbCommand吗?和@占位符以及未准备好的动态SQL。与使用StreamWriter直接写入文件的简单实现相比,所有插入的执行速度都要慢100到1000倍。
此外,我没有找到OleDB的BulkInsert方法。毕竟Microsoft的SQL-Server高性能导出到csv,所以他们似乎知道如何去做。
请注意,问题仅在于写作。阅读真的很快。
另请注意,我确实有一个schema.ini并且正常工作。
我正在使用Net3.5。
所以问题是,我的代码出了什么问题?或者OleDB中有错误?或者是否有更好的数据提供者来访问cvs?
IDbCommand cmd = connection.CreateCommand(); //conn. type is IDbConnection
var colnames = new StringBuilder();
var placeholders = new StringBuilder();
DataTable schema = dr.GetSchemaTable();
char sep = ' ';
foreach (DataRow r in schema.Rows) {
String name = r["ColumnName"] as String;
colnames.AppendFormat("{0}{1}", sep, name);
placeholders.AppendFormat("{0}?", sep);
sep = ',';
var p = cmd.CreateParameter();
//p.DbType = (DbType) r["ProviderType"]; //NUMBER(38) is DateTime? strange!
p.Size = (int)r["ColumnSize"];
cmd.Parameters.Add(p);
}
var query2 = new StringBuilder();
query2.AppendFormat ( "INSERT INTO {0} ({1}) VALUES ({2})",
tableName, colnames, placeholders );
cmd.CommandText = query2.ToString();
cmd.CommandType = CommandType.Text;
cmd.CommandTimeout = 5;
while (dr.Read()) { // dr is of type IDataReader
for (int i = 0; i < dr.FieldCount; ++i) {
String name = dr.GetName(i);
DbParameter pp = cmd.Parameters[i] as DbParameter; //tried name for i too
pp.Value = dr.GetValue(i);
}
cmd.ExecuteNonQuery();
}