7

次のコードに問題があります。List<SqlParameter>次のコードを実行するメソッドにパラメーター ( ) を渡しています。

実行すると、SQL Server は、proc が指定されていないパラメーターを予期していることを示すエラーをスローします。私はこのエラーを知っており、理解しています。コードをステップ実行すると、cmdExecuteReaderオブジェクトに正しい名前と値を持つパラメーターのコレクションがあることがわかります。何が問題なのですか?

     public SqlDataReader ExecuteReader(string storedProcedure, List<SqlParameter> parameters = null)
        {
                    SqlCommand cmdExecuteReader = new SqlCommand()
                    {
                        CommandType = System.Data.CommandType.Text,
                        Connection = conn,
                        CommandText = storedProcedure
                    };

                    if (parameters != null)
                    {
                        foreach (SqlParameter param in parameters)
                        {
                            cmdExecuteReader.Parameters.AddWithValue(param.ParameterName, param.Value);
                        }
                    }

                    if (conn.State == System.Data.ConnectionState.Closed)
                        conn.Open();
                    return cmdExecuteReader.ExecuteReader();
       }
4

2 に答える 2

10

パラメータのいずれかが に設定.Valueされていますか? nullその場合、それらは送信されません。試す:

cmdExecuteReader.Parameters.AddWithValue(param.ParameterName,
        param.Value ?? DBNull.Value);

(とのヌル合体に注意してくださいDBNull.Value

AddWithValueまた、 (文字列などの場合)の長さを使用するため、クエリプランの再利用に影響を与える可能性があることに注意してください。最大のパフォーマンスが必要な場合は、定義されたサイズでパラメーターを手動で設定することをお勧めします。

また、着信リストのパラメーターの一部は、入出力、出力、または結果になる可能性があることに注意してください。次のようなものに置き換えたいと思います。

SqlParameter newParam = cmdExecuteReader.Parameters.Add(
      param.ParameterName, param.SqlDbType, param.Size);
newParam.Value = param.Value ?? DBNull.Value;
newParam.Direction = param.Direction;
于 2010-05-06T11:37:19.663 に答える
0

私はあなたがやろうとしていることをしました、ここにいくつかの例があります:

public int ChangeState(int id, int stateId)
{
    return DbUtil.ExecuteNonQuerySp("changeDossierState", Cs, new { id, stateId });
}

public IEnumerable<Dossier> GetBy(int measuresetId, int measureId, DateTime month)
{
    return DbUtil.ExecuteReaderSp<Dossier>("getDossiers", Cs, new { measuresetId, measureId, month });
}

こちらをご覧になることをお勧めします

サンプルソリューションをダウンロードするには(DALサンプルプロジェクトが含まれている場合) http://valueinjecter.codeplex.com/

于 2010-08-23T21:11:26.210 に答える