我有这样的代码:
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没有调试版本。
答案 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列)。您确定呈现这一数据墙对您的用户有什么用处吗?