2010-07-01 62 views
3

我可以使用一些建議/想法。 我寫了一個控制檯應用程序,用於查詢MS Access中一個表格中的所有數據(我知道,但是我繼承了它)到一個SQL表格。它每天早上作爲計劃任務運行。兩個表格之間的字段不相同。目前,我從MS Access表中選擇所有數據,遍歷數據集並將每行插入到SQL表中。我也在這個過程中寫了一個快速的日誌文件。它有效,但速度並不快。我將不勝感激您的任何想法,您可能必須改進此過程。 謝謝!複製SQL數據的最快方法

回答

4

SqlBulkCopy Class

這是方式不是個別insert語句更快。

您必須爲主鍵增加自己的標識字段值。要做到這一點,首先搶你離開的最後一個標識字段值:

select top 1 id_customer from customers order by id_customer desc

然後通過你的DataSet增加的int變量,你循環。

或者您也可以使用GUID for primary key column。使用SqlBulkCopy的

示例代碼:

public static void BulkLoadDataTable(DataTable table, string destinationTable) 
{ 
    using (SqlBulkCopy bulkCopy = new SqlBulkCopy(_connectionString)) 
    { 
    bulkCopy.BulkCopyTimeout = 1200; 
    bulkCopy.DestinationTableName = destinationTable; 
    bulkCopy.WriteToServer(table); 
    } 
}

強類型數據表:

using System; 
using System.Data; 

public class CustomersDataTable : DataTable 
{ 
    public CustomersDataTable() : base() 
    { 
    base.TableName = "Customers"; 
    Columns.Add(new DataColumn("id_customer", typeof(int))); 
    Columns.Add(new DataColumn("first_name", typeof(string))); 
    Columns.Add(new DataColumn("last_name", typeof(string))); 
    Columns.Add(new DataColumn("active", typeof(bool))); 
    } 
}
+0

創建自己的主鍵只有在插入數百萬條記錄的極端情況下才需要。但是我同意John的觀點,即SqlBulkCopy是最好的選擇。 – Doug 2010-07-01 16:39:29

+0

看起來像BulkCopyClass是要走的路。但是,當字段屬性不匹配會發生什麼?例如,訪問中的字符串字段和SQL中的布爾字段。 – gnome 2010-07-01 16:54:04

+1

那麼你可以遍歷你的數據並按照你想要的方式在SQL Server中建立一個'DataTable',也就是'bool'的'bit'列。 SQL Server應該能夠將非類型化的DataTable中的數據點轉換爲模式中適當的類型,但是我個人會創建一個**強類型的DataTable **(見上文)。你也可以寫出一個.CSV和批量複製。在代碼中循環執行所有這些工作將花費相對較少的時間。主要的觀點是1000個單獨的'insert'語句會浪費**噸的時間! – JohnB 2010-07-01 17:13:23

1

你看着SSIS包?我會先看看。如果您沒有訪問權限,請查看此處提到的SqlBulkCopy類。

你也可以使用SELECT statement with an INSERT看看。

+0

使用INSERT的SELECT語句會很慢。 – JohnB 2010-07-01 20:02:19

+0

是的,但它仍然比單個插入更快。這將是我的最後一個選擇,但我想我會介紹這個選項。 SSIS將是我認爲的方式。 – knight0323 2010-07-01 20:39:27

+0

爲什麼在SELECT語句中使用INSERT進行批量插入會很慢? – 2010-07-01 23:42:05

相關問題