C# 必须声明标量变量"@PanId";
我知道这个问题已经被问了很多次,我花了2个小时在SO和其他网站上阅读解决方案,但没有解决它。因此,请不要将其标记为重复。这是我的代码:-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
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)
和deletecmd=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)
和deletecmd=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提供程序。这就是为什么我们需要把?
作为占位符。你能告诉我为什么我必须使用它吗?而不是命名参数?你能告诉我为什么我必须使用吗?而不是命名参数?