我有一个 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);
}
}