使用VARBINARY(MAX)参数的存储过程调用失败,出现奇怪的错误消息?

时间:2011-12-29 19:41:06

标签: 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[]的变量和我的数据:

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

每当我尝试拨打ExecuteNonQuery()时,我都会收到以下错误消息(对不起德语,我只是想提供原始文本,我也提供以下翻译!):

  

Falsche Syntax inderNähevon'¿'   Bezeichner(beginnend mit'*è   ääÅõ42<Ẫž(±Z |ññú>¬ÕÕ)¥Qî)ÀÍE5Fäø+ïμ1〜Z}»[ - A [Åñ#šužÿÄ}}   %AVD&GT;TÛ¨¡ªƒ·克·SWFW

以下是错误消息的英文翻译(由我完成,因此它可能会偏离canonic原始错误消息):

  

'¿'附近的语法错误。
  标识符(以'*è开头)   ääÅõ42<Ẫž(±Z |ññú>¬ÕÕ)¥Qî)ÀÍE5Fäø+ïμ1〜Z}»[ - A [Åñ#šužÿÄ}}   %AVD&GT;TÛ¨¡ªƒ·克·SWFW

似乎SQL字符串被解析,并且一些二进制数据被解析为标识符名称。

我在这里尝试了许多不同的方法,使用.AddWithValue()并逐个设置参数属性 - 这没有帮助。

有任何建议吗?

1 个答案:

答案 0 :(得分:0)

解决方案已在评论中指出,所以我在这里回答这个问题。

问题在于在存储过程中使用动态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:

exec sp_executesql @sql, @params, @ForeignKey, @FileName, @Data