Вызов хранимой процедуры с параметрами VARBINARY (MAX) завершается неудачно со странным сообщением об ошибке? - PullRequest
1 голос
/ 29 декабря 2011

Я пытаюсь сохранить зашифрованные данные в своей базе данных (запущенной 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(), я получаю следующее сообщение об ошибке (извините за немецкий, я просто хотел предоставить оригинальный текст, я также предоставляю перевод ниже!):

Синтаксис Фальше в Nähe von '¿'.
Bezeichner (beginnend mit '* è ¯äÅõ42 ‹áºªž (± Z¦ññú> ¬ÕÕ] ¥ Qî) ÀÍE5 Fäø + ïµ1˜Z}» [- A [Åñ # šužÿÄ} µ} % АВД> TÛ¨¡ªƒ · г · SWFW

Вот английский перевод сообщения об ошибке (сделано мной, поэтому оно может и будет отличаться от канонического исходного сообщения об ошибке):

Синтаксическая ошибка рядом с '¿'.
Идентификатор (начинается с '* è ¯äÅõ42 ‹áºªž (± Z¦ññú> ¬ÕÕ] ¥ Qî) ÀÍE5 Fäø + ïµ1˜Z}» [- A [Åñ # šužÿÄ} µ} % АВД> TÛ¨¡ªƒ · г · SWFW

Кажется, что строка SQL анализируется неправильно и некоторые двоичные данные анализируются как имя идентификатора.

Я пробовал много разных подходов, используя .AddWithValue() и устанавливая свойства параметров один за другим - это не помогает.

Есть предложения?

1 Ответ

0 голосов
/ 30 декабря 2011

Решение уже было указано в комментариях, поэтому я просто отвечаю на вопрос здесь.

Проблема заключалась в использовании динамического 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'

И затем выполнить SQL, используя sp_executesql:

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