2009-06-16 2 views
1

Может ли кто-нибудь сообщить мне, что не так с моим SQL-заявлением, и как я могу его улучшить?Помогите мне исправить это заявление SQL?

da = new SqlDataAdapter("SELECT * FROM Guests"+" WHERE Students.name='" + 
    byNametextBox.Text + "'", MyConn); 
+0

Выглядит хорошо для меня – rball

+2

Я полагаю, вы знаете, что SQL инъекции и этот пример только для этого вопроса? В противном случае выполните поиск по переполнению стека. – PQW

+1

SQL Injection, кто-нибудь? –

ответ

0
SqlDataAdapter("SELECT Guests.* FROM Guests,Students WHERE Guest.StudentId = Student.Id and Students.name='" + byNametextBox.Text + "'", MyConn);` 
+0

спасибо большое за вас – 2009-06-17 08:45:01

+0

А как насчет внедрения SQL? –

0

Вам необходимо внутреннее соединение. Я думаю, что это будет что-то вроде этого:

SELECT Guests.* FROM Guests INNER JOIN Students ON Students.name = Guests.name WHERE Students.name = '" + byNametextBox.Text + "'" 
+0

+1 для внутреннего соединения. –

+0

Что произойдет, если мое имя будет '; DROP TABLE Guests--? – LukeH

+2

Маленькие Bobby Tables - это то, что происходит. http://xkcd.com/327/ –

-1

Попробуйте:

"SELECT g.* 
FROM Guests g 
INNER JOIN Students s ON g.StudentId = s.StudentId 
WHERE Students.Name = '" + byNametextBox.Text + '"' 

Предполагая, что поле которым относится обе таблицы является StudentId.

Остерегайтесь того, что SQL не совпадает между разными Серверами. Этот оператор будет работать на Sql Server, я не знаю других. Кроме того, будьте осторожны, что вы не защищаете себя от атак SQL Injection. Вы должны выполнить свой запрос с параметрами, а не конкатенировать строки так, как вы это делаете.

Это простой запрос, который вы должны знать сами. Вы можете искать учебные пособия в Google, но here - это общее введение.

+0

Можете ли вы использовать SQLDataAdapter для чего-либо, кроме SQL Server? – JeffO

+0

@Guiness: Объекты Sql * (включая SqlDataAdapter) в System.Data.SqlClient предназначены для использования только с SQL Server. В пространствах System.Data.OleDb и System.Data.Odbc (например, OleDbDataAdapter и OdbcDataAdapter) существуют более общие объекты схожими именами, которые позволяют использовать те же функции с любой базой данных, в которой есть поставщик OLEDB или драйвер ODBC. Другие поставщики БД могут предоставить свои собственные сборки, которые обеспечивают аналогичную функциональность. –

+0

Я бы не показал ему «неправильный» способ сделать это. Покажите правильный путь.Кто-то может прийти и использовать ваш код, не понимая, что такое SQL Injection. –

4

Предикат EXISTS немного более эффективен, чем JOIN, если вы хотите использовать только столбцы из одной из таблиц. Дополнительные - никогда не вставляйте строки в SQL-инструкции, подобные этому, - вы просто попрошайки для атак SQL Injection или связанных с ними ошибок (да, я знаю, что это приложение Forms, но то же самое верно. Если вы ищете имя типа «О'Лири», вы получите крах).

SqlCommand cmd = new SqlCommand("SELECT * FROM Guests WHERE EXISTS (SELECT Id FROM Students WHERE Guests.StudentId = Students.Id And Students.name= @name)", MyConn); 
cmd.Parameters.Add("@name", SqlDbType.VarChar, 50).Value = byNametextBox.Text; 
SqlDataAdapter adapt = new SqlDataAdapter(cmd); 

Примечание: Некоторые люди могут утверждать, что «SELECT *» это плохо, и что вы должны рассмотреть с указанием названия отдельных столбцов

+0

+1 для использования параметров. –

1

Вам нужно беспокоиться о SQL Injection. Проще говоря, SQL Injection - это когда пользователь может помещать произвольные SQL-запросы в ваш запрос. Чтобы обойти это, используйте либо хранимую процедуру, либо параметризованный SQL-запрос. Пример запроса параметризованного SQL ниже:

SqlConnection conn = null; 
SqlDataReader reader = null; 
//Connection string goes here 

string studentName = byNametextBox.Text; 

SqlCommand cmd = new SqlCommand(
    "SELECT * FROM Guests "+" WHERE Students.name = @name", conn); 

SqlParameter param = new SqlParameter("@name", SqlDbType.NVarChar, 50); 

param.Value = studentName; 

cmd.Parameters.Add(param); 
reader = cmd.ExecuteReader(); 
//Do stuff with reader here 
+0

+1 для использования параметризованного запроса! Так все должно быть ... –

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