gpt4 book ai didi

c# - 如何找到哪个 sql server 参数在 .net 中抛出异常?

转载 作者:行者123 更新时间:2023-11-30 22:26:28 25 4
gpt4 key购买 nike

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

Error converting data type numeric to decimal

但我很难确定哪个 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();
}
}
}

最佳答案

我在您的代码中没有看到 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 个参数。有时,手动检查它们是值得的。

关于c# - 如何找到哪个 sql server 参数在 .net 中抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11742485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com