1

我有一个 C# 函数,它通过一个带有 100 多个参数的存储过程将数据持久化到 SQL 服务器。(是的,我知道,这可能不是一个好的设计,而是遗留代码,我们不要在这里讨论。);-)

由于某种原因,这段代码现在出现了这个错误:

System.Data.SqlClient.SqlException was unhandled
  Message=Error converting data type int to tinyint.

现在,我首先查看了参数和变量对,没有明显的罪魁祸首。(参数有很多数据类型,不仅仅是tinyint)

那么确定流氓变量的最快方法是什么?有没有人知道主动处理这个问题的好方法,通过让 c# 端在运行时根据参数验证变量 - 或者以某种方式扩展错误消息以准确判断哪个参数失败?

在这个阶段实施 ORM 不是一个选项。


编辑:我已经开始编写一个函数CheckParameters,该函数最初将遍历参数并简单地列出参数和相应的值。我认为它可以通过不同数据类型的实际知识来扩展,但现在我只想帮助找到错误的变量。

结构如下:

        try
        {
            cmdStat.ExecuteNonQuery();
        }
        catch(SqlException)
        {
         CheckParameters(cmdStat.Parameters);   
         //re-throw 
        } 

        private void CheckParameters(SqlParameterCollection parameterCollection)
        {
          foreach (SqlParameter parameter in parameterCollection)
          {
            Trace.Write("{0}, {1}, {2}, {3}", parameter.ParameterName, parameter.DbType, parameter.SqlDbType, parameter.Value);
          }            
        }
4

1 回答 1

0

我要做的是用存根替换 proc。

然后我将二进制切掉一半的参数,使其足够长以应对 int。如果错误消失了,我只会将二进制切开一半,然后再次检查。如果错误没有消失,那么我会做另一半。

我怀疑最多需要不到 10 次尝试才能找到它。

于 2012-06-30T13:15:01.753 回答