2017-04-15 398 views
0

我正在创建一个简单的Web服务来验证用户。datatable.rows.count总是返回0

正确填充数据表(用于存储select语句的结果)存在问题,'dt.rows.count'(dt是数据表的名称)始终返回0,即使select语句不返回任何内容。我已经尝试在填充之前清除数据表,并且在if条件之后,但无济于事,我得到了相同的结果。

真的很感激任何关于如何进行的建议。

[WebMethod] 
    public string Authen(string a, string b) 
    { 
     var con = new SqlConnection("Data Source=SERVER-SQL;Initial Catalog=DECA-DB;Persist Security Info=True;User ID=sa;Password=*****"); 
     var sda = new SqlDataAdapter("SELECT * FROM Login_Matrix WHERE Username = ' " + a + " ' AND Password = ' " + b + " '", con); 
     var dt = new DataTable(); 

     con.Open(); 
     dt.Clear(); 
     sda.Fill(dt);    
     con.Close(); 
     int x = dt.Rows.Count; 
     //return (x); 

     if (x >0) 
     { 
      dt.Clear(); 
      return ("In"); 
     } 

     else 
     { 
      dt.Clear(); 
      return ("out"); 
     } 

     } 
    } 
+0

好像你关闭'sqlconnection' – Sami

+0

关闭其他部分后您的SQL连接。 – Mahi

回答

2

后的单引号前添加一个空格,使您的查询搜索inexistant用户名和passords(如“史蒂夫”),它返回任何记录

速战速决可能是

var sda = new SqlDataAdapter(@"SELECT * FROM Login_Matrix 
           WHERE Username = '" + a + "' 
           AND Password = '" + b + "'", con); 

但这是非常危险的。
此代码易受Sql Injection attacks影响。
您应该使用参数

var sda = new SqlDataAdapter(@"SELECT * FROM Login_Matrix 
           WHERE Username = @uname 
           AND Password = @pwd", con); 
sda.SelectCommand.Parameters.Add("@uname", SqlDbType.NVarChar).Value = a; 
sda.SelectCommand.Parameters.Add("@pwd", SqlDbType.NVarChar).Value = b; 

而且关于安全同一直线上,还有一点要尽快考虑,是在你的数据库中存储明文密码是一个非常大的安全隐患。您应该搜索how to salt and store an hash of the password

此代码还有其他部分需要改进。

  • 首先,您需要在连接或命令中使用围绕一次性对象 的语句。
  • 其次,不需要有一个完整的SqlDataAdapter和一个DataTable来检查用户是否存在。

所以你可以重写你的代码为:

string cmdText = @"IF EXISTS(SELECT 1 FROM Login_Matrix 
        WHERE Username = @uname AND Password = @pwd) 
        SELECT 1 ELSE SELECT 0"; 

using(SqlConnection con = new SqlConnection(".....")) 
using(SqlCommand cmd = new SqlCommand(cmdText, con)) 
{ 
    con.Open(); 
    int result = (int)cmd.ExecuteScalar(); 
    return (result == 1 ? "In" : "out"); 
} 
+0

It works.Thanks mate:D –