必须声明标量变量@

时间:2015-04-17 02:41:48

标签: c# sql .net sql-server

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

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

3 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:0)

尝试使用以下内容。如果将值传入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;
    }
}

答案 2 :(得分:0)

添加Clear()以删除上次调用中遗留的所有参数。愿这可行。

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