SqlDataAdapter更新错误原因

时间:2017-07-16 09:51:39

标签: c# .net sql-server exception 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 个答案:

答案 0 :(得分:1)

正如上面的评论中所解释的那样,问题可能是由网格的单元格引起的,该单元格预计包含一个整数值,但实际上并非如此。

为了帮助您找到包含无效单元格的行,您可以使用此类代码将RowUpdated的事件处理程序添加到SqlDataAdapter

....
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"]);
    }
}

在调试时,您可以在if块中放置一个断点,并查看包含无效值的e.Row对象。 (现在你仍然需要在itemarray中查看150列)。您确定呈现这一数据墙对您的用户有什么用处吗?