使用 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
用于新版本,但我一直在阅读有关将SqlBulkCopy
与IDatareader
一起使用的信息,如下所述:
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 读取 dbf 文件