2011-05-11 53 views
2

與SQL CE這一個C#WPF應用程序作爲數據源:從數據表批量插入到數據源SQLCE

我有一個數據表(顯示爲數據網格)和一個SQL CE的數據源。 我使用DataAdapter,DataSet和DataTable從SQL CE填充我的DataTable。然後將我的DataGrid綁定到DataTable。

我可以將行(> 10,000)行添加到我的DataTable中,並可能在將所有更改全部傳播到我的Sql CE數據源之前編輯了數據。

我目前的做法是DROP TABLE,CREATE TABLE,並通過蠻力重新插入行到SQLCE。 SQL CE沒有批量插入,我不想使用第三個庫或DLL。性能很慢...

我正在尋找或更快的方式來「批量插入」,而無需刪除,創建和逐行插入行。

我讀了一些關於SqlCeResultSet的內容,但我找不到任何文檔,並想知道它與我正在嘗試做什麼有關。

[編輯]
繼答案,並在此覈對:
http://ruudvanderlinden.com/2010/10/13/bulk-insert-into-sql-ce-in-c/

我想使用的功能,但它似乎沒有工作。 以下是我的代碼。 Footable是我的數據庫表,我有兩列 - 「id」和「FooName」。

Hashtable idHash = new Hashtable(); 
Hashtable fooNameHash = new Hashtable(); 
foreach(DataRow row in dt.Rows) 
{ 
    idHash.Add("id",row["id"]); 
    fooNameHash.Add("FooName",row["FooName"]); 
} 

List<Hashtable> colHashList = new List<Hashtable>(); 
colHashList.Add(idHash); 
colHashList.Add(fooNameHash); 

BulkInsertDatabase(colHashList, "FooTable"); 

它沒有工作,但我看不出有什麼問題,我上面的代碼,所以希望有人可以點出來..

[編輯 - 2] [答案]
最後我得到的代碼工作(儘管懷疑與性能):

List<Hashtable> colHashList = new List<Hashtable>(); 

Hashtable[] idHash = new Hashtable[dt.Rows.Count]; 
Hashtable[] fooNameHash = new Hashtable[dt.Rows.Count]; 

int i=0; 
foreach(DataRow row in dt.Rows) 
{ 
    idHash[i] = new Hashtable(); 
    idHash[i].Add("id", row["id"]); 
    colHashList.Add(idHash[i]); 

    fooNameHash[i] = new Hashtable(); 
    fooNameHash[i].Add("FooName", row["FooName"]); 
    colHashList.Add(fooNameHash[i]); 

    i++; 
} 

BulkInsertDatabase(colHashList, "FooTable"); 
+0

您的> 10K記錄是否包含更新記錄和新記錄?或者只是一個新增的記錄? – 2011-05-11 08:50:22

+0

@Peyton Crow - 記錄包含更新記錄和新記錄。但是在插入之前,我會在SQL CE中刪除,創建和清空表。因此,我會將所有DataTable記錄視爲新添加的。 – KMC 2011-05-11 10:17:40

回答

3

您應該使用SqlCeResultSet Class

它允許批量導入在SQL CE數據庫我已經導入10萬排在10秒作爲一個 看看example

+0

我編輯了我的代碼。該教程是否適合你,或者你是如何讓你的工作? – KMC 2011-05-11 11:34:24

+0

在晚上我會找到我的代碼並告訴你 – Serghei 2011-05-11 12:31:33

+0

我找到了我從中複製代碼的文章,您可以使用本文中的示例實現批量插入http://msdn.microsoft.com/en-us/library /dd938877.aspx#CodingRecordInsertionLogic – Serghei 2011-05-15 08:17:09

0

你可以從我的批量插入庫這裏使用C#代碼:http://sqlcebulkcopy.codeplex.com

+0

我沒有看到任何源代碼。只是可供下載的dll版本不同。 – kingchris 2015-09-16 08:05:29

+0

您是否嘗試過「源代碼」選項卡? – ErikEJ 2015-09-16 13:09:08

+0

啊,尷尬的時刻沒有56.謝謝 – kingchris 2015-09-22 04:12:19

0

其工作,試試這個。

public bool CopyDataTableToTable(DataTable dataTable, string tableName, bool deleteTable) 
     { 
      Boolean returnValue = true; 
      if (sqlCeConnection.State == ConnectionState.Closed) 
       sqlCeConnection.Open(); 

      SqlCeTransaction transaction = sqlCeConnection.BeginTransaction(); 
      SqlCeCommand cmd = sqlCeConnection.CreateCommand(); 
      SqlCeResultSet rs = null; 
      try 
      { 
       if (deleteTable) 
       { 
        cmd.Transaction = transaction; 
        cmd.CommandText = "DELETE " + tableName; 
        cmd.ExecuteNonQuery(); 
       } 

       cmd.CommandType = System.Data.CommandType.TableDirect; 
       cmd.CommandText = tableName; 
       rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable); 

       for (int i = 0; i < dataTable.Rows.Count; i++) 
       { 
        SqlCeUpdatableRecord rec = rs.CreateRecord(); 
        DataRow row = dataTable.Rows[i]; 
        for (int k = 0; k < dataTable.Columns.Count - 1; k++) 
        { 
         rec.SetValue(k + 1, row[k]); 
        } 
        rs.Insert(rec); 
       } 
       transaction.Commit(); 
      } 

      catch (Exception ex) 
      { 
       returnValue = false; 
       transaction.Rollback(); 
      } 
      finally 
      { 
       rs.Close(); 
       if (sqlCeConnection.State == ConnectionState.Open) 
        sqlCeConnection.Close(); 

      } 
      return returnValue; 
     }