2017-07-16 69 views
0

我有這樣的代碼:SqlDataAdapter的更新錯誤原因

DataTable dataTable; 

// filling table with data from db, closing connection 
// modifying table 

// trying to save it 
// "some_table" is the same table data was loaded from 

var connection = new SqlConnection(some_connection_string); 
var dataAdapter = new SqlDataAdapter("select * from some_table", connection); 
var cbMar = new SqlCommandBuilder(dataAdapter); 
SqlTransaction transaction = null; 

dataAdapter.InsertCommand = cbMar.GetInsertCommand(); 
dataAdapter.UpdateCommand = cbMar.GetUpdateCommand(true); 
dataAdapter.DeleteCommand = cbMar.GetDeleteCommand(true); 

transaction = connection.BeginTransaction(); 

dataAdapter.InsertCommand.Transaction = transaction; 
dataAdapter.UpdateCommand.Transaction = transaction; 
dataAdapter.DeleteCommand.Transaction = transaction; 

dataAdapter.Update(dataTable); 

在這裏,在Update,我得到一個異常:

未能參數值從String到的Int32轉換。
System.Exception的{} System.FormatException

的InnerException:
輸入字符串的不正確的格式。
System.FormatException

據我瞭解,那是因爲我已經設置字符串值整數數據庫列。

問題:如何找到究竟哪個列和行導致此異常?

我能夠爲System.Data.dll生成.pdb文件,並且可以進入它,但是當我嘗試從System.Data.dll添加任何變量來觀看時,我收到一個錯誤,說它是優化出來。據我所知,System.Data.dll沒有調試版本。

+1

應該包含一個整數的DataGridCell之一的值不是整數 – Steve

+0

是的,我不知道。這裏的問題是,在這張表中我有幾千行和大約150列。很難全部檢查。有什麼方法可以自動找出錯誤來源嗎? – ilya

回答

1

正如在上面的評論中所解釋的那樣,問題可能是由網格中的單元格引起的,該單元格預期包含整數值,但不是。

爲了幫助您找到這行包含你可以爲RowUpdated用這樣的代碼

.... 
dataAdapter.RowUpdated += onUpdate; 
.... 


private void onUpdate(object sender, SqlRowUpdatedEventArgs e) 
{ 
    Console.WriteLine(e.Row[0]); 
    if (e.Errors != null) 
    { 
     Console.WriteLine(e.Errors.Message); 
     Console.WriteLine("At row with key=" + e.Row["somecolumntoidentifytherow"]); 
    } 
} 

添加事件處理程序到您的SqlDataAdapter在調試,你可以把一個斷點內如果塊,並期待無效細胞圍繞包含無效值的e.Row對象。 (現在你仍然有150列在itemarray看)。你確定提供這種數據牆對你的用戶是有用的嗎?

+0

謝謝,明天將嘗試此解決方案。關於用戶我不確定,我是開發人員,不是用戶,但有很多可用的列過濾器,列固定,快速導航到列等,所以,我相信每個用戶都可以根據自己的需要配置網格。 – ilya