我正在尝试使用存储过程将加密数据存储到我的数据库中(由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()
并逐个设置参数属性 - 这没有帮助。
有任何建议吗?
答案 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