2012-08-13 51 views
0

我遇到了使用DataAdapter的問題,我希望有人可以幫忙。基本上我創建一個系統,該系統如下:DataAdapter沒有更新源文件

  1. 數據從一個數據源(MS-訪問時,SQL Server或Excel)中讀入,轉換成數據表和插入到本地SQL Server數據庫,使用DataAdapters。這一點工作正常。 SQL服務器表中有一個PK,它是一個自動增量設置爲on的標識字段。
  2. 後續數據加載從源數據中讀取數據,並將其與我們已有的數據進行比較。如果記錄丟失,那麼它被添加(這工作正常)。如果記錄不同,則需要更新(這不起作用)。
  3. 在執行差分數據加載時,我創建一個數據表,它從目標表(SQL服務器)讀取模式並確保它具有相同的列等。
  4. 目標表中的PK是列0當一個記錄被插入時,第1列以後的所有值都被設置(如上所述,這是完美的)。我不會更改我添加的項目的行狀態。數據表中的PK設置正確,我可以證實這一點。
  5. 更新數據時,我將第0列(PK列)設置爲我正在更新的記錄的值,並將所有列設置爲與源數據相同。
  6. 對於更新的記錄,我在行上調用AcceptChanges和SetModified以確保(我認爲)應用程序調用正確的方法。
  7. 使用命令生成器,使用SelectCommand和UpdateCommand設置DataAdapter。

當我運行時,我使用SQL事件探查器來追蹤它,並可以看到insert命令正在正確運行,但更新命令根本沒有運行,這是問題的關鍵。作爲參考插入表看起來像下面

PK Value1 Value 2 Row State 
== ====== ======= ========= 
124 Test1  Test 2 Added 
123 Test3  Test4  Updated 

幾件事情要注意的....

  • 我已經通過加載行測試,將其改變成數據表,改變一些列字段和運行更新,這個工程。然而,這對於我的解決方案來說是不切實際的,因爲數據是巨大的> 1Gb,所以我不能簡單地將它加載到數據表中,而不會造成巨大的性能影響。我正在做的是創建最多500行的數據表並運行更新。在初始數據加載期間進行的測試表明,這在內存使用率和性能方面最爲有效。數據表在每批運行後清空。

任何有關我要去哪裏的錯誤的任何想法在這裏?

在此先感謝

安德魯

==========更新==============

以下是代碼創建

private static void AddNewRecordToDataTable(DbDataReader pReader, ref DataTable pUpdateDataTable) 
    { 

     // create a new row in the table 

     DataRow pUpdateRow = pUpdateDataTable.NewRow(); 

     // loop through each item in the data reader - setting all the columns apart from the PK 

     for (int addCount = 0; addCount < pReader.FieldCount; addCount++) 
     { 
      pUpdateRow[addCount + 1] = pReader[addCount]; 
     } 

     // add the row to the update table 

     pUpdateDataTable.Rows.Add(pUpdateRow); 

    } 

    private static void AddUpdateRecordToDataTable(DbDataReader pReader, int pKeyValue, 
                ref DataTable pUpdateDataTable) 
    { 
     DataRow pUpdateRow = pUpdateDataTable.NewRow(); 

     // set the first column (PK) to the value passed in 

     pUpdateRow[0] = pKeyValue; 

     // loop for each row apart from the PK row 

     for (int addCount = 0; addCount < pReader.FieldCount; addCount++) 
     { 
      pUpdateRow[addCount + 1] = pReader[addCount]; 
     } 

     // add the row to the table and then update it 

     pUpdateDataTable.Rows.Add(pUpdateRow); 
     pUpdateRow.AcceptChanges(); 
     pUpdateRow.SetModified(); 
    } 

下面的代碼是用來插入/更新行實際上做了更新:​​

updateAdapter.Fill(UpdateTable); 
    updateAdapter.Update(UpdateTable); 
    UpdateTable.AcceptChanges(); 

下面是用於創建數據表,以確保它具有相同的字段/數據類型爲源數據

private static DataTable CreateDataTable(DbDataReader pReader) 
    { 
     DataTable schemaTable = pReader.GetSchemaTable(); 
     DataTable resultTable = new DataTable(<tableName>); // edited out personal info 
     // loop for each row in the schema table 

     try 
     { 

      foreach (DataRow dataRow in schemaTable.Rows) 
      { 

       // create a new DataColumn object and set values depending 
       // on the current DataRows values 

       DataColumn dataColumn = new DataColumn(); 
       dataColumn.ColumnName = dataRow["ColumnName"].ToString(); 
       dataColumn.DataType = Type.GetType(dataRow["DataType"].ToString()); 
       dataColumn.ReadOnly = (bool)dataRow["IsReadOnly"]; 
       dataColumn.AutoIncrement = (bool)dataRow["IsAutoIncrement"]; 
       dataColumn.Unique = (bool)dataRow["IsUnique"]; 

       resultTable.Columns.Add(dataColumn); 
      } 
     } 
     catch (Exception ex) 
     { 
      message = "Unable to create data table " + ex.Message; 
      throw new Exception(message, ex); 
     } 

     return resultTable; 
    } 
+0

作爲參考,這是爲3次修改和3所添加的數據表狀態(第1欄是PK) 238281;變形 238298;變形 238306;變形 238307;增加 238308;增加了 238309;增加了 – Andrew 2012-08-13 10:59:52

+0

有些代碼可以幫助我們識別問題。 – 2012-08-13 12:56:52

+0

編輯過的帖子以包含代碼 – Andrew 2012-08-13 13:20:58

回答

0

如果有人有興趣我還是設法避開這一問題,但從來沒有成功讓數據適配器工作。基本上,我所做的就是如下:

  • 創建索引和成員
  • 讀入行的字段值的列表對象的列表已經改變和存儲從源數據中的值(即該值將覆蓋對象中的當前值)。此外,我創建一個逗號分隔的索引列表
  • 當我完成了我用的是逗號分隔的列表在SQL IN語句返回的行並將其加載到我的數據適配器
  • 對於每一個我運行一個LINQ查詢索引並提取新值,更新數據集。這將行狀態設置爲已修改
  • 然後,我運行更新並正確更新行。

這不是最快或最好的解決方案,但它確實有效,並允許我在批處理中運行更改。

由於

安德魯