错误:必须声明标量变量“@data”

5
当执行cmd.ExecuteNonQuery()时,我遇到了一个错误,提示“必须声明标量变量:”。
OleDbCommand cmd = new OleDbCommand();
cmd.Connection = Connection;
cmd.CommandTimeout = 0;

string commandText = "update groups set subjectline ='" +    txtSubjectLine.Text + "',data= @data where groupid = " + ddlGroup.SelectedItem.Value + " ";
cmd.CommandText = commandText;
cmd.CommandType = CommandType.Text;

cmd.Parameters.Add("@Data",OleDbType.VarBinary);
cmd.Parameters["@Data"].Value = binarydata;               
cmd.ExecuteNonQuery();

二进制数据已经包含了二进制值。 - Priscilla Jobin
SQL 2005是数据库。 - Priscilla Jobin
如果txtSubjectLine.Text包含一些不需要的字符怎么办?尝试将所有这些连接操作移到参数中。 - Adrian Iftode
仍然会出现相同的错误。 - Priscilla Jobin
2个回答

4
替换内容
string commandText = "update groups set subjectline ='" +    txtSubjectLine.Text + "',data= @data where groupid = " + ddlGroup.SelectedItem.Value + " ";

使用

string commandText = "update groups set subjectline ='" +    txtSubjectLine.Text + "',data= ? where groupid = " + ddlGroup.SelectedItem.Value + " ";

也就是说,在命令文本中用"?"替换"@data"。这就是您使用OleDbCommand指定参数占位符的方法。


以下为需要翻译的内容:

OleDbCommand cmd = new OleDbCommand();
cmd.Connection = Connection;
cmd.CommandTimeout = 0;

cmd.CommandText = "update groups set subjectline ='" + txtSubjectLine.Text + "', data = ? where groupid = " + ddlGroupSelectedItem.Value;
cmd.CommandType = CommandType.Text;

cmd.Parameters.Add("p1", OleDbType.VarBinary);
cmd.Parameters["p1"].Value = binarydata;

cmd.ExecuteNonQuery();

我得到了一个错误:'未为一个或多个必需的参数提供值。' - Priscilla Jobin
当您没有指定参数时(例如,使用cmd.Parameters.Add()),会出现此错误。以下是简化的工作代码:OleDbCommand cmd = new OleDbCommand(); cmd.Connection = new OleDbConnection("Data Source=.; Initial Catalog=Titles; Integrated Security=SSPI; Provider=SQLOLEDB;"); cmd.Connection.Open();cmd.CommandType = CommandType.Text; cmd.CommandText = "update titles set name = ? where id = 1"; cmd.Parameters.Add("p1", OleDbType.VarWChar); cmd.Parameters["p1"].Value = "new name";cmd.ExecuteNonQuery(); - m1kael
我只是在上述提到的代码中将@data更改为?,而保持cmd.Parameters.Add()不变。然后执行后,我收到了“未为一个或多个必需参数提供值”的错误信息。 - Priscilla Jobin
只需用我的编辑部分替换您的代码部分即可。 - m1kael

0

这个链接展示了如何使用.Write方法将二进制数据更新到表中的被接受答案。

http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/dc1b053d-f0d5-48f8-ad82-fb6d96d27f80

如果这不能解决你的问题,请继续阅读下面的内容:

你使用了变量 @data,但你声明的变量是 @Data,两者大小写不同。

在某些情况下,TSQL中的变量名称是区分大小写的。例如,如果安装了区分大小写的排序规则的MS Sql server,则表、列和变量名称将成为区分大小写的,即使数据库使用的是不区分大小写的排序规则。

请查看以下几个链接获取更多详细信息:

SQL Server中的区分大小写变量

SQL语法是否区分大小写?


现在我已经将变量Data更改为data,但仍然出现错误。 - Priscilla Jobin
为什么不使用SqlDbType而使用OleDBType? - Imran Rizvi
在找到一个被接受的答案后,我修改了回答,请查看:http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/dc1b053d-f0d5-48f8-ad82-fb6d96d27f80 - Imran Rizvi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接