C# 必须声明标量变量@

C# 必须声明标量变量@,c#,sql,.net,sql-server,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)) {

由于某些原因,在定义变量之后,我仍然会遇到“必须声明标量变量”错误

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连接连接=新OLEDB连接(连接字符串))
{
conn.Open();
使用(OleDbCommand cmd=new-OleDbCommand(“从tblUser中选择UserID,其中Username=@user和Password=@pass”,conn))
{
cmd.Parameters.AddWithValue(“@user”,user);
cmd.Parameters.AddWithValue(“@pass”,pass);
int UserID=(int)cmd.ExecuteScalar();
返回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;
    }
}
使用(OLEDB连接连接=新OLEDB连接(连接字符串))
{
conn.Open();
使用(OleDbCommand cmd=new-OleDbCommand(“从tblUser中选择UserID,其中Username=@user和Password=@pass”,conn))
{
cmd.Parameters.AddWithValue(“@user”,user??DBNull.Value);
cmd.Parameters.AddWithValue(“@pass”,pass??DBNull.Value);
int UserID=(int)cmd.ExecuteScalar();
返回UserID<0?-1:UserID;
}
}
Add Clear()删除上一次调用留下的所有参数。但愿这能奏效

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

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

使用(OleDbCommand cmd=new-OleDbCommand(“从tblUser中选择UserID,其中Username=?和Password=?”,conn))
{
cmd.Parameters.AddWithValue(“@user”,user);
cmd.Parameters.AddWithValue(“@pass”,pass);
int UserID=(int)cmd.ExecuteScalar();
返回UserID<0?-1:UserID;
}

我得到的异常是:+$exception{“必须声明标量变量\“@user\”}System.exception{System.Data.OleDb.oledbeexception}user或pass是否为null?如果是,您可以尝试传入DBNull.Value。我已经检查了这些值,它们不是null。您应该签出并停止使用
.AddWithValue()
-它可能导致意外的结果…如果连接到SQL Server,则应使用
SqlConnection
SqlCommand
,然后可以使用命名参数
OleDbCommand
仅支持未命名的位置性
参数……这是用户和过程的值:$exception{“必须声明标量变量\“@user\”}.System.exception{System.Data.OleDb.OLEDBEException}user“fdsafdsafd”string pass“fdsafdsafds”string
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;
}