2014-08-28 111 views
0

我嘗試通過我的代碼幾個小時試圖看看我錯了什麼地方,谷歌似乎也沒有答案。 基本上我運行此代碼:SqlDataReader每隔一行讀取一次?

public bool LoginRequest(string ReceivedUsername, string ReceivedPassword) 
    { 

     bool ValidLogin = false; 

     try 
     { 

      using (SqlConnection myConnection = new SqlConnection(ConnectString)) 
      { 
       myConnection.Open(); 
       Log.Debug("Succesful sql connection"); 
       SqlCommand userSELECTcom = new SqlCommand("SELECT username,password FROM users;", myConnection); 
       SqlDataReader reader = userSELECTcom.ExecuteReader(); 

        //verify login 
        while (reader.Read()) 
        { 
         CompareUsername = reader["username"].ToString(); 
         ComparePassword = reader["password"].ToString(); 
         Log.Debug(ReceivedUsername + " against " + CompareUsername); 
         Log.Debug(ReceivedPassword + " against " + ComparePassword); 

         if (CompareUsername == ReceivedUsername && ComparePassword == ReceivedPassword) 
         { 
          ValidLogin = true; 
          Log.Debug(ReceivedUsername + " has logged in successfully!!!"); 
          myConnection.Close();//close sql conn 
          reader.Close();//close sqldatareader 
          return ValidLogin; 
         } 

         else if (CompareUsername != ReceivedUsername || ComparePassword != ReceivedPassword) 
         { 
          if (!reader.Read()) 
          { 
           Log.Debug(ReceivedUsername + " has not logged in successfully with password: " + ReceivedPassword); 
           myConnection.Close();//close sql conn 
           reader.Close();//close sql data reader 
           return ValidLogin; 
          } 
         } 
        } 
        //end of verify sequence 
      } 

     } 
     //logging any login request issues 
     catch (Exception e) 
     { 
      Log.Debug(e); 
     } 
     return ValidLogin; 

    } 

我已經設置了一個記錄程序,告訴的代碼被執行我的一切多數民衆贊成在發生。這些行:「Log.Debug(ReceivedUsername +」against「+ CompareUsername); Log.Debug(ReceivedPassword +」against「+ ComparePassword);」

幫助我查看讀者正在檢查哪一行。我嘗試了六行,每行都有唯一的用戶名和密碼,結果基本上表明只有第1,3,5行被讀者檢查,以防止用戶輸入。因此,如果我嘗試使用第2,4或6行中的用戶名和密碼登錄客戶端,我收到一條錯誤信息,說我的登錄失敗。誰能解釋爲什麼會發生這種情況?

+3

只是一個方面說明。如果您在連接周圍使用「使用」關鍵字,則不需要您撥打電話。關閉它。它繼承了IDisposable,它使用呼叫給你。 – 2014-08-28 04:05:43

+0

通常,直接從數據庫查詢而不是從表中檢索所有數據是一種好的做法。建議使用where子句。 – Hassan 2014-08-28 04:06:16

+0

絕對要考慮到Cubicle.Jockey。你能解釋一下哈桑嗎? – Jaja 2014-08-28 04:11:13

回答

0

爲了保持簡單,您可以直接從數據庫中查詢。

下面是示例代碼來檢查,如果接收到的用戶名和密碼在數據庫中存在:你

string sql = @"SELECT username,password FROM users 
      WHERE [email protected] and password = @password"; 

SqlCommand userSELECTcom = new SqlCommand(sql, myConnection); 
userSELECTcom.Parameters.AddWithValue(@username, ReceivedUsername); 
userSELECTcom.Parameters.AddWithValue(@password, ReceivedPassword); 

using(SqlDataReader reader = userSELECTcom.ExecuteReader()) 
{ 
    ValidLogin = reader.HasRows; 
} 
+1

非常感謝...比我使用的代碼短得多!我將立即修改我的代碼。 – Jaja 2014-08-28 04:31:25

+0

@Jaja。請注意。你可以避免聲明'bool ValidLogin'。你可以直接使用'return reader.HasRows;'。另外,當你使用'using'語句來處理'SqlConnection'時,你不必關閉連接,你可以跳過'myConnection.Close()'。 – Hassan 2014-08-28 04:40:32

+0

是的,我刪除了我所有的connection.Close()語句,他們不需要。我想知道現在是否在我的catch語句中返回false? – Jaja 2014-08-28 04:54:17

2

在您未找到該登錄時間的情況下,您有一個額外的Reader.Read()呼叫。這是跳到下一個記錄,然後你的主循環的Reader.Read()去下一個。

儘管如此,您不需要循環。構建一個用戶名查詢記錄的查詢。如果沒有記錄,則登錄失敗。如果有,請檢查密碼。

+0

Ahhhh我明白....很有道理。但在我嘗試代碼之前,如何檢查閱讀器是否還有沒有條件的行!Reader.read()? – Jaja 2014-08-28 04:09:23

+0

可以使用Reader.HasRows。 – Hassan 2014-08-28 04:10:02

1

while塊中的if語句有第2個reader.Read()。這會導致您的代碼跳過記錄。

0
else if (CompareUsername != ReceivedUsername || ComparePassword != ReceivedPassword) 
{ 
if (!reader.Read()) //remove this condition it will skip the current loop        
{ 
Log.Debug(ReceivedUsername + " has not logged in successfully with password: " + ReceivedPassword); 
myConnection.Close();//close sql conn 
reader.Close();//close sql data reader 
return ValidLogin; 
} 
} 
+0

你能正確縮進你的答案嗎?它看起來很奇怪。 – Hassan 2014-08-28 04:22:42