sql数据库错误“必须声明标量变量”

Posted

技术标签:

【中文标题】sql数据库错误“必须声明标量变量”【英文标题】:Error on sql database "Must declare the scalar variable" 【发布时间】:2014-01-06 00:07:32 【问题描述】:

我的登录系统有问题。我制作了一个运行良好的简单系统,但我想让它更高级,并根据用户的UserType 显示不同的起始页面。但是,我遇到了以下错误:“必须声明标量变量@UserType。”

using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

public partial class LoginwithEncryption : System.Web.UI.Page


    protected void btnSubmit_Click(object sender, EventArgs e)
    
        SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["conStr"].ConnectionString);
        con.Open();
        SqlCommand cmd = new SqlCommand(
            "select * from dbo.UserInfo where Login =@Login and UserType=@UserType and Password=@Password and UserType=@UserType", con);
        cmd.Parameters.AddWithValue("@Login", txtUserName.Text);
        cmd.Parameters.AddWithValue("@Password", txtPWD.Text+".123");


        SqlDataAdapter da = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();
        da.Fill(dt);

        if (dt.Rows.Count > 0)
        
            int usertype = Convert.ToInt32(dt.Rows[0]["UserType"]);


            if (usertype == 1)
            
                Response.Redirect("StartPage.aspx");
            
            else if (usertype == 2)
            
                Response.Redirect("DiferentStartPage.aspx");
            

        
        else
        
            ClientScript.RegisterStartupScript(Page.GetType(), "validation",
                "<script language='javascript'>alert('Invalid UserName and Password')</script>");
        

    

【问题讨论】:

您的意思是说and UserType=@UserType 两次?为什么不包括cmd.Parameters.AddWithValue("@UserType"... 【参考方案1】:

如错误所述:必须声明标量变量“@UserType”

也就是说,SQL命令有@UserType的参数,但是参数集合中没有声明参数。

SqlCommand cmd = new SqlCommand(
"select * from dbo.UserInfo where Login =@Login and UserType=@UserType and Password=@Password and UserType=@UserType", con);
cmd.Parameters.AddWithValue("@Login", txtUserName.Text);
cmd.Parameters.AddWithValue("@Password", txtPWD.Text+".123");

@UserType参数添加另一个参数:

cmd.Parameters.AddWithValue("@UserType", "User Type");

此外,SQL 包含对@UserType 的重复引用:

select * from dbo.UserInfo 
where Login=@Login 
      and UserType=@UserType 
      and Password=@Password 
      and UserType=@UserType

应该是:

select * from dbo.UserInfo 
where Login=@Login 
      and Password=@Password
      and UserType=@UserType 

【讨论】:

奇怪我确实添加了 cmd.Parameters.AddWithValue("@UserType", "User Type");到我的程序,但登录确实停止工作。 (删除 userType 使登录再次起作用)知道可能出了什么问题吗? 您必须为@UserType 提供一个实际值;在示例中,"User Type" 应替换为您的值。 cmd.Parameters.AddWithValue("@UserType", SqlDbType.Int);这是正确的方法吗? 在重新阅读您的问题时,您可能不想使用@UserType 参数;相反,您正在尝试使用 UserType 根据登录名进行重定向。如果是这种情况,那么只需从 SQL 命令中删除 @UserType 并且不要添加任何其他参数。 太棒了!如果您愿意,请随时投票并接受此答案:)【参考方案2】:

您已将@Login 和@Password 作为参数传递给您的查询,但您没有将@UserType 作为参数传递给您的查询。

【讨论】:

以上是关于sql数据库错误“必须声明标量变量”的主要内容,如果未能解决你的问题,请参考以下文章

vb.net SQL 导致 - “必须声明标量变量”

使用 ODBC 连接到 SQL SERVER 时,s-s-rS 错误必须声明标量变量

尝试在 SQL 中运行 UPDATE 语句时“必须声明标量变量”

必须用参数声明标量变量

SQL Server:必须声明标量变量

不明白错误信息:必须声明标量变量“@Username”。