2015-02-06 2 views
0

Я хотел бы узнать, есть ли способ выбрать два столбца в одной таблице для одного SqlCommand, который впоследствии будет использоваться для сравнения данных в двух столбцах и данных в двух текстовых блоках :Выбор двух столбцов для класса SqlCommand

Ниже приведены две строки, что я использую в настоящее время для класса SqlCommand и хотел бы поставить их вместе:

String str1 = String.Format("SELECT * FROM [employeeAccount] WHERE [User Name] LIKE '{0}'", txtUserName.Text); 
String str2 = String.Format("SELECT * FROM [employeeAccount] WHERE [Password] LIKE '{0}'", txtPassword.Text); 
+3

Вы широки открыт для [sql injection attack] (http://en.wikipedia.org/wiki/SQL_injection). Используйте параметры привязки на любом языке, который вы можете. C# имеет их, используйте их. – nvoigt

ответ

4

Просто используйте AND в вашем SQL запросов и SQL-параметров для предотвращения SQL-инъекции:

string sql = @"SELECT * FROM [employeeAccount] 
       WHERE [User Name] = @UserName 
       AND [Password] = @Password"; 
using(var command = new SqlCommand(sql, con)) 
{ 
    con.Open(); 
    command.Parameters.AddWithValue("@UserName", txtUserName.Text); 
    command.Parameters.AddWithValue("@Password", txtPassword.Text); 
    // ... 
} 
+0

Хороший ответ, но разве это не должно быть 'ИЛИ'? И почему вы передаете '%' в качестве значений параметра? – stakx

+0

@stakx: Я не уверен, может быть. Не совсем ясно, что на самом деле пытается достичь ОП. Согласно '%': это была лишь частично удаленная часть моего ответа. Моя первая версия содержала 'LIKE', но она избыточна. –

0

Вместо

String str1 = String.Format("SELECT * FROM [employeeAccount] WHERE [User Name] LIKE '{0}'", txtUserName.Text); 
String str2 = String.Format("SELECT * FROM [employeeAccount] WHERE [Password] LIKE '{0}'", txtPassword.Text); 

ли

String str1 = String.Format("SELECT * FROM [employeeAccount] WHERE [User Name] LIKE '{0}', SELECT * FROM [employeeAccount] WHERE [Password] LIKE '{1}", txtUserName.Text, txtPassword.Text); 
1

Несколько вещей, чтобы улучшить ....

  1. Не используйте string concatenation/formatting для формирования SQL-запросов, вы склонны к SQL-инъекции. Параметрируйте свои запросы. Использовать SqlParameter
  2. Важно!. Не используйте LIKE для сравнения имени пользователя и пароля, вы вероятно хотите точное совпадение с помощью =
  3. Вы должны объединить два условия использования AND оператора.

Так что ваш код должен выглядеть следующим образом:

using(SqlConnection connection = new SqlConnection("yourConnectionString")) 
using (
    SqlCommand command = 
     new SqlCommand(
      "SELECT * FROM [employeeAccount] WHERE [UserName] = @userName AND [Password] = @password", 
      connection)) 
{ 
    command.Parameters.AddWithValue("@username", txtUserName.Text); 
    command.Parameters.AddWithValue("@password", txtPassword.Text); 
    connection.Open(); 
    //,... execute command 
} 

Одна последняя вещь, чтобы добавить, не хранить пароль текста в базе данных, вместо того, чтобы хранить их хеши, см: How to store passwords *correctly*?

+0

@fubo, я ответил в то же время, я не думаю, что смогу копировать это за полтора минуты. Кстати, вы пропустили все остальные детали? – Habib

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