我知道这个问题已被多次询问,我花了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();
}
我已经尝试了这个但同样的错误
这两个字段都是图像类型
答案 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
,则无需使用?
占位符。由于OleDbCommand
和OdbcCommand
不支持命名参数,并使用?占位符。对于SqlCommand
,只要查询中存在这些参数,它就不会真正关心对象上参数的顺序。
为了更好地解释,您可以访问here。
希望这能让你清楚。