【问题标题】:must declare the scalar variable @必须声明标量变量@
【发布时间】:2015-04-17 02:41:48
【问题描述】:

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

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

【问题讨论】:

  • 我得到的异常是:+ $exception {"必须声明标量变量\"@user\"。"} System.Exception {System.Data.OleDb.OleDbException}
  • 用户或通行证是否为空?如果是,您可以尝试传入 DBNull.Value。
  • 我已经检查了这些值,它们不为空。
  • 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...
  • 如果您连接到 SQL Server,您应该使用 SqlConnectionSqlCommand - 然后您可以使用 named 参数。 OleDbCommand 仅支持未命名的位置 ? 参数 ....

标签: c# sql .net sql-server


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    尝试使用以下内容。如果一个值作为 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;
        }
    }
    

    【讨论】:

    • 这是 user 和 pass 的值:$exception {"必须声明标量变量 \"@user\"。"} System.Exception {System.Data.OleDb.OleDbException} user "fdsafd " 字符串传递 "fdsafds" 字符串
    【解决方案3】:

    添加 Clear() 以删除上一次调用遗留的任何参数。愿这行得通。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-03
      • 2013-07-03
      • 1970-01-01
      相关资源
      最近更新 更多