Eine gespeicherte Prozedur gibt unter anderem ein varbinary (max) als OUTPUT zurück. Ich kann nicht verstehen, wie ich mit Dapper auf diese Informationen zugreifen kann.
Nachfolgend finden Sie einen Code-Code, der das Problem veranschaulicht. Ich gebe einer StoredProcedure einige Parameter und erwarte, ein Foto zurückzugeben, das als varbinary (max) auf dem SQL Server gespeichert ist.
Es gibt keinen DbType für Varbinary. Ich habe versucht, DbType.Binary zu verwenden, aber dies verursacht eine Ausnahme in Dapper. Wenn ich den Fotoparameter wegnehme, funktionieren alle anderen Parameter, die ich voraussichtlich zurückbekomme (die der Kürze halber aus der Stichprobe herausgeschnitten wurden). Das einzige Problem ist also das Abrufen der varbinary-Daten.
Was ist der richtige Weg, um dies zu erreichen?
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 {}
}
AKTUALISIEREN:
Ich habe festgestellt, dass ich den Parameter 'value' im DynamicParameters-Konstruktor angeben muss. Dies vermeidet die Ausnahme, die ich bekam. Ich kann nicht verstehen, warum ich einen Wert angeben muss, da der Parameter eine Ausgabe ist und der Wert, den ich zur Verfügung stelle, nicht verwendet wird. Hier ist der überarbeitete Code:
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 {}
Dies führt zum Abrufen eines Byte-Arrays, das die erwarteten Bilddaten enthält.
Du könntest es versuchen:
p.Add("@Photo", dbType: DbType.Binary, direction: ParameterDirection.Output, size: -1);
Es scheint für mich lokal zu funktionieren, und so werden varchar(max)
und nvarchar(max)
zugeordnet (außer DbType.AnsiString
und DbType.String
), so dass es konsistent wäre.