必须声明标量变量' @ connection'错误

时间:2017-04-27 07:17:06

标签: c# asp.net odbc scalar

以下是我要获取的代码

  

必须声明标量变量@connection

错误。我不知道自己哪里出错了。请指导

protected void LinkButton1_Click(object sender, EventArgs e)
{
    string connection = Drpconn.SelectedItem.Text;
    using (OdbcConnection con = new OdbcConnection("DSN=Sqltesting;UID=user1;PWD=test@123;Integrated Security=no;"))
    {

        using (OdbcCommand cmd = new OdbcCommand("INSERT INTO TblConfigure(Connection,Server,DbName,UserID,Password,Connection_Name,Port,Service_ID) VALUES (@Connection, @Server , @DbName,@UserID,@Password,@ConnectionName,@Port,@ServiceID)", con))
        {
            con.Open();

            cmd.Parameters.AddWithValue("@Connection", connection);
            cmd.Parameters.AddWithValue("@Server", TxtServer.Text);
            cmd.Parameters.AddWithValue("@DbName", DrpDbName.SelectedItem.Text);
            cmd.Parameters.AddWithValue("@UserID", TxtUsr.Text);
            cmd.Parameters.AddWithValue("@Password", TxtPass.Text);
            cmd.Parameters.AddWithValue("@ConnectionName", Txtconnname.Text);
            cmd.Parameters.AddWithValue("@Port", TxtPort.Text);
            cmd.Parameters.AddWithValue("@ServiceID", TxtService.Text);

            cmd.ExecuteNonQuery();
        }
    } // closes the connection 
    Response.Redirect("LoginPL.aspx");
}

1 个答案:

答案 0 :(得分:2)

您需要重写命令文本以遵循ODBC parameters的准则。使用此提供程序,您无法为参数提供带嵌入式NAMED占位符的命令文本 您只为参数的问号提供此文本。

  

当CommandType设置为Text时,.NET Framework数据提供程序为   ODBC不支持将命名参数传递给SQL语句或   到OdbcCommand调用的存储过程。在其中任何一个   使用问号(?)占位符

此外,当您将参数添加到命令Parameters集合时,您应该按照INSERT字段所需的确切顺序提供它们。 (但这在您当前的代码中已经是正确的)

  string cmdText = @"INTO TblConfigure
            (Connection,Server,DbName,UserID,
             Password,Connection_Name,Port,Service_ID) 
             VALUES (?,?,?,?,?,?,?,?)";
  using (OdbcCommand cmd = new OdbcCommand(cmdText, con))
  {
        con.Open();
        cmd.Parameters.AddWithValue("@Connection", connection);
        .....

最后一点。小心AddWithValue。这是一个方便的捷径,但在某些情况下它会咬你。见Can we stop using AddWithValueAlready?