Помогите мне исправить это заявление SQL? - PullRequest
1 голос
/ 16 июня 2009

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

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

Ответы [ 5 ]

4 голосов
/ 16 июня 2009

Предикат EXISTS немного более эффективен, чем JOIN, если вам нужны только столбцы из одной из таблиц. Дополнительно - никогда не вставляйте строки в такие операторы SQL - вы просто просите об атаках SQL-инъекций или связанных с ними ошибках сбоя (Да, я знаю, что это приложение 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 *» - это плохо, и что вам следует рассмотреть возможность указания имен отдельных столбцов

1 голос
/ 16 июня 2009

Вам нужно беспокоиться о внедрении SQL. Проще говоря, SQL-инъекция - это когда пользователь может вставить в ваш запрос произвольные операторы 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 голосов
/ 16 июня 2009

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

SELECT Guests.* FROM Guests INNER JOIN Students ON Students.name = Guests.name WHERE Students.name = '" + byNametextBox.Text + "'"
0 голосов
/ 16 июня 2009

Попробуйте:

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

Предполагается, что поле, связывающее обе таблицы, является StudentId.

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

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

0 голосов
/ 16 июня 2009
SqlDataAdapter("SELECT Guests.* FROM Guests,Students WHERE Guest.StudentId = Student.Id and  Students.name='" + byNametextBox.Text + "'", MyConn);`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...