Как правильно использовать DynamicParameters (Dapper) для типа данных varbinary?
Хранимая процедура, помимо прочего, возвращает varbinary(max) в качестве OUTPUT. Я не могу понять, как получить доступ к этой информации с помощью Dapper.
Ниже приведен сокращенный пример кода, который иллюстрирует проблему. Я предоставляю некоторые параметры StoredProcedure и ожидаю получить фотографию, которая хранится в виде varbinary(max) на SQL Server.
Для 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 ответ
Вы можете попробовать:
p.Add("@Photo", dbType: DbType.Binary, direction: ParameterDirection.Output, size: -1);
Кажется, это работает для меня на местном уровне, и вот как varchar(max)
а также nvarchar(max)
сопоставлены (кроме как DbType.AnsiString
а также DbType.String
соответственно), так что будет согласованно.