【问题标题】:Must declare the scalar variable Error Message必须声明标量变量 错误消息
【发布时间】:2018-09-19 18:49:21
【问题描述】:

我正在创建一个使用此查询的搜索栏。我收到错误消息:

必须声明标量变量“@a”

这个错误消息出现在所有@a/@b/@c/@d。有人知道错误指的是什么吗?

SELECT [a],[b],[c],[d] 
FROM [dbo].table1 
WHERE (([a] LIKE '%' + @a + '%') 
       OR ([b] LIKE '%' + @b + '%') 
       OR ([c] LIKE '%' + @c + '%') 
       OR ([d] LIKE '%' + @d + '%')); 

我也试过了:

SELECT * 
FROM [dbo].table1 
WHERE (([a] LIKE '%'+@a+'%') 
       OR ([b] LIKE '%'+@b+'%') 
       OR ([c] LIKE '%'+@c+'%') 
       OR ([d] LIKE '%'+@d+'%'));

选择的目标应该是过滤用户输入,并在显示用户输入结果的同时仍然从表格的其余部分中过滤。任何帮助将不胜感激。

这是我在 SQL Server 中工作后尝试附加的 Button 调用。

protected void BtnSearch_Click1(object sender, EventArgs e)
    {
        string mainconn = ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString;
        SqlConnection sqlconn = new SqlConnection(mainconn);
        sqlconn.Open();
        SqlCommand sqlcomm = new SqlCommand();
        string sqlquery = "SELECT * FROM [dbo].Imported_USPFOWEB_Pers_Unit_tbl WHERE (([upc] LIKE '%'+@upc+'%') OR  ([uname] LIKE '%'+@uname+'%') OR ([st_addr] LIKE '%'+@st_addr+'%') OR ([pr_nbr] LIKE '%'+@pr_nbr+'%'))";
        sqlcomm.CommandText = sqlquery;
        sqlcomm.Connection = sqlconn;
        sqlcomm.Parameters.AddWithValue("upc", TxtSearch.Text);
        DataTable dt = new DataTable();
        SqlDataAdapter sda = new SqlDataAdapter(sqlcomm);
        sda.Fill(dt);
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }

运行站点并按下按钮时的错误消息如下:

System.Data.SqlClient.SqlException:必须声明标量变量“@uname”。

【问题讨论】:

  • 你如何调用这个查询?来自 T-SQL 代码?来自其他语言?代码本身似乎没问题 - 我怀疑这是您尝试调用/执行此查询的方式的问题
  • 我将编辑帖子,提供更多信息/代码,但我只是想先在 SQL Server 中作为简单的选择语句进行查询。比将它添加到我要附加的一些 C# 代码中。
  • 您在查询中引用了 4 个参数,但您的代码只创建了一个。那些领先的通配符会导致疯狂的性能问题。

标签: c# sql sql-server


【解决方案1】:

从 C# 调用时,您必须将 ALL 占位符定义为调用的 参数,并在调用查询之前在 C# 代码中设置值:

protected void BtnSearch_Click1(object sender, EventArgs e)
{
    string mainconn = ConfigurationManager.ConnectionStrings["myConnection"].ConnectionString;
    SqlConnection sqlconn = new SqlConnection(mainconn);
    sqlconn.Open();

    SqlCommand sqlcomm = new SqlCommand();
    string sqlquery = "SELECT * FROM [dbo].Imported_USPFOWEB_Pers_Unit_tbl WHERE (([upc] LIKE '%'+@upc+'%') OR  ([uname] LIKE '%'+@uname+'%') OR ([st_addr] LIKE '%'+@st_addr+'%') OR ([pr_nbr] LIKE '%'+@pr_nbr+'%'))";
    sqlcomm.CommandText = sqlquery;
    sqlcomm.Connection = sqlconn;

    // =========================================
    // here, you need to set the values of **ALL** parameters in your query!
    // @upc, @uname, @st_addr, @pr_nbr 
    // =========================================
    // sqlcomm.Parameters.AddWithValue("upc", TxtSearch.Text);

    sqlcomm.Parameters.Add("@upc", SqlDbType.VarChar, 50).Value = TxtSearch.Text;
    sqlcomm.Parameters.Add("@uname", SqlDbType.VarChar, 50).Value = ".....";
    sqlcomm.Parameters.Add("@st_addr", SqlDbType.VarChar, 50).Value =  ".....";
    sqlcomm.Parameters.Add("@pr_nbr", SqlDbType.VarChar, 50).Value =  ".....";

    DataTable dt = new DataTable();
    SqlDataAdapter sda = new SqlDataAdapter(sqlcomm);
    sda.Fill(dt);

    GridView1.DataSource = dt;
    GridView1.DataBind();
}

另外:您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意想不到和令人惊讶的结果...

改为使用我在上面添加的代码(并根据需要进行调整 - 这些参数可能并非全部为 SqlDbType.VarChar,或者并非全部为 50 个字符 - 只需适应您的情况即可)。

【讨论】:

  • 效果很好。谢谢marc_s。在我摆脱编码情绪后,我会阅读该链接。我还在学习和喜欢这个网站!再次感谢。
猜你喜欢
  • 2019-02-10
  • 1970-01-01
  • 2014-08-06
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多