2013-07-16 4 views
0

Я пытаюсь передать как имя столбца, так и значение, подлежащее проверке в коде во время выполнения. Однако я получаю исключение «Недопустимое имя столбца». код выглядит следующим образом:Получение «Недопустимое имя столбца» Исключение 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(); 
+1

Без вашей базы данных/схемы таблицы нет никакого способа, кто не может ответить на этот вопрос, в стороне от повторения сообщений об ошибке, как @ThorstenDittmar имеет –

+1

I редактировали свой заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

0

Вместо этого, вы можете сделать свой код таким способом, который работает отлично:

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

Спасибо, это работает! Я не знаю, почему он не работал раньше, когда я попробовал. Может быть, потому, что я добавил @ в функцию AddWithValue. – sagarwadhwa1

+3

@ sagarwadhwa1: Нет, это не причина! Вы прочитали мой ответ и комментарии? –

+0

Это не очень хороший способ создания запросов, очень подверженных SQL-инъекциям. – FailedUnitTest

12

В сообщении говорится, что нет столбца с именем «Сагар» в таблице. Есть ли такая колонна? Все будет проще, если вы предложите нам схему таблиц вместо того, чтобы нас угадать из сообщения об ошибке.


Это не представляется возможным параметризацию имена столбцов, используя SqlParameter в C#. Это обсуждалось здесь несколько раз.

Что происходит с запросом, как это делает 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.


Thank you Vidhya Sagar Reddy для подтверждения моей точки зрения. По этой линии

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

Вы говорите, что результатов не получилось, но вы также не получили исключения. Однако, если заявление действительно было изменено на

Select * from Employee Where eirghoerihgoh = 'Sagar' 

там должны были быть исключением сказать, что не было никакого столбца с именем eirghoerihgoh. Как вы не получите это исключение, есть только один из возможных объяснений: Заявление было изменено на

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

и это выполняется, но не возвращает результаты, так как условие всегда false.

+0

Сагар - это значение, кстати там, а не столбец ... !!!! –

+0

Нет, это не так - по крайней мере, в вашем запросе. Строковые значения должны быть заключены в одинарные кавычки ('). Вот почему вы получаете ошибку. Вы можете * не параметризовать имя столбца *! –

+0

Мы можем параметризовать .. !! Кстати проверить код один раз ... –

0

Причина этого проста, значение, которое должно быть указано в SQL, должно быть в одинарных кавычках, и это простая ошибка кстати .. !!!!

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

И даже измените параметр на «поле» в следующей строке, а не на «@field» .. !!

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

Это работает ..> !!!!

+2

Я сомневаюсь, потому что ** вы не можете параметризовать имя столбца **! Готов поспорить, теперь вы получаете * все строки *, если вы установите '@ field' в' 'Sagar'', так как тогда запрос' SELECT * FROM Employee WHERE 'Sagar' = 'Sagar'' и возвращает все строки. Легкий тест: выберите другой элемент из своего комбинированного поля, который не читает «Сагар». Уверен, у вас нет строк. –

+0

@ThorstenDittmar: Есть ли способ передать имя столбца и динамически выбирать его во время выполнения? Может быть, через Dynamic SQL? Мой метод принимает оба значения как значения строк. – sagarwadhwa1

+2

Вместо этого вы можете сделать свой код таким образом, который отлично работает: «Выберите * from Employee Where» + DropDownList1.SelectedValue.ToString() + "= 'Sagar'" –

Смежные вопросы