Сервер Sql, проблема с вставкой и/или выбором двоичных данных

У меня возникла проблема со вставкой или выбором данных из столбца varbinary(max) в моей базе данных (это локальная БД), и я не могу понять, почему.

Я добавляю двоичные данные из приложения C# следующим образом.

SqlConnection con = new SqlConnection("<connection string...>");            
SqlCommand cmd = new SqlCommand("sp_test_varbinary", con);

cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add("@content", SqlDbType.VarBinary, -1).Value = Convert.FromBase64String("<base64 string>");

con.Open();
cmd.ExecuteNonQuery();
con.Close();

Хранимая процедура sp_test_varbinary принимает только один параметр @content и вставляет его в столбец varbinary(max) — пока все работает, как и ожидалось. Я не могу сказать, что находится в столбце varbinary(max), так как там просто написано binary data, но там хоть что-то есть.

Затем, когда я пытаюсь выбрать строку, которую я только что вставил, и пытаюсь вернуть исходную строку base64, которая у меня была изначально, что-то идет не так или данные в поле неверны.

Я делаю следующее (file_id — это идентификатор строки, которую я добавил).

SqlDataAdapter da = new SqlDataAdapter("SELECT [content] FROM [BaseFiles] WHERE ([file_id] = '" + file_id + "');", con);
DataSet ds = new DataSet();

da.Fill(ds);

string base64 = Convert.ToBase64String((byte[])ds.Tables[0].Rows["content"]);

Однако на данный момент переменная base64 содержит только значение:

7w==

Любая идея, что мне не хватает, чтобы сделать эту работу?


person Aidal    schedule 16.04.2018    source источник


Ответы (1)


Глядя на ваш результат, вы, скорее всего, не указали длину VARBINARY ни в своей хранимой процедуре, ни в таблице, ни в коде внутри хранимой процедуры.

Убедитесь, что при объявлении переменной VARBINARY вы включили определение MAX в свое объявление. Пример вашей хранимой процедуры должен быть объявлен следующим образом:

CREATE PROCEDURE [dbo].[sp_test_varbinary]
    @content AS VARBINARY(MAX)
AS
BEGIN

    SET NOCOUNT ON;

    -- YOUR INSERT STATEMENT HERE

END

И не объявляется следующим образом:

CREATE PROCEDURE [dbo].[sp_test_varbinary]
    @content AS VARBINARY
AS
BEGIN

    SET NOCOUNT ON;

    -- YOUR INSERT STATEMENT HERE

END

Аналогично убедитесь, что если вы используете локальные переменные VARBINARY в своей хранимой процедуре, их длина также определена. Наконец, убедитесь, что длина VARBINARY определена в столбце [content] в вашей таблице.

person Edmond Quinton    schedule 16.04.2018