簡體   English   中英

SqlDataReader讀取其他所有行嗎?

[英]SqlDataReader reads every other row?

我試圖遍歷我的代碼數小時,以查看我出了什么問題,而Google似乎也沒有答案。 基本上我正在運行以下代碼:

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 +”反對“ + CompareUsername); Log.Debug(ReceivedPassword +”反對“ + ComparePassword);”

幫助我查看讀者正在檢查哪一行。 我嘗試了六行,每行分別具有唯一的用戶名和密碼,結果基本上顯示,只有第1、3和5行被讀者根據用戶的輸入進行檢查。 因此,如果我嘗試使用第2、4或6行中的用戶名和密碼使用客戶端登錄,則會收到一條錯誤消息,提示我登錄失敗。 誰能解釋為什么會這樣?

在您當時沒有找到登錄名的情況下,您還有一個額外的Reader.Read()調用。 跳到下一個記錄,然后主循環的Reader.Read()轉到下一個記錄。

不過,您不需要像這樣循環。 建立一個查詢,以按用戶名查找記錄。 如果沒有記錄,則登錄失敗。 如果有,請檢查密碼。

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

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

為了簡單起見,您可以直接從數據庫查詢。

以下是檢查接收的用戶名和密碼是否存在於數據庫中的示例代碼:

string sql = @"SELECT username,password FROM users 
             WHERE username=@username 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; 
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM