我试图在运行时传递代码中要检查的列名和值。但是我收到“无效的列名称”异常。 代码如下:
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();
答案 0 :(得分:14)
消息显示表中没有名为“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'
必须有一个例外,说没有名为eirghoerihgoh
的列。由于你没有得到那个例外,只有一个可能的解释:声明改为
Select * from Employee Where 'eirghoerihgoh' = 'Sagar'
并执行,但不返回结果,因为条件总是false
。
答案 1 :(得分:0)
原因很简单,在SQL中指定的值应该是单引号,这是一个简单的错误.. !!!!
SqlCommand com = new SqlCommand("Select * from Employee Where @field = 'Sagar'", con);
甚至将参数更改为以下行中的“field”而不是“@field”.. !!
com.Parameters.AddWithValue("field", DropDownList1.SelectedValue.ToString());
这是有效的..> !!!!
答案 2 :(得分:0)
相反,您可以通过这种方式制作代码,完美无缺:
"Select * from Employee Where "+DropDownList1.SelectedValue.ToString()+" =
'Sagar'" – Vidhya Sagar Reddy