2017-04-15 395 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 –