3

'using' コード ブロックを使用して SQL コマンドを実行しようとしていますが、パラメーターで動作させることができないようです。「現在のコンテキストにパラメータが存在しません」というエラーが表示されます。この問題の解決策はありますか? Heres私のコード:

DataTable dt = new DataTable();
using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
using (var cmd = new SqlCommand(" SELECT FName" +
                                        " FROM EmployeeTable " +
                                        " WHERE EmployeeId = @empId",
                                        con)
                                        {
                                            Parameters.Add(new SqlParameter("@empId",empId))
                                        })
        {
            try
            {
                   con.open();
                   dt.Load(cmd.ExecuteReader());
            }
            catch(Exception ex)
            {
                 //(snip) Log Exceptions
            }
        }
        return dt;
4

3 に答える 3

4

これにはコンストラクターの初期化を使用しないでください。

DataTable dt = new DataTable();
using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString))
using (var cmd = new SqlCommand(" SELECT FName" +
                                        " FROM EmployeeTable " +
                                        " WHERE EmployeeId = @empId",
                                        con))
{
    cmd.Parameters.Add(new SqlParameter("@empId",empId));
    try
    {
           con.open();
           dt.Load(cmd.ExecuteReader());
    }
    catch(Exception) //BAD BAD BAD!!! Why are you doing this!
    {
    }
}
return dt;

また、なぜすべての例外をキャッチして破棄するのですか?これは恐ろしいことです。一般的であると思われる例外がある場合は、コードをリファクタリングして、それを引き起こす入力値をチェックし、それをまったくスローしないようにすることができるかどうかを確認します (おそらくArgumentException、独自の をスローすることさえあります)。それを行うことはできません。可能なすべての例外ではなく、その特定の例外を確認してください。

于 2013-08-19T14:53:04.163 に答える
2

プロパティの割り当て以外にオブジェクト初期化子を使用することは不可能であるため、コードを次のように書き直す必要があります (ここでは関連部分のみ)。

...
using (var cmd = new SqlCommand(" SELECT FName" +
                                        " FROM EmployeeTable " +
                                        " WHERE EmployeeId = @empId",
                                        con))
{
    cmd.Parameters.Add(new SqlParameter("@empId", empId));
...
于 2013-08-19T14:53:07.307 に答える
0

2 番目の using ステートメントは、try キャッチの前に閉じます。したがって、try catch に到達すると、using ブロックは既に閉じられています。したがって、パラメーターは不適切なスコープにあります。

于 2013-08-19T14:56:05.737 に答える