【问题标题】:How to solve SqlException: Must declare the scalar variable "@RegNo" in ASP.Net [duplicate]如何解决 SqlException:必须在 ASP.Net 中声明标量变量“@RegNo”[重复]
【发布时间】:2018-02-02 06:55:48
【问题描述】:
 SqlCommand cmd = new SqlCommand("insert into Student(@RegNo,@Name,@Address,@CreatedTime) values(@RegNo,@Name,@Address,Getdate())");

这里显示类似 SqlException 的错误:

必须声明标量变量“@RegNo”。

怎么办?谢谢

【问题讨论】:

  • 您需要指定参数值。查看示例stackoverflow.com/a/40050820/2946329
  • 如何解决重复问题?
  • 应该是SqlCommand cmd = new SqlCommand("insert into Student(RegNo,Name,Address,CreatedTime) values(@RegNo,@Name,@Address,Getdate())")
  • 问题听起来一样并不意味着它是重复的,下次看看答案吗?

标签: c# asp.net sql-server-2005


【解决方案1】:
protected void Add_Click(object sender, EventArgs e)
{
  string constr = ConfigurationManager.ConnectionStrings["ApplicationServices"].ConnectionString;
  try {
    using (SqlConnection con = new SqlConnection(constr))
      using (SqlCommand cmd = new SqlCommand("insert into Student(RegNo,Name,Address,CreatedTime)values(@RegNo,@Name,@Address,Getdate())", con)) {
        cmd.Parameters.AddWithValue("@RegNo", RegNo.Text);
        cmd.Parameters.AddWithValue("@Name", Name.Text);
        cmd.Parameters.AddWithValue("@Address", Address.Text);
        con.Open();

        cmd.ExecuteNonQuery();
      }
  } catch (Exception ex) {
    //handle exception..
    throw;
  }
}

显示错误:

不存在来自对象类型 System.Web.UI.WebControls.TextBox 的映射 到已知的托管提供程序本机类型。

【讨论】:

  • 不存在从对象类型 System.Web.UI.WebControls.TextBox 到已知托管提供程序本机类型的映射。尝试此代码后遇到此错误。怎么办?
  • 请分享您的完整代码 cmd.Parameters.AddWithValue("@RegNo", your textbox value); //regno.Text
  • 使用上面编辑的代码
【解决方案2】:

Sql 插入查询基本上有 2 个部分。

1) 用于插入值的表列名

2) 插入的实际值或具有值的@parameters。

您的 SQL 将 1 与 2 混合在一起。

所以不是

SqlCommand cmd = new SqlCommand("insert into Student(@RegNo,@Name,@Address,@CreatedTime) values(@RegNo,@Name,@Address,Getdate())");

应该是

SqlCommand cmd = new SqlCommand("insert into Student(RegNo,-[Name],Address,CreatedTime) values(@RegNo,@Name,@Address,Getdate())");

在此之后,您只需在SqlCommand 对象中添加所有@variables。我可以看到其他人已经建议您为此编写代码。

【讨论】:

  • 只是补充一点,如果您的查询影响所有列,则不一定需要指定表列名
  • @Yollo 但如果我们有一个 Identity 列,那将会失败。所以在这种情况下指定列名会很好。
【解决方案3】:

让我解释一下为什么会出现错误。

你的 sql 命令是这样的:SqlCommand cmd = new SqlCommand("insert into Student(@RegNo,@Name,@Address,@CreatedTime) values(@RegNo,@Name,@Address,Getdate())");

这意味着您正在告诉 sql 执行与此等效的查询:

insert into Student(@RegNo,@Name,@Address,@CreatedTime) values(1234,'name value','address value',GetDate()) -- i've put some vlaues for example

如您所见,这是不正确的。

执行insert查询时,要指定列namesvalues,names进入第一个括号,values进入Values关键字之后的第二个,逻辑上如此没有列名 "@RegNo""@Name" 而是使用数据库中指定的真实列名 "RegNo", “名称”,因此查询应如下所示:

insert into Student(RegNo,Name,Address,CreatedTime) values(1234,'name value','address value',GetDate())

为什么会出现错误消息?

在 sql 中,变量以 @ 前缀声明,例如:declare @a int=5; 因此,当尝试执行查询时 insert into Student(@RegNo,....... sql@RegNo 识别为变量,因为找不到声明,您会得到一个错误信息

必须声明标量变量@RegNo。

你应该只使用'@'来指定参数而不是列名

在你的 c# 代码中试试这个:

SqlCommand cmd = new SqlCommand("insert into Student(RegNo,Name,Address,CreatedTime) values(@RegNo,@Name,@Address,@CreatedTime)");
            cmd.Parameters.AddWithValue("@RegNo", "object value");
            cmd.Parameters.AddWithValue("@Name", "object value");
            cmd.Parameters.AddWithValue("@Address", "object value");
            cmd.Parameters.AddWithValue("@RegNo", "object value");
            cmd.Parameters.AddWithValue("@CreatedTime", DateTime.Now);  //replaced GetDate with DateTime.Now

!注意:使用SqlCommand的时候可以先在sql执行查询,看看是不是搞错了

【讨论】:

    猜你喜欢
    • 2015-09-05
    • 2018-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多