Sql server 2005 使用VARBINARY(MAX)参数调用存储过程失败,并显示奇怪的错误消息?

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[]类型的变量:

我正在尝试使用存储过程将加密数据存储到由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[]类型的变量:

        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