2015-02-06 51 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注入攻击](http://en.wikipedia.org/wiki/SQL_injection)。请使用您可以使用的任何语言的绑定参数。 C#拥有它们,使用它们。 – nvoigt 2015-02-06 15:37:00

回答

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

很好的答案,但不应该是'OR'吗?为什么你将'%'作为参数的值? – stakx 2015-02-06 15:39:06

+0

@stakx:我不确定,也许。这并不清楚OP究竟在努力实现什么。根据'%':这只是我答案的一部分。我的第一个版本包含'LIKE',但它是多余的。 – 2015-02-06 15:39:43

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); 

不要

​​
1

几件事情,以改善....

  1. 不要使用字符串连接/格式化以形成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 2015-02-06 15:52:50