#vb.net #visual-studio-2008 #sql-server-2008
#vb.net #visual-studio-2008 #sql-server-2008
Вопрос:
Я хочу найти текст в текстовом поле в моей базе данных. Я написал приведенный ниже код. Он хорошо находит числа, но когда я хочу найти строки, он выдает ошибку времени выполнения: invalid column name for example aaa
, но aaa существует в столбце 1 в моей таблице.
Что вы думаете о проблеме?
cmd = New SqlCommand("select * from tbl where column1=" TextBox1.Text)
cmd.CommandType = CommandType.Text
cmd.Connection = cnn
dad.SelectCommand = cmd
cmd.ExecuteNonQuery()
dad.Fill(ds)
dgv.DataSource = ds.Tables(0)
Комментарии:
1. Разверните код, подобный этому, и это только вопрос времени (и, вероятно, не так много), пока кто-нибудь не получит доступ к вашей базе данных.
Ответ №1:
Это потому, что отправляемый вами оператор sql не разделяет TextBox1.Text
значение, поэтому в итоге вы получаете этот sql:
select * from tbl where column1 = aaa
и SQL Server обрабатывает aaa
как имя столбца.
Независимо от этого, вы должны использовать a SqlParameter
, чтобы избежать атак sql-инъекций:
cmd = New SqlCommand("select * from tbl where column1=@value")
cmd.CommandType = CommandType.Text
cmd.Paramaters.AddWithValue("@value", TextBox1.Text)
VB не является моим основным языком, поэтому синтаксис может быть немного неточным, но вы должны быть в состоянии заставить его работать.
Ответ №2:
Адритт прав, вы должны заключить текст для поиска в одинарные кавычки, и, при условии, что сам текст не содержит одинарных кавычек, все хорошо для риска SQL-атак.
При этом вы используете устаревший, устаревший способ кодирования вашего приложения для базы данных.
Вы должны окончательно изучить технологию LINQ, где:
- У вас нет подключения для открытия или закрытия: его автоматическое
- Вам не нужно иметь дело с кавычками, crlf и запятыми
- Вы не рискуете SQL-атаками: запросы параметризуются механизмом LINQ
- Вы получите выгоду от intellisense в отношении объектов базы данных: таблиц, представлений, столбцов
- Вы получаете простой результат для использования в качестве источника данных!
- Для инструкций INSERT и UPDATE транзакции включаются автоматически.
Пример:
using ctx as new dataContext1
dim result = from r in ctx.tbl
where r.column1 = textBox1.text
dgv.datasource = result.tolist
end using
IntelliSense:
- Когда вы вводите «ctx.», вам будет представлен список доступных таблиц!
- Когда вы вводите «r». вам будет представлен список столбцов, которые содержит таблица (или vieww)!
LINQ не сложен в освоении, и вы найдете множество примеров, которые помогут вам, здесь и там в Интернете.
И последнее, но не менее важное: вы можете использовать синтаксис, подобный LINQ SQL, для запроса XML-данных, CSV-файлов, электронных таблиц Excel и даже элементов управления в вашей форме или документе HTML DOM в ASP.NET !