c#在“using”代码块中使用Parameters执行SqlCommand

时间:2013-08-19 14:49:15

标签: c# sql sql-server using sqlcommand

我试图通过'using'代码块执行SQL命令,但似乎无法使用它来使用Parameters。我收到错误:'参数在当前上下文中不存在',是否有人有这个问题的可能解决方案?继承人我的代码:

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;

3 个答案:

答案 0 :(得分: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如果你不能这样做那么检查那个特定的例外,而不是每个可能的例外。

答案 1 :(得分:2)

除了属性赋值之外,不可能将对象初始值设定项用于其他任何内容,因此您应该像这样重写代码(这里只是相关部分):

...
using (var cmd = new SqlCommand(" SELECT FName" +
                                        " FROM EmployeeTable " +
                                        " WHERE EmployeeId = @empId",
                                        con))
{
    cmd.Parameters.Add(new SqlParameter("@empId", empId));
...

答案 2 :(得分:0)

你的第二个using语句在try catch之前关闭。 因此,一旦达到try catch,则使用块已经关闭。因此,参数的范围不正确。