varbinary数据类型对DynamicParameters(Dapper)的正确用法是什么?

时间:2019-02-06 15:44:45

标签: dapper dynamicparameters

除其他外,存储过程返回varbinary(max)作为输出。我不明白如何使用Dapper访问此信息。

下面是一些简化的示例代码,它们说明了该问题。我向StoredProcedure提供了一些参数,我希望取回在SQL Server中存储为varbinary(max)的照片。

没有varbinary的DbType。我尝试使用DbType.Binary,但这在Dapper中导致异常。如果我删除了photo参数,那么我希望取回的所有其他参数(为简洁起见,将它们从样本中删除)正在起作用。因此,唯一的问题是检索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 {}

        }

更新:

我发现我必须在DynamicParameters构造函数中提供'value'参数。这样可以避免我得到的异常。我不明白为什么我需要提供一个值,因为该参数是输出并且我提供的值没有被使用。这是修改后的代码:

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 :(得分:0)

您可以尝试:

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

这似乎在本地对我有用,这就是varchar(max)nvarchar(max)的映射方式(分别为DbType.AnsiStringDbType.String除外),因此一致。