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

时间:2013-09-29 11:06:31

标签: c# sql dictionary sqlbulkcopy datareader

我需要大大改善目前流程的执行时间:

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

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

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

提前致谢

1 个答案:

答案 0 :(得分:1)

正如您已经想到的那样,您需要实现自定义IDataReader。 由于您的源是Dictionary - 只有少数相对简单的方法/属性,如int FieldCount,bool Read(),对象Get(int i)应该实现。

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

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