如何使用SQL批量複製獲取插入數據記錄的標識

ado.net database identity sqlbulkcopy sql-server

我有一個ADO.NET DataTable ,大約有100,000條記錄。在此表中有一個列xyID ,其中沒有值,因為該列是我的SQL Server數據庫中自動生成的IDENTITY

我需要為其他進程檢索生成的ID。我正在尋找一種方法來將此DataTable批量複製到SQL Server數據庫中,並在同一“步驟”中使用生成的ID“填充”我的DataTable

如何使用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分鐘的窗口。所以這不是我們的最終解決方案。



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因