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

对于varbinary数据类型,DynamicParameters(Dapper)的正确用法是什么?,dapper,dynamicparameters,Dapper,Dynamicparameters,除其他外,存储过程还返回一个varbinary(max)作为输出。我不明白如何使用Dapper访问此信息 下面是一些简化的示例代码,说明了这个问题。我向StoredProcedure提供了一些参数,并希望返回一张照片,该照片在SQL Server上存储为varbinary(max) varbinary没有DbType。我尝试使用DbType.Binary,但这会导致Dapper中出现异常。如果我去掉photo参数,那么我希望得到的所有其他参数(为了简洁起见,从样本中删除)都正常工作。因此,唯一的

除其他外,存储过程还返回一个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 {}

        }
使用(var connection=new System.Data.SqlClient.SqlConnection(HelperClassesBJH.HelperMethods.ConString(“ProductionLocal”))
{
connection.Open();
DynamicParameters p=新的DynamicParameters();
p、 添加(“@OpID”,id,DbType.Int32,ParameterDirection.Input);
p、 添加(“@StageID”,Properties.Settings.Default.StageID,DbType.Int32,ParameterDirection.Input);
p、 添加(“@Photo”,dbType:dbType.Binary,方向:ParameterDirection.Output);
尝试
{
执行(sql、p、commandType:commandType.StoredProcess);
op.Photo=p.Get(“@Photo”);
}
捕获{}
}
更新:

我发现我必须在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 {}
DynamicParameters p=新的DynamicParameters();
MemoryStream b=新的MemoryStream();
p、 添加(“@OpID”,id,DbType.Int32,ParameterDirection.Input);
p、 添加(“@StageID”,Properties.Settings.Default.StageID,DbType.Int32,ParameterDirection.Input);
p、 添加(“@Photo”,b,DbType.Binary,方向:ParameterDirection.Output);
尝试
{
执行(sql、p、commandType:commandType.StoredProcess);
op.Photo=p.Get(“@Photo”);
}
捕获{}
这将导致检索包含预期图像数据的字节数组。

您可以尝试:

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

它似乎在本地为我工作,这就是
varchar(max)
nvarchar(max)
映射的方式(除了分别作为
DbType.AnsiString和
DbType.String
),所以它是一致的。

我的发现是我必须提供“对象值”(它在DynamicParameters构造函数中),即使参数是一个输出,我提供的值也不会被使用。因为我不能提供byte[]值(不知道长度),所以我用一个MemoryStream对象尝试了一下,结果成功了。我无法显示图像,但字节数组中的数据存在,因此这可能是另一个问题。我尝试了你的方法,得到了与以前相同的异常。@Q''这很奇怪-我在本地尝试了它,并发布了确切的代码;你到底看到了什么例外?(您从未说过)我遇到以下异常:“无法将类型为'System.Int32'的对象强制转换为类型为'System.Byte[]”。它出现在:at Dapper.DynamicParameters.get[T](字符串名称)中的C:\projects\Dapper\Dapper\DynamicParameters.cs:line中329@Q""那里很奇怪,;我组装了一个测试装置,它看起来很合适(在程序等方面),并且工作得很好;您确定您复制的行正确吗?如果这是一个糟糕的问题,很抱歉,但是:它在这里工作得非常好。非常感谢您花自己的时间来看它@marc gravel。我把这行抄对了。我不知道,也许这和狂欢结束有关。好吧,我已经通过为DynamicParameter构造函数提供一个不被使用的“值”使它目前工作得很好!如果我将该值取回来,它将返回到异常。如果我加上尺寸:-1,这样我的线条看起来和你的一样,同样的例外。