C# 必须声明标量变量"@PanId";

C# 必须声明标量变量"@PanId";,c#,asp.net,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.Co

我知道这个问题已经被问了很多次,我花了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();
                        }
编辑: 我试过这个,但又犯了同样的错误


这两个字段都是图像类型

该行的问题

cmd = new OleDbCommand(qry, con.cnn);
您正在重新创建一个
OleDbCommand
对象,但它的
CommandText
仍然需要
@PanId
@Cancel\u checque
参数,因为您尝试执行它

cmd=new-OleDbCommand()中创建第一个
cmd
行,将该查询用作其构造函数中的参数,如
cmd=new-OleDbCommand(qry)
和delete
cmd=new-OleDbCommand(qry,con.cnn)

此外,在select语句中,您正在使用字符串连接将值放入命令中不要那样做您应该始终使用。这种类型的字符串连接对攻击是开放的

还可用于处理数据库连接和命令

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();
}

那条线上的问题

cmd = new OleDbCommand(qry, con.cnn);
您正在重新创建一个
OleDbCommand
对象,但它的
CommandText
仍然需要
@PanId
@Cancel\u checque
参数,因为您尝试执行它

cmd=new-OleDbCommand()中创建第一个
cmd
行,将该查询用作其构造函数中的参数,如
cmd=new-OleDbCommand(qry)
和delete
cmd=new-OleDbCommand(qry,con.cnn)

此外,在select语句中,您正在使用字符串连接将值放入命令中不要那样做您应该始终使用。这种类型的字符串连接对攻击是开放的

还可用于处理数据库连接和命令

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();
}

您已经定义了两次
命令
对象。这将覆盖在上一个对象中添加的参数

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();  

您已经定义了两次
命令
对象。这将覆盖在上一个对象中添加的参数

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();  
编辑: 如果使用
sqlcommand
,则无需使用
占位符。由于
OleDbCommand
OdbcCommand
不支持命名参数,是否使用?而不是占位符。对于
SqlCommand
,它实际上并不关心对象上参数的顺序,只要这些参数存在于查询中。 如需更好的解释,请访问。 希望这能让你明白

编辑: 如果使用
sqlcommand
,则无需使用
占位符。由于
OleDbCommand
OdbcCommand
不支持命名参数,是否使用?而不是占位符。对于
SqlCommand
,它实际上并不关心对象上参数的顺序,只要这些参数存在于查询中。 如需更好的解释,请访问。

希望这能让你明白。

@ZoharPeled哦,我没看到。也添加了。@LoveRajput不应该添加。你真的确定要删除
cmd=newoledbcommand(qry,con.cnn)行?是的,我已经复制粘贴了你的代码。但同样的错误依然存在。虽然我用@LitisqeI提供的方法解决了这个问题,但我还是得到了@SonerGönül。谢谢你的帮助。这就是OleDbCommand和Sqlcommand的问题,“LitisqeKumar”清楚地解释了这一点。至少我可以发表评论,这样我就可以看出我可能错在哪里了?ZoharPeled Oh,没有看到这一点。也添加了。@LoveRajput不应该添加。你真的确定要删除
cmd=newoledbcommand(qry,con.cnn)行?是的,我已经复制粘贴了你的代码。但同样的错误依然存在。虽然我用@LitisqeI提供的方法解决了这个问题,但我还是得到了@SonerGönül。谢谢你的帮助。这就是OleDbCommand和Sqlcommand的问题,这一问题已由“LitisqeKumar”@Downvoter care解释清楚,至少我可以看出我可能错在哪里?很好,您的问题得到了解决。但我认为您使用的是ms access,它对参数化命令有不同的查询语法。下次请正确标记您的问题。不@aSharma我正在使用SQL SERVER 2008谢谢@LitisqeKumar这让我很抱歉在这里造成混淆。实际上,它是不支持命名参数的OleDb提供程序。这就是为什么我们需要把
作为占位符。很好,你的问题解决了。但我认为您使用的是ms access,它对参数化命令有不同的查询语法。下次请正确标记您的问题。不@aSharma我正在使用SQL SERVER 2008谢谢@LitisqeKumar这让我很抱歉在这里造成混淆。实际上,它是不支持命名参数的OleDb提供程序。这就是为什么我们需要把
作为占位符。你能告诉我为什么我必须使用它吗?而不是命名参数?你能告诉我为什么我必须使用吗?而不是命名参数?