SQL一括コピーを使用して挿入されたデータレコードのIDを取得する方法

ado.net database identity sqlbulkcopy sql-server

質問

私は約100,000レコードのADO.NET DataTableを持っていDataTable 。この表には、SQL Serverデータベース内の列が自動生成IDENTITYなので、値を持たない列xyIDあります。

私は他のプロセスのために生成されたIDを取得する必要があります。私は、このDataTableをSQL Serverデータベースに一括してコピーする方法を探していDataTable 。生成されたIDでDataTableを「満たす」ために同じ「ステップ」内にありDataTable

SqlBulkCopyクラスを使用してテーブルに挿入されたレコードのID値を取得するにはどうすればよいですか?

人気のある回答

私は現在次のようなことをしています:

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を持つデータベースの行はすべて削除されています。

しかし、私の選択クエリは、その10分のウィンドウであっても、現在ExecuteReaderでタイムアウトしています。だからこれは私たちの最終的な解決策ではありません。



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ