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

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

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; 

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

 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; 

另外你为什么要抓住所有exception并抛弃它们,这是一个可怕的事情。 如果你有一个exception,你认为首先要看你是否可以重构你的代码来检查导致它的输入值而不是抛出它(甚至可能抛出你自己的ArgumentException ),如果你不能那样做那么检查那个特定的例外,而不是每个可能的例外。

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

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

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