2

我正在尝试从 .net 执行 SQL Server 存储过程。我收到错误

将数据类型数字转换为十进制时出错

但我很难确定哪个 SQL 参数是罪魁祸首。

有 70 个,所以我确信有比手动搜索更简单的方法。

它是否在异常框中的某个地方,在“查看详细信息”中?提前致谢..

相关代码(希望这会有所帮助......我没有包含所有参数,但这是模式):

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();
         }
     }
}
4

3 回答 3

1

您可以从 Visual Studio 调试 Sql Server 存储过程。这是有关如何执行此操作的知识库文章。也许那时您很容易找出哪个参数有问题

于 2012-07-31T15:06:04.440 回答
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 Server的参数。您还可以使用 SQL 探查器提供的其他调试信息。

3) 并非所有参数都是十进制的。假设您有一个 20 - 30% 十进制参数的经典案例,这将相当于 14 - 20 个参数。有时,值得手动检查它们。

于 2012-07-31T15:49:24.933 回答
1

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

于 2012-07-31T16:17:52.637 回答