[英]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.