我有一个DataTable包含大约 100,000 条记录的 ADO.NET。在这个表中有一个 没有值的列,因为该列是在我的 SQL Server 数据库中xyID自动生成的。IDENTITY
我需要为其他进程检索生成的 ID。我正在寻找一种将其批量复制DataTable到 SQL Server 数据库中的方法,并在同一“步骤”DataTable中用生成的 ID“填充”我。
如何使用SqlBulkCopy该类检索插入到表中的记录的标识值?
我有一个DataTable包含大约 100,000 条记录的 ADO.NET。在这个表中有一个 没有值的列,因为该列是在我的 SQL Server 数据库中xyID自动生成的。IDENTITY
我需要为其他进程检索生成的 ID。我正在寻找一种将其批量复制DataTable到 SQL Server 数据库中的方法,并在同一“步骤”DataTable中用生成的 ID“填充”我。
如何使用SqlBulkCopy该类检索插入到表中的记录的标识值?
我目前正在做这样的事情:
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 分钟的窗口也是如此。所以这不是我们的最终解决方案。