Как правильно использовать DynamicParameters (Dapper) для типа данных varbinary? - PullRequest
0 голосов
/ 06 февраля 2019

Хранимая процедура, помимо прочего, возвращает varbinary (max) в качестве OUTPUT.Я не могу понять, как получить доступ к этой информации с помощью Dapper.

Ниже приведен сокращенный пример кода, который иллюстрирует проблему.Я предоставляю некоторые параметры для StoredProcedure и ожидаю получить фотографию, которая хранится в SQL как varbinary (max).

Для varbinary нет DbType.Я попытался использовать DbType.Binary, но это вызывает исключение в Dapper.Если я уберу параметр фото, все остальные параметры, которые я собираюсь вернуть (которые вырезаны из образца для краткости), работают.Таким образом, единственная проблема заключается в получении данных varbinary.

Как правильно достичь этого?

using (var connection = new System.Data.SqlClient.SqlConnection(HelperClassesBJH.HelperMethods.ConString("ProductionLocal")))
        {
            connection.Open();

            DynamicParameters p = new DynamicParameters();

            p.Add("@OpID", id, DbType.Int32, ParameterDirection.Input);
            p.Add("@StageID", Properties.Settings.Default.StageID, DbType.Int32, ParameterDirection.Input);               
            p.Add("@Photo", dbType: DbType.Binary, direction: ParameterDirection.Output);                

            try
            {
                connection.Execute(sql, p, commandType: CommandType.StoredProcedure);

                op.Photo = p.Get<byte[]>("@Photo");                    
            }
            catch {}

        }

ОБНОВЛЕНИЕ:

Я обнаружил, что должен предоставитьпараметр 'value' в конструкторе DynamicParameters.Это позволяет избежать исключения, которое я получаю.Я не могу понять, почему мне нужно предоставить значение, так как параметр является выходным, а значение, которое я предоставляю, не используется.Вот исправленный код:

DynamicParameters p = new DynamicParameters();
MemoryStream b = new MemoryStream();

p.Add("@OpID", id, DbType.Int32, ParameterDirection.Input);
p.Add("@StageID", Properties.Settings.Default.StageID, DbType.Int32, ParameterDirection.Input);                
p.Add("@Photo", b, DbType.Binary, direction: ParameterDirection.Output);                

try
  {
     connection.Execute(sql, p, commandType: CommandType.StoredProcedure);

     op.Photo = p.Get<byte[]>("@Photo");
  }
 catch {}

Это приводит к получению байтового массива, который содержит ожидаемые данные изображения.

1 Ответ

0 голосов
/ 06 февраля 2019

Вы можете попробовать:

p.Add("@Photo", dbType: DbType.Binary, direction: ParameterDirection.Output, size: -1);

Кажется, это работает для меня локально, и именно так varchar(max) и nvarchar(max) отображаются (кроме как DbType.AnsiString и DbType.String, соответственно), так что было бы согласованно.

...