0
我遇到了使用DataAdapter的問題,我希望有人可以幫忙。基本上我創建一個系統,該系統如下:DataAdapter沒有更新源文件
- 數據從一個數據源(MS-訪問時,SQL Server或Excel)中讀入,轉換成數據表和插入到本地SQL Server數據庫,使用DataAdapters。這一點工作正常。 SQL服務器表中有一個PK,它是一個自動增量設置爲on的標識字段。
- 後續數據加載從源數據中讀取數據,並將其與我們已有的數據進行比較。如果記錄丟失,那麼它被添加(這工作正常)。如果記錄不同,則需要更新(這不起作用)。
- 在執行差分數據加載時,我創建一個數據表,它從目標表(SQL服務器)讀取模式並確保它具有相同的列等。
- 目標表中的PK是列0當一個記錄被插入時,第1列以後的所有值都被設置(如上所述,這是完美的)。我不會更改我添加的項目的行狀態。數據表中的PK設置正確,我可以證實這一點。
- 更新數據時,我將第0列(PK列)設置爲我正在更新的記錄的值,並將所有列設置爲與源數據相同。
- 對於更新的記錄,我在行上調用AcceptChanges和SetModified以確保(我認爲)應用程序調用正確的方法。
- 使用命令生成器,使用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;
}
作爲參考,這是爲3次修改和3所添加的數據表狀態(第1欄是PK) 238281;變形 238298;變形 238306;變形 238307;增加 238308;增加了 238309;增加了 – Andrew 2012-08-13 10:59:52
有些代碼可以幫助我們識別問題。 – 2012-08-13 12:56:52
編輯過的帖子以包含代碼 – Andrew 2012-08-13 13:20:58