在以下代码中获取"无效列名称"Sql异常

sag*_*wa1 0 c# sql asp.net

我试图在运行时传递代码中要检查的列名和值.但是我收到"无效的列名称"异常.代码如下:

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();
Run Code Online (Sandbox Code Playgroud)

Tho*_*mar 14

消息说表中没有名为"Sagar"的列.有这样一个栏目吗?如果您向我们展示表模式而不是让我们从错误消息中猜测,事情会更容易.


无法SqlParameter在C#中使用参数化列名.这已在此多次讨论过.

查询的方式Vidhya Sagar Reddy是如何进行的,如下所示.他假定以下查询

Select * from Employee Where @field = 'Sagar'
Run Code Online (Sandbox Code Playgroud)

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

Select * from Employee Where Name = 'Sagar'
Run Code Online (Sandbox Code Playgroud)

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

Select * from Employee Where 'Name' = 'Sagar'
Run Code Online (Sandbox Code Playgroud)

这不会返回任何结果,因为该WHERE子句始终是false.当然,如果你使用字段名称Sagar,这个akways返回true,因为语句然后读取:

Select * from Employee Where 'Sagar' = 'Sagar'
Run Code Online (Sandbox Code Playgroud)

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

com.Parameters.AddWithValue("@field", "eirghoerihgoh");
Run Code Online (Sandbox Code Playgroud)

如果查询正确执行(可能没有返回任何结果),则上述内容是正确的.如果不正确,则应该抛出eirghoerihgoh不存在的列的异常.


谢谢你Vidhya Sagar Reddy证明我的观点.通过使用此行

com.Parameters.AddWithValue("@field", "eirghoerihgoh");
Run Code Online (Sandbox Code Playgroud)

你说你没有得到任何结果,但你也没有得到例外.但是,如果声明确实已经改为

Select * from Employee Where eirghoerihgoh = 'Sagar'
Run Code Online (Sandbox Code Playgroud)

必须有一个例外,说没有列名eirghoerihgoh.由于你没有得到那个例外,只有一个可能的解释:声明改为

Select * from Employee Where 'eirghoerihgoh' = 'Sagar'
Run Code Online (Sandbox Code Playgroud)

这会执行,但不会返回结果,因为条件总是如此false.