2

.netからSQLServerストアドプロシージャを実行しようとしています。エラーが発生します

データ型を数値から10進数に変換中にエラーが発生しました

しかし、どの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

あなたのコードには 70 個のパラメーターがありませんが、70 個あると仮定すると、デバッグするためのポインターがいくつかあります。

1) これは 10 進変換エラーであり、値をサポートするのに十分でない精度の最も一般的なケースを想定しているため、簡単なスクリプトを作成して SQL サーバーで実行し、どのエラーが発生しているかを確認できます。
以下の未テストのスクリプト:

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) すべてのパラメーターが 10 進数になるわけではありません。10 進パラメータが 20 ~ 30% の典型的なケースがあると仮定すると、14 ~ 20 個のパラメータになります。場合によっては、それらを手動で検査する価値があります。

于 2012-07-31T15:49:24.933 に答える
1

Visual Studio から Sql Server ストアド プロシージャをデバッグできます。これを行う方法のナレッジベースの記事は次のとおりです。おそらく、どのパラメーターに問題があったかを簡単に見つけることができます

于 2012-07-31T15:06:04.440 に答える
1

おそらく、パラメーターのサイズとスケールを設定し、どの値が例外を引き起こすかを確認できます

于 2012-07-31T16:17:52.637 に答える