使用OLEDB将表写入文件非常慢

时间:2014-05-12 07:33:46

标签: c# performance export-to-csv oledbcommand

已经问过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();
}

0 个答案:

没有答案