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

时间:2015-07-29 08:33:02

标签: c# asp.net

我知道这个问题已被多次询问,我花了2个小时在SO和其他网站上阅读解决方案,但无法解决它。所以,请不要将其标记为重复这是我的代码: -

dt = new DataTable();
                    dt = con.GetDataTable("select * from Panbnk_tran_t where emp_code='" + emp_code + "'", "Panbnk_tran_t");
                    if (dt.Rows.Count > 0)
                    {
                        string qry = "";
                        qry="insert into Panbnk_arc_t ";
                        qry +="(panid, cancel_checqe)";
                        qry += "values( @PanId, @Cancel_checqe)";
                        cmd = new OleDbCommand();
                        cmd.Parameters.Add("@PanId", SqlDbType.Image).Value = dt.Rows[0]["panid"];
                        cmd.Parameters.Add("@Cancel_checqe", SqlDbType.Image).Value = dt.Rows[0]["cancel_checqe"];
                        cmd = new OleDbCommand(qry, con.cnn);
                        cmd.ExecuteNonQuery();
                        }

编辑:

using (var cmd = new OleDbCommand(qry, con.cnn))
                        {
                            cmd.Parameters.Add("@PanId", SqlDbType.Image).Value = dt.Rows[0]["panid"];
                            cmd.Parameters.Add("@Cancel_checqe", SqlDbType.Image).Value = dt.Rows[0]["cancel_checqe"];
                            cmd.ExecuteNonQuery();
                        }

我已经尝试了这个但同样的错误

这两个字段都是图像类型

3 个答案:

答案 0 :(得分:0)

该行的问题;

cmd = new OleDbCommand(qry, con.cnn);

重新 - 创建OleDbCommand个对象,但CommandText 仍然需要@PanId@Cancel_checqe个参数因为你试图执行它。

当您在cmd行中创建第一个cmd = new OleDbCommand();时,请将该查询作为其构造函数中的参数cmd = new OleDbCommand(qry);并删除cmd = new OleDbCommand(qry, con.cnn);行。

同样在您的select语句中,您将使用字符串连接将值放在命令中。 不要这样做!您应该始终使用parameterized queries。这种字符串连接对SQL Injection攻击开放。

还可以使用using statement来处理数据库连接和命令。

using(var cmd = new OleDbCommand(qry, con.cnn))
{
     cmd.Parameters.Add("@PanId", SqlDbType.Image).Value = dt.Rows[0]["panid"];
     cmd.Parameters.Add("@Cancel_checqe", SqlDbType.Image).Value = dt.Rows[0]["cancel_checqe"];
     con.cnn.Open();
     cmd.ExecuteNonQuery();
}

答案 1 :(得分:0)

您已定义Command个对象两次。这会覆盖先前对象中添加的参数

cmd = new OleDbCommand(); // defined once
cmd.Parameters.Add("@PanId", SqlDbType.Image).Value = dt.Rows[0]["panid"];
cmd.Parameters.Add("@Cancel_checqe", SqlDbType.Image).Value = dt.Rows[0]["cancel_checqe"];
cmd = new OleDbCommand(qry, con.cnn); //defined again
cmd.ExecuteNonQuery();

仅定义cmd一次。

cmd = new OleDbCommand(qry, con.cnn);
cmd.Parameters.Add("@PanId", SqlDbType.Image).Value = dt.Rows[0]["panid"];
cmd.Parameters.Add("@Cancel_checqe", SqlDbType.Image).Value = dt.Rows[0]["cancel_checqe"];
cmd.ExecuteNonQuery();  

答案 2 :(得分:0)

dt = new DataTable();
dt = con.GetDataTable("select * from Panbnk_tran_t where emp_code='" + emp_code + "'", "Panbnk_tran_t");
if (dt.Rows.Count > 0)
{
            string qry = "";
            byte[] imgbytePan, imgbytecheque;
            imgbytePan = (byte[])dt.Rows[0]["panid"];
            imgbytecheque = (byte[])dt.Rows[0]["cancel_checqe"];
            qry = "insert into Panbnk_arc_t ";
            qry += "(panid, cancel_checqe)";
            qry += "values( ?, ?)";
            cmd = new OleDbCommand(qry, con.cnn);
            cmd.Parameters.Add("@imgPan", SqlDbType.Image).Value = imgbytePan;
            cmd.Parameters.Add("@imgChq", SqlDbType.Image).Value = imgbytecheque;
            cmd.ExecuteNonQuery();
 }

编辑:

如果您使用sqlcommand,则无需使用?占位符。由于OleDbCommandOdbcCommand不支持命名参数,并使用?占位符。对于SqlCommand,只要查询中存在这些参数,它就不会真正关心对象上参数的顺序。 为了更好地解释,您可以访问here。 希望这能让你清楚。