關於SQl BulkCopy的問題

c# sqlbulkcopy sql-server sql-server-2005

我想知道如何同時進行批量插入和批量複製?我有2個表應該受批量複製的影響,因為它們彼此依賴。

所以我想要的是,如果在插入表1時記錄消失,它將被回滾,而表2永遠不會更新。此外,如果表1插入良好,而表2更新失敗,表1將回滾。

這可以通過批量複製完成嗎?

編輯

我應該提到我正在通過C#進行批量插入。

它看起來像這樣,但這是我一直在努力的一個例子。所以我不確定是否必須將其更改為存儲過程(不確定它的外觀和C#代碼的外觀)

private static void BatchBulkCopy()
{
    // Get the DataTable 
    DataTable dtInsertRows = GetDataTable();

    using (SqlBulkCopy sbc = new SqlBulkCopy(connectionString, SqlBulkCopyOptions.KeepIdentity))
    {
        sbc.DestinationTableName = "TBL_TEST_TEST";

        // Number of records to be processed in one go
        sbc.BatchSize = 500000;

        // Map the Source Column from DataTabel to the Destination Columns in SQL Server 2005 Person Table
        // sbc.ColumnMappings.Add("ID", "ID");
        sbc.ColumnMappings.Add("NAME", "NAME");

        // Number of records after which client has to be notified about its status
        sbc.NotifyAfter = dtInsertRows.Rows.Count;

        // Event that gets fired when NotifyAfter number of records are processed.
        sbc.SqlRowsCopied += new SqlRowsCopiedEventHandler(sbc_SqlRowsCopied);

        // Finally write to server
        sbc.WriteToServer(dtInsertRows);
        sbc.Close();
    }

}

一般承認的答案

我想知道如何同時進行批量插入和批量複製?我有2個表應該受批量複製的影響,因為它們彼此依賴。所以我想要的是,如果在插入表1時記錄消失,它將被回滾,而表2永遠不會更新。此外,如果表1插入良好,而表2更新失敗,表1將回滾。這可以通過批量複製完成嗎?

不 - SqlBulkCopy的重點是盡快將數據導入數據庫。它只會將數據轉儲到單個表中。

正常的用例是在導入後檢查該表,並開始“拆分”該數據並將其存儲到需要去的任何地方 - 通常是通過存儲過程(因為數據已經在服務器上,並且您希望將其分發給其他表 - 您不希望將所有數據提取回客戶端,檢查它,然後再將其發送回服務器。

SqlBulkCopy只抓取一堆數據並將其放入表中 - 非常快。它無法根據條件或條件將數據拆分為多個表。


熱門答案

您可以在用戶定義的事務中運行批量插入,所以執行以下操作:

BEGIN TRANSACTION MyDataLoad
BEGIN TRY

BULK INSERT ...

BULK INSERT ...

COMMIT TRANSACTJION MyDataLoad
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
END CATCH

但是,可能還有其他方法可以實現您的目標。在批量插入表之前,表是否為空?當你說表彼此依賴時,你的意思是你想強制執行外鍵約束嗎?



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