使用 IDatareader 和 SqlBulkCopy 将 Dictionary 元素作为行插入 SQL 表

Posted

技术标签:

【中文标题】使用 IDatareader 和 SqlBulkCopy 将 Dictionary 元素作为行插入 SQL 表【英文标题】:Insert Dictionary elements into SQL table as rows using IDatareader and SqlBulkCopy 【发布时间】:2013-09-29 11:06:31 【问题描述】:

我需要显着提高当前进程的执行时间,就像这样:

private Dictionary<int, SingleElement> elements_buffer;

// ... Create and load values into "elements_buffer"
// (string, Datetime, double)

string query = "INSERT INTO Tests.dbo.test_table "
    + "(element_name,element_init,element_width) VALUES";

SingleElement element_aux;

for (int i = 0; i < MAX_ELEMS_IN_DICT; i++)

    element_aux = elements_buffer[i];

    query = query
        + "('"
        + element_aux.name
        + "','"
        + element_aux.init
        + "',"
        + element_aux.width
        + ")";

    if (i < MAX_ELEMS_IN_DICT+1) 
        query = query + ",";
    


// ... Execute the query

我打算将Datatable 用于新版本,但我一直在阅读有关将SqlBulkCopyIDatareader 一起使用的信息,如下所述:

SqlBulkCopy performance

C# loops and mass insert

在我看来,我的代码是一个更好的选择,但无法弄清楚如何对其进行编码,尽管我想使用它。

我可以帮忙翻译一下代码吗?

提前致谢

【问题讨论】:

请使用parameterized queries 而不是字符串连接。这种连接对SQL Injection 攻击开放。 其实它是不能从互联网访问的,安全性也不是问题;无论如何,我感谢您的评论,但如果您能帮助我解决我的问题,那就太好了。 【参考方案1】:

正如您已经想到的,您需要实现自定义IDataReader。 由于您的来源是 Dictionary - 应该只实现几个相对简单的方法/属性,例如 int FieldCount、bool Read()、object Get(int i)。

您可以通过谷歌搜索 sqlbulkcopy custom idatareader 找到自定义 IDataReader 实现的有用示例 (a simple one)。

另外请记住,SqlBulkCopy 会忽略触发器、外键和其他约束,并且无法处理异常。

【讨论】:

以上是关于使用 IDatareader 和 SqlBulkCopy 将 Dictionary 元素作为行插入 SQL 表的主要内容,如果未能解决你的问题,请参考以下文章

C#中IDataReader和DataSet的区别是啥呢?

利用泛型和反射实现IDataReader转实体

在 C# 中使用 IDataReader 读取 dbf 文件

C# - IDataReader 到使用泛型的对象映射

c# IDataReader SqlDataReader 区别

引发了“System.OutOfMemoryException”类型的异常。 C# 使用 IDataReader 时