C# OleDb参数,空值

C# OleDb参数,空值,c#,.net,oledb,C#,.net,Oledb,我有以下代码 OleDbCommand cmd = new OleDbCommand("SELECT * FROM Users WHERE username = ? AND password = ?",conn); OleDbParameter p1 = new OleDbParameter(); OleDbParameter p2 = new OleDbParameter(); cmd.Parameters.Add(p1); cmd.Parameter

我有以下代码

    OleDbCommand cmd = new OleDbCommand("SELECT * FROM Users WHERE username = ? AND password = ?",conn);

    OleDbParameter p1 = new OleDbParameter();
    OleDbParameter p2 = new OleDbParameter();
    cmd.Parameters.Add(p1);
    cmd.Parameters.Add(p2);
    p1.Value = usernametb.Text;
    p2.Value = passwordtb.Text;

    conn.Open();
    OleDbDataReader read = cmd.ExecuteReader();

        if (read.Read() == true)
        {
            conn.Close();
            MessageBox.Show("Successfully logged in!");
        }
        else
        {
            conn.Close();
            MessageBox.Show("Login failed");
        }
如果用户有密码,此代码对我有效,但如果用户没有密码,则会失败,我不知道原因


我哪里出了问题?

下面的步骤行吗

SELECT * FROM Users WHERE username = ? AND 
                          (password IS NULL OR password = ?)

这是因为在SQL标准中,返回的是
null=null
而不是
true

您的查询应该是

SELECT * FROM Users WHERE username = ? AND (password is null or password = ?)
更好的查询方法是检查当密码为
null
时,用户必须输入一个空密码,因此密码如下:

SELECT * FROM Users WHERE username = ? AND 
    ? = case when password is null then '' else password end

您从何处获得错误以及问题是什么。?::)我猜这里
p2.Value=passwordtb.Text错误为对象引用。。。对的