我有一个C#函数,它通过一个带有100多个参数的存储过程将数据保存到SQL-server。 (是的,我知道,这可能不是一个好的设计,但遗留的代码,不能在这里进入。); - )
出于某种原因,此代码现在出现此错误:
System.Data.SqlClient.SqlException was unhandled
Message=Error converting data type int to tinyint.
现在,我首先看了参数和变量对,并没有明显的罪魁祸首。 (参数有许多数据类型,而不仅仅是tinyint)
那么确定流氓变量的最快方法是什么?有没有人知道一个好的方法来主动处理这个问题,让c#-side在运行时对参数验证变量 - 或以某种方式扩展错误消息以确切地告诉哪个参数失败?
现阶段不能选择实施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);
}
}
答案 0 :(得分:0)
我要做的是用存根替换proc。
然后我将二分之一的参数切成足够长以应对int。如果错误消失了,我只会将二进制文件切成一半,然后再次检查。如果错误没有消失那么我会做另一半。
我怀疑最多不到10次尝试才能找到它。