3

我正在尝试通过“使用”代码块执行 SQL 命令,但似乎无法使其与参数一起使用。我收到错误消息:“当前上下文中不存在参数”,有没有人可以解决这个问题?这是我的代码:

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

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

于 2013-08-19T14:56:05.737 回答