1 回答

TA貢獻1803條經驗 獲得超6個贊
你需要在 -.ExecuteReader() 之后 sqlcon.Open()調用- 為什么你還要執行.ExecuteNonQuery()?您已經通過調用執行查詢.ExecuteReader()- 這是無用的,應該刪除(ExecuteNonQuery適用于運行INSERT, UPDATEor DELETE- 的 SQL 語句,但不適用于您在這里有類似情況的情況SELECT...)。
SqlCommand cmd = new SqlCommand("SELECT * FROM users WHERE username = @username AND password = @password", sqlcon);
cmd.Parameters.Add("@username", SqlDbType.VarChar, 100).Value = txtUsername.Text);
cmd.Parameters.Add("@password", SqlDbType.VarChar, 100).Value = txtPassword.Text;
// open connection? ??
sqlcon.Open();
// execute reader and iterate over rows
SqlDataReader dr = cmd.ExecuteReader();
if (dr.HasRows)
{
? ? Main objMain = new Main();
? ? this.Hide();
? ? objMain.Show();
}
else
{
? ? MessageBox.Show("Check your username and password");
}? ?
// close connection only **AFTER** you've read the data!
sqlcon.Close();
由于您只想檢查給定用戶是否存在用戶名和密碼,因此返回表的所有列確實是一種矯枉過正 - 僅返回例如(或其他一些列)Users
就足夠了UserId
,小欄) - 然后使用.ExecuteScalar()
。如果具有該用戶名和密碼的用戶存在,則UserId
返回ExecuteScalar()
該用戶名和密碼 - 如果該用戶不存在,則返回 NULL。
像這樣的東西:
SqlCommand cmd = new SqlCommand("SELECT UserId FROM users WHERE username = @username AND password = @password", sqlcon);
cmd.Parameters.Add("@username", SqlDbType.VarChar, 100).Value = txtUsername.Text);
cmd.Parameters.Add("@password", SqlDbType.VarChar, 100).Value = txtPassword.Text;
// open connection? ??
sqlcon.Open();
// execute scalar?
object result = cmd.ExecuteScalar();
// if we got a result --> user with that username nad password exists
if (result != null)
{
? ? Main objMain = new Main();
? ? this.Hide();
? ? objMain.Show();
}
else
{
? ? MessageBox.Show("Check your username and password");
}? ?
sqlcon.Close();
- 1 回答
- 0 關注
- 142 瀏覽
添加回答
舉報