【问题标题】:c# execute SqlCommand with Parameters in "using" code blockc#在“使用”代码块中执行带有参数的SqlCommand
【发布时间】:2013-08-19 14:49:15
【问题描述】:

我正在尝试通过“使用”代码块执行 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;

【问题讨论】:

  • @Corak 我确实在我的实际代码中记录了异常,但我没有看到代码的 sn-p 与手头的问题相关,所以我没有费心把它放进去跨度>

标签: c# sql sql-server using sqlcommand


【解决方案1】:

不要为此使用构造函数初始化。

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) ,如果您不能这样做,请检查该特定异常,而不是所有可能的异常。

【讨论】:

  • 我在我的实际代码中将它设置为 SqlException,我只是快速写出来
  • 我计划将错误转发到错误页面并稍后将其记录到数据库中,但现在我没有对异常进行太多处理
  • 那么至少把你的 catch 改成catch(SqlException ex) 并把throw new NotImplmentedException("Error logging not added", ex); 放在body 里。这样,如果确实发生了异常并且您忘记更新代码,您仍然可以收到它发生的通知。
  • 现在我在 div 中显示错误时抛出:errorDiv.InnerText = "Error: " + e.Message;
  • 将来,当您在这里提问时,如果您实际上正在记录错误,请在您的问题中添加类似 //(Snip) log the execption 的内容,否则您会因为丢弃异常而让每个人上下跳动.这个错误在新程序中很常见,所以很多人在看到这个坏习惯之前就特意改掉它。通过显示您进行日志记录但未将其包含在人们不会打扰您的问题中(我建议您也编辑您的原始问题)
【解决方案2】:

除了属性赋值之外,不可能使用对象初始化器,所以你应该像这样重写你的代码(这里只有相关部分):

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

【讨论】:

  • 好的,所以你不能在 using 块的初始化中指定它?
  • @Divide100,像Collection.Add 这样的表达式 - 没有。
【解决方案3】:

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

【讨论】:

  • 哦,是的,我现在明白了。我的错。 . .度过了漫长的一天。
猜你喜欢
  • 1970-01-01
  • 2019-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多