如何在.NET中找到引发异常的SQL Server参数?

3
我尝试在.NET中执行SQL Server存储过程,但出现以下错误:

Error converting data type numeric to decimal

我很难确定哪个SQL参数是罪魁祸首。由于一共有70个参数,所以我相信肯定有比手动搜索更简单的方法。 它是否会显示在异常框中的 “View Detail” 中呢?谢谢提前回答!相关代码如下(希望这对您有所帮助……我没有包含所有参数,但模式相同):
public void WriteKeyStatToDB(KeyStatisticsDataCollection.KeyStatsDP dp)
{
    SqlParameter symbol = SqlParameterFactory("@symbol", SqlParamInOrOut.Input, SqlDbType.Char);
    SqlParameter dateAdded = SqlParameterFactory("@dateAdded", SqlParamInOrOut.Input, SqlDbType.Date);
    SqlParameter tradeDate = SqlParameterFactory("@tradeDate", SqlParamInOrOut.Input, SqlDbType.Date);
    SqlParameter marketCapIntra = SqlParameterFactory("@marketCapIntra", SqlParamInOrOut.Input, SqlDbType.Money);
    SqlParameter entVal = SqlParameterFactory("@entVal", SqlParamInOrOut.Input, SqlDbType.Money);
    SqlParameter trailingPE = SqlParameterFactory("@trailingPE", SqlParamInOrOut.Input, SqlDbType.Decimal);
    SqlParameter forwardPE = SqlParameterFactory("@forwardPE", SqlParamInOrOut.Input, SqlDbType.Decimal);

    symbol.Value = dp.Symbol;
    dateAdded.Value = dp.TradeDate;
    tradeDate.Value = dp.TradeDate;
    marketCapIntra.Value = dp.MarketCapIntraDay;
    entVal.Value = dp.EntValue;
    trailingPE.Value = dp.TrailingPE;
    forwardPE.Value = dp.ForwardPE;

    List<SqlParameter> sqlParams = new List<SqlParameter> {symbol, dateAdded, tradeDate, marketCapIntra, entVal, trailingPE, forwardPE};

    ExecuteSproc("spAddKeyStatDP", sqlParams, SqlConnection);
}

private static SqlParameter SqlParameterFactory (String ParamName, SqlParamInOrOut Direction, 
    SqlDbType SqlType)
{
    SqlParameter param = new SqlParameter
    {
        ParameterName = ParamName,
        SqlDbType = SqlType
    };

    if (Direction == SqlParamInOrOut.Input)
        param.Direction = ParameterDirection.Input;
    else
        param.Direction = ParameterDirection.Output;

    return param;
}

private static void ExecuteSproc(String CommandName, List<SqlParameter> ParamList, SqlConnection SqlConn, int Timeout = 0)
{
    using (SqlCommand cmd = new SqlCommand(CommandName, SqlConn))
    {
        cmd.CommandType = CommandType.StoredProcedure;
        foreach (SqlParameter sp in ParamList)
        {
              if (sp.Value == null)
              sp.Value = DBNull.Value;
              cmd.Parameters.Add(sp);
         }

              cmd.CommandTimeout = Timeout;
              cmd.ExecuteNonQuery();
         }
     }
}

让我们看一些代码。我假设你正在将存储过程的结果读入某个类中? - Thelonias
问题很可能在 SQL 上,而不是 .NET,因为 Numeric 和 Decimal 是数据库类型。您是返回数据还是使用存储过程修改数据?是否存在计算值?无论是输入参数还是计算结果都需要确定。 - Jason Meckley
@Jason,我正在向数据库添加数据。我确定问题在于某个参数中的临时解决值,我只想找到“简单”的方法来找到罪犯。 - StatsViaCsh
你真的有一个需要70个参数的存储过程吗?也许是时候考虑重写一下了...;-) - CesarGon
@CesarGon 我确实需要。这是针对一个包含70列每日股市数据的表格的所有列。我很乐意听取建议。;) - StatsViaCsh
显示剩余3条评论
3个回答

1

我在你的代码中没有看到70个参数,但是假设你有70个,以下是一些调试指针。

1)由于这是一个十进制转换错误,并且假设最常见的情况是精度不足以支持您的值,您可以编写一个快速脚本并在SQL Server中运行它,以查看哪个参数出了问题。
未经测试下面是脚本:

StringBuilder sb = new StringBuilder();
            foreach (SqlParameter param in sqlParams)
            {
                sb.Append("declare " + param.ParameterName + " as " + param.SqlDbType + Environment.NewLine);
                sb.Append("set " + param.ParameterName + " = " + param.Value + Environment.NewLine);
            }
            string sqlTestString = sb.ToString();

2) 您可以使用SQL Profiler查看在执行期间传递给SQL服务器的参数。您还可以使用SQL Profiler提供的其他调试信息。

3) 并非所有参数都是十进制的。假设您有一个典型的情况,即20-30%的十进制参数,那将会有14-20个参数。有时,手动检查它们是值得的。


1

您可以从Visual Studio调试Sql Server存储过程。这里是知识库文章,介绍如何进行调试。也许这样您就能轻松找出哪个参数有问题了。


1
也许您可以设置参数的大小和比例,并检查哪个值导致了异常。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接