9

DataTable約 100,000 レコードの ADO.NETがあります。このテーブルには 、SQL Server データベースでxyID自動生成された列であるため、値のない列があります。IDENTITY

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

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

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 を持つデータベース内の行は以前に削除しました。

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

于 2010-06-11T18:41:47.897 に答える