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