Sql server 2005 使用VARBINARY(MAX)参数调用存储过程失败,并显示奇怪的错误消息?
我正在尝试使用存储过程将加密数据存储到由MS SQL 2005 Express运行的数据库中 存储过程具有以下签名:Sql server 2005 使用VARBINARY(MAX)参数调用存储过程失败,并显示奇怪的错误消息?,sql-server-2005,stored-procedures,ado.net,varbinary,Sql Server 2005,Stored Procedures,Ado.net,Varbinary,我正在尝试使用存储过程将加密数据存储到由MS SQL 2005 Express运行的数据库中 存储过程具有以下签名: ALTER PROCEDURE [dbo].[SaveData] @FileName AS NVARCHAR(255), @Data As VARBINARY(MAX), @Key AS VARBINARY(MAX) = NULL, @Final AS BIT = NULL AS .... 在我的代码中,我的数据有两个byte[]类型的变量:
ALTER PROCEDURE [dbo].[SaveData]
@FileName AS NVARCHAR(255),
@Data As VARBINARY(MAX),
@Key AS VARBINARY(MAX) = NULL,
@Final AS BIT = NULL
AS
....
在我的代码中,我的数据有两个byte[]类型的变量:
public byte[] EncryptedData { get; set; }
public byte[] EncryptedPassword { get; set; }
var cmd = new SqlCommand("SaveData", conn);
cmd.CommandTimeout = 0;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddWithValue("@FileName", FileName);
cmd.Parameters.Add(new SqlParameter("@Data", SqlDbType.VarBinary, EncryptedData.Length, ParameterDirection.Input, false, 0, 0, "", DataRowVersion.Current, (SqlBinary) EncryptedData));
cmd.Parameters.Add(new SqlParameter("@Key", SqlDbType.VarBinary, EncryptedPassword.Length, ParameterDirection.Input, false, 0, 0, "", DataRowVersion.Current, (SqlBinary)EncryptedPassword));
cmd.Parameters.AddWithValue("@Final", true);
每当我尝试调用ExecuteOnQuery时,我都会收到以下错误消息对不起,德语,我只想提供原文,我还提供下面的翻译!:
Nähe von'?'中的Falsche语法。
贝塞奇纳在麻省理工学院毕业
ääõ42èèèèèèèèèèèèèèèèèèèèèèèèèè
%ãVð>TÛƒg·SWFW
以下是我对错误消息的英文翻译,因此它可能会偏离规范的原始错误消息:
“?”附近的语法错误。
以“*è”开头的标识符
ääõ42èèèèèèèèèèèèèèèèèèèèèèèèèè
%ãVð>TÛƒg·SWFW
似乎SQL字符串被间接解析,一些二进制数据被解析为标识符名称
我在这里尝试了许多不同的方法,使用.AddWithValue并逐个设置参数属性-这没有帮助
有什么建议吗?在评论中已经指出了解决方案,所以我只在这里回答问题 问题在于使用动态SQL在存储过程中串联SQL字符串,下面是一个示例:
select @sql = 'insert into dbo.DMSFileData ('
...
select @sql = @sql + ') VALUES ('
select @sql = @sql + '''' + @FileName + ''''
select @sql = @sql + '''' + convert(varchar(max), @Data) + ''''
正确的解决方案是在串联中使用参数:
select @sql = @sql + ', @filename'
select @sql = @sql + ', @filedata'
然后使用sp_executesql执行SQL:
存储过程是什么样子的?它使用动态SQL吗?如果注释掉存储过程中的所有代码,您仍然会看到错误吗?是的,您完全正确,我们只使用字符串的串联:我们如何以正确的方式实现它?请研究使用sp_executesql,然后您仍然可以为大多数存储过程使用参数。
exec sp_executesql @sql, @params, @ForeignKey, @FileName, @Data