在以下代码中获取"无效的列名"SQL 异常



我正在尝试在运行时传递要在代码中检查的列名和值。但是,我得到了一个"无效列名"异常。代码如下:

string temp = TextBox1.Text.ToString();
SqlConnection con = new SqlConnection("data source=.\SQLEXPRESS;AttachDbFilename=C:\Users\Sagar\Documents\Test.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");
SqlCommand com = new SqlCommand("Select * from Employee Where @field = Sagar", con);
com.Parameters.AddWithValue("@field", DropDownList1.SelectedValue.ToString());
//com.Parameters.AddWithValue("@value", temp);
SqlDataAdapter da = new SqlDataAdapter(com);
con.Open();
SqlDataReader reader = com.ExecuteReader();
GridView1.DataSource = reader;
GridView1.DataBind();

消息显示表中没有名为"Sagar"的列。有这样的专栏吗?如果您向我们展示表模式,而不是让我们根据错误消息进行猜测,事情会更容易。


在C#中无法使用SqlParameter参数化列名。这已经在这里讨论过多次了

以下是Vidhya Sagar Reddy执行查询的方式。他假设以下查询

Select * from Employee Where @field = 'Sagar'

当将"Name"设置为@field参数的值时,被此查询替换:

Select * from Employee Where Name = 'Sagar'

然而,这是错误的发生的情况是@field参数被替换如下:

Select * from Employee Where 'Name' = 'Sagar'

这不会返回任何结果,因为WHERE子句始终是false。当然,如果您使用字段名Sagar,这akways会返回true,因为语句会显示:

Select * from Employee Where 'Sagar' = 'Sagar'

这里有一个简单的测试来证明我上面所说的。使用以下语句设置@field参数(假设表中没有名为eirghoerihgoh的列):

com.Parameters.AddWithValue("@field", "eirghoerihgoh");

如果查询执行正确(可能没有返回任何结果),则以上内容是正确的。如果不正确,则应引发关于eirghoerihgoh列不存在的异常。


感谢Vidhya Sagar Reddy证明了我的观点。通过使用这条线路

com.Parameters.AddWithValue("@field", "eirghoerihgoh");

你说你没有得到任何结果,但你也没有得到例外。然而,如果该声明真的被更改为

Select * from Employee Where eirghoerihgoh = 'Sagar'

必须有一个例外,即没有名为CCD_ 14的列。由于你没有得到这个例外,只有一个可能的解释:声明被更改为

Select * from Employee Where 'eirghoerihgoh' = 'Sagar'

这会执行,但不会返回结果,因为条件始终是false

相反,您可以用这种方式编写代码,它可以完美地工作:

"Select * from Employee Where "+DropDownList1.SelectedValue.ToString()+" =
'Sagar'" – Vidhya Sagar Reddy

原因很简单,要在SQL中指定的值应该用单引号,顺便说一句,这是一个简单的错误。。!!!!

SqlCommand com = new SqlCommand("Select * from Employee Where @field = 'Sagar'", con);

甚至在下一行将参数更改为"field",而不是"@field"。。!!

com.Parameters.AddWithValue("field", DropDownList1.SelectedValue.ToString());

这是有效的..>!!!!

最新更新