繁体   English   中英

必须声明标量变量@

[英]must declare the scalar variable @

由于某种原因,在定义我的变量后,我仍然得到'必须声明标量变量'错误。

using (OleDbConnection conn = new OleDbConnection(connString))
{
    conn.Open();

    using(OleDbCommand cmd = new OleDbCommand("SELECT UserID FROM tblUser WHERE Username=@user AND Password = @pass", conn))
    {
        cmd.Parameters.AddWithValue("@user", user);
        cmd.Parameters.AddWithValue("@pass", pass);

        int UserID = (int)cmd.ExecuteScalar();

        return UserID < 0 ? -1 : UserID;
    }
}

OleDb不支持命名参数。 我认为这是造成错误的原因。 相反,在SQL查询中,使用? 而不是参数名称,并确保添加的参数顺序与它们在查询中出现的顺序相匹配。 所以:

using(OleDbCommand cmd = new OleDbCommand("SELECT UserID FROM tblUser WHERE Username=? AND Password = ?", conn))
{
        cmd.Parameters.AddWithValue("@user", user);
        cmd.Parameters.AddWithValue("@pass", pass);

        int UserID = (int)cmd.ExecuteScalar();

        return UserID < 0 ? -1 : UserID;
}

尝试使用以下内容。 如果将值传入null,则会将其解释为缺失。

using (OleDbConnection conn = new OleDbConnection(connString))
{
    conn.Open();

    using(OleDbCommand cmd = new OleDbCommand("SELECT UserID FROM tblUser WHERE Username=@user AND Password = @pass", conn))
    {
        cmd.Parameters.AddWithValue("@user", user ?? DBNull.Value);
        cmd.Parameters.AddWithValue("@pass", pass ?? DBNull.Value);

        int UserID = (int)cmd.ExecuteScalar();

        return UserID < 0 ? -1 : UserID;
    }
}

添加Clear()以删除上一次调用中遗留的所有参数。 愿这会奏效。

cmd.Parameters.Clear() 
cmd.Parameters.AddWithValue("@user", user);
cmd.Parameters.AddWithValue("@pass", pass);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM