我正在尝试从.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();
}
}
}
答案 0 :(得分:1)
您可以从Visual Studio调试Sql Server存储过程。这是Knowledge Base如何做到的文章。也许那时你很容易找出哪个参数有问题
答案 1 :(得分: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事件探查器查看在执行期间传递给SQL服务器的参数。您还可以使用SQL事件探查器提供的其他调试信息。
3)并非所有参数都是十进制的。假设你有一个20-30%十进制参数的经典案例,那将达到14-20个参数。有时,值得手动检查它们。
答案 2 :(得分:1)
也许您可以设置参数的大小和比例,并检查哪个值导致异常