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

时间:2012-06-16 10:03:21

标签: c# asp.net .net

当用户使用他的UserName登录时,我会将UserName发送到下一页,如下面代码Page_Load

 lblCmpUserName.Text = Server.UrlDecode(Request.QueryString["Parameter"].ToString());

然后我想将“公司详细信息”与UserName存储在SQL Server 2008表中。

我收到了错误

  

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

代码:

    protected void BtnCmpApproval_Click(object sender, EventArgs e)
    {
       SqlConnection SqlCon = new SqlConnection(GetConnectionString());
       string query = "INSERT INTO Company_Info2 VALUES (@lblCmpUserName, @txtCmpName,  @txtRegCountry, @txtCmpRegNo, @txtCmpEstdate,@AFU1, @txtCmpAddress, @ddlAddrIn)";
       try
       {
          SqlCon.Open();

          SqlCommand cmd = new SqlCommand(query, SqlCon);
          cmd.CommandType = CommandType.Text;
          cmd.Parameters.AddWithValue("@UserName", lblCmpUserName.Text);
          cmd.Parameters.AddWithValue("@Cmp_Name", txtCmpName.Text);
          cmd.Parameters.AddWithValue("@Commercial_RegNo", txtRegCountry.Text);
          cmd.Parameters.AddWithValue("@Comm_Country", txtCmpRegNo.Text);
          cmd.Parameters.AddWithValue("@Cmp_EstablishDate", txtCmpEstdate.Text);
          cmd.Parameters.AddWithValue("@Cmp_DocPath", AFU1.FileName);
          cmd.Parameters.AddWithValue("@txtCmpAddress", txtCmpAddress.Text);
          cmd.Parameters.AddWithValue("@ddlAddrIn", ddlAddrIn.SelectedItem.Text);

          cmd.ExecuteNonQuery();
      }
      catch (Exception ex)
      {
         throw new Exception(ex.Message);
      }
      finally
      { 
         SqlCon.Close();
      }
    } 

4 个答案:

答案 0 :(得分:2)

试试这个

protected void BtnCmpApproval_Click(object sender, EventArgs e)
    {
    SqlConnection SqlCon = new SqlConnection(GetConnectionString());
    string query = "INSERT INTO Company_Info2 VALUES (@lblCmpUserName,@txtCmpName,
    @txtRegCountry,@txtCmpRegNo,@txtCmpEstdate,@txtCmpAddress,@ddlAddrIn)";
    try
    {
     SqlCon.Open();
     SqlCommand cmd = new SqlCommand(query, SqlCon);
     cmd.CommandType = CommandType.Text;
     cmd.Parameters.AddWithValue("@lblCmpUserName", lblCmpUserName.Text);
     cmd.Parameters.AddWithValue("@txtCmpName", txtCmpName.Text);
     cmd.Parameters.AddWithValue("@txtRegCountry", txtRegCountry.Text);
     cmd.Parameters.AddWithValue("@txtCmpRegNo", txtCmpRegNo.Text);
     cmd.Parameters.AddWithValue("@txtCmpEstdate", txtCmpEstdate.Text);
     cmd.Parameters.AddWithValue("@Cmp_DocPath", AFU1.FileName);

     cmd.Parameters.AddWithValue("@txtCmpAddress", txtCmpAddress.Text);
     cmd.Parameters.AddWithValue("@ddlAddrIn", ddlAddrIn.SelectedItem.Text);
     cmd.ExecuteNonQuery();
  }
  catch (Exception ex)
  {
     throw new Exception(ex.Message);
  }
  finally
  { 
           SqlCon.Close();
  }
  }

实际上除了最后两个,你添加的参数都没有与Query中的参数匹配。 Query&中定义的参数使用

添加到命令的参数
cmd.Parameters.AddWithValue(...)

cmd.Parameters.Add(...)

必须相同,否则肯定会出错。

答案 1 :(得分:2)

当您在上面的代码中编写SqlCommand时,就像您对.NET Runtime说的那样。 “嘿,我将这个字符串query发送到SqlServer,并在命令集合中显示参数的占位符。请使用您在集合中找到的参数值替换占位符”。现在,NET Runtime会搜索你的字符串中的占位符,但没有参数对应占位符@lblCmpUserName,所以它会抱怨你。 (NET在第一个停止,但在第一个之后你还有更多)

@lblCmpUserName,   -> No match found 
@txtCmpName,       -> No match found
@txtRegCountry,    -> No match found
@txtCmpRegNo,      -> No match found
@txtCmpEstdate,    -> No match found
@txtCmpAddress,    -> Found match 
@ddlAddrIn         -> Found match 

现在您有两个选项,更改占位符以匹配参数名称或更改参数名称以匹配占位符。这是你的选择。

此外,在解析字符串query时,.NET运行时将注意到您有7个占位符和8个参数。这将是另一个错误。您添加参数@Cmp_DocPath但字符串没有占位符 -

答案 2 :(得分:1)

@lblCmpUserName

没有匹配的

cmd.Parameters.AddWithValue("@UserName", lblCmpUserName.Text);

@lblCmpUserName.

添加以下行:

 cmd.Parameters.AddWithValue("@lblCmpUserName",  lblCmpUserName.Text);

你仍然会犯错误。对于在sql语句中添加的每个@Parameter,您需要匹配cmd.Parameters.AddWithValue行。

答案 3 :(得分:0)

我得到了解决方案,我在INSERT查询中犯了一个错误。

应该是这样的。

string query="INSERT INTO Company_Info2 VALUES     (@UserName,@Cmp_Name,@Comm_Country,
    @Commercial_RegNo,@Cmp_DocPath,  
    @Cmp_EstablishDate,@Cmp_Address,@IsAddress)";