2

TABLE1 のスキーマは次のとおりです。

CREATE TABLE [dbo].[TABLE1] 
(
    [id] [int] IDENTITY(1, 1) NOT NULL,
    [code] [int] NOT NULL,
    [description] [varchar](256) NOT NULL,
    [value] [numeric](18,2) NOT NULL
)

ここに私の SqlBulkCopy コードがあります:

DataTable data = new DataTable();
data.Columns.Add("code", typeof(int));
data.Columns.Add("description", typeof(string));
data.Columns.Add("value", typeof(decimal));
foreach (Item item in items)
{
    data.Rows.Add(item.Code, item.Description, item.Value);
}

SqlConnection sqlConn = new SqlConnection(_connstr);
sqlConn.Open();
SqlBulkCopy bulkCopy = new SqlBulkCopy(sqlConn, SqlBulkCopyOptions.TableLock, sqlConn.BeginTransaction());
bulkCopy.DestinationTableName = "TABLE1";
bulkCopy.ColumnMappings.Clear();
foreach (DataColumn col in dt.Columns)
{
    bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(col.ColumnName, col.ColumnName));
}

bulkCopy.WriteToServer(dt);
sqlConn.Close();

それを介してデバッグすると、すべて問題ないように見えますが、WriteToServer 関数が呼び出された後、データベースにデータが追加されません。列マッピングをリセットしないようにしましたが、IDENTITY 列が原因でエラーが発生します。他に何が間違っているのかわかりません。

4

1 に答える 1

7

トランザクションをコミットしていないようです。開始したトランザクションへの参照を保存し、コミットする必要があります。

var transaction = sqlConn.BeginTransaction();
SqlBulkCopy bulkCopy = new SqlBulkCopy(
    sqlConn,
    SqlBulkCopyOptions.TableLock, 
    transaction
);

その後

transaction.Commit();

一括コピーを実行するための呼び出しの後、接続を閉じる前。

于 2013-07-17T21:25:01.913 に答える