Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何找到在.net中引发异常的sql server参数?_C#_.net_Sql Server - Fatal编程技术网

C# 如何找到在.net中引发异常的sql server参数?

C# 如何找到在.net中引发异常的sql server参数?,c#,.net,sql-server,C#,.net,Sql Server,我正在尝试从.net执行SQL Server存储过程。我发现了错误 将数据类型数字转换为十进制时出错 但我很难确定哪个SQL参数是罪魁祸首 有70个,所以我相信有比手动搜索更简单的方法 它是否在“查看详细信息”的例外框中的某个位置?请提前感谢 相关代码(希望这是有帮助的…我没有包括所有参数,但这是模式): public void WriteKeyStatToDB(KeyStatisticsDataCollection.KeyStatsDP) { SqlParameter symbol=SqlPa

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

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

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

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

它是否在“查看详细信息”的例外框中的某个位置?请提前感谢

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

public void WriteKeyStatToDB(KeyStatisticsDataCollection.KeyStatsDP)
{
SqlParameter symbol=SqlParameterFactory(“@symbol”,SqlParamInOrOut.Input,SqlDbType.Char);
SqlParameter DateAdd=SqlParameterFactory(“@DateAdd”,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 sqlParams=新列表{symbol,dateAdded,tradeDate,marketCapIntra,entVal,trailingPE,forwardPE};
ExecuteSproc(“spAddKeyStatDP”、sqlParams、SqlConnection);
}
私有静态SqlParameter SqlParameterFactory(字符串ParamName、SqlParamInOrOut方向、,
SqlDbType(SqlType)
{
SqlParameter param=新的SqlParameter
{
ParameterName=ParamName,
SqlDbType=SqlType
};
if(Direction==sqlparaminorut.Input)
参数方向=参数方向输入;
其他的
参数方向=参数方向输出;
返回参数;
}
私有静态void ExecuteSproc(String CommandName,List ParamList,SqlConnection SqlConn,int Timeout=0)
{
使用(SqlCommand cmd=newsqlcommand(CommandName,SqlConn))
{
cmd.CommandType=CommandType.storedProcess;
foreach(参数列表中的SqlParameter sp)
{
如果(sp.Value==null)
sp.Value=DBNull.Value;
cmd.Parameters.Add(sp);
}
cmd.CommandTimeout=超时;
cmd.ExecuteNonQuery();
}
}
}

您可以从Visual Studio调试Sql Server存储过程。下面是一篇如何做的文章。也许这样您就可以很容易地找出哪个参数出错了

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

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

让我们看看一些代码。我假设您正在将存储过程的结果读入某个类?问题很可能是sql,而不是.net,因为numeric和decimal是DB类型。您是使用存储的进程返回数据还是更改数据?是否有任何计算值。无论是输入参数还是计算结果都需要确定。@Ryan谢谢,我在上面添加了代码,希望能有所帮助。正如您将看到的,它正在将一个类实例作为记录添加到数据库中。@Jason我正在将数据添加到数据库中。我确信问题是其中一个参数中的一个模糊值,我只想用“简单”的方法找到违规者。你真的有一个包含70个参数的存储过程吗?也许是时候考虑改写……-
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();