9

我有一个DataTable包含大约 100,000 条记录的 ADO.NET。在这个表中有一个 没有值的列,因为该列是在我的 SQL Server 数据库中xyID自动生成的。IDENTITY

我需要为其他进程检索生成的 ID。我正在寻找一种将其批量复制DataTable到 SQL Server 数据库中的方法,并在同一“步骤”DataTable中用生成的 ID“填充”我。

如何使用SqlBulkCopy该类检索插入到表中的记录的标识值?

4

1 回答 1

2

我目前正在做这样的事情:

DataTable objects = new DataTable();
DataColumn keyColumn = new DataColumn("name", typeof(string));
DataColumn versionColumn = new DataColumn("version", typeof(int));
versionColumn.DefaultValue = iVersionID;

objects.Columns.Add(keyColumn);
objects.Columns.Add(versionColumn);

foreach (KeyValuePair<string, NamedObject> kvp in Directory)
{
    NamedObject o = kvp.Value;
    DataRow row = objects.NewRow();
    row[0] = o.Name;
    objects.Rows.Add(row);
}

using (SqlBulkCopy updater = new SqlBulkCopy(conn,
        SqlBulkCopyOptions.TableLock | SqlBulkCopyOptions.UseInternalTransaction, null))
{
    updater.DestinationTableName = "object_table";
    updater.WriteToServer(objects);
}

string sQuery = @"SELECT id, name FROM object_table WHERE version = @ver";
using (SqlCommand command = new SqlCommand(sQuery, conn))
{
    SqlParameter version = new SqlParameter("@ver", SqlDbType.Int, 4);
    version.Value = versionID;
    command.Parameters.Add(version);

    command.CommandTimeout = 600;

    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            string key = (string)reader[1];

            NamedObject item = Directory[key];
            item.ID = (int)reader[0];
        }
    }
}

请注意,我们的数据设计允许使用版本 ID 过滤所有新对象;我们添加的每一行都将具有相同的版本 ID,并且我们之前已经删除了数据库中已经具有此版本 ID 的所有行。

但是,我的选择查询目前在 ExecuteReader 中超时,即使有 10 分钟的窗口也是如此。所以这不是我们的最终解决方案。

于 2010-06-11T18:41:47.897 回答