Wie kann ich Dappers starke Abfrageparameter mit Sybase ASE verwenden?
-
27-10-2019 - |
Frage
Dapper Kann Abfrageparameter als anonyme Objekte übergeben und unterstützt jeden ADO.NET -Datenanbieter. Bei der Ausführung der folgenden Abfrage gegen die Sybase 15 ADO.NET -Treiber:
using (var connection = new AseConnection("..."))
{
connection.Open();
var results = connection.Query<Foo>(
"dbo.sp_columns", new { table_name = "dbo.sysusers"},
commandType: CommandType.StoredProcedure);
}
... Der folgende Fehler wird geworfen:
Sybase.Data.AseClient.AseException: Procedure sp_columns expects parameter @table_name, which was not supplied.
at Sybase.Data.AseClient.AseCommand.ᜁ(Int32 A_0)
at Sybase.Data.AseClient.AseCommand.ᜄ()
at Sybase.Data.AseClient.AseCommand.ᜀ(CommandBehavior A_0)
at Sybase.Data.AseClient.AseCommand.System.Data.IDbCommand.ExecuteReader()
at Dapper.SqlMapper.<QueryInternal>d__13`1.MoveNext() in SqlMapper.cs: line 579
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList(IEnumerable`1 source)
at Dapper.SqlMapper.Query(IDbConnection cnn, String sql, Object param, IDbTransaction transaction, Boolean buffered, Nullable`1 commandTimeout, Nullable`1 commandType) in SqlMapper.cs: line 536
Ändern Sie es in einen adretten DynamicParameters
Setzen Sie mit "@Table_Name" auch nicht.
Wie kann ich starke Parameter mit Dapper an Sybase übergeben?
Lösung
Soweit ich das beurteilen kann, scheint der Grund etwas mit Sybases zu tun zu haben AseParameter
Klasse und nicht korrekt abgebildet DbType
zu AseDbType
Werte.
Sie können das Problem umgehen, indem Sie einen benutzerdefinierten Dapper definieren IDynamicParameters
Setzen Sie es und bevölkern es mit AseParameter
Objekte direkt:
public class AseCommandParameters : List<AseParameter>, SqlMapper.IDynamicParameters
{
public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
{
foreach (var parameter in this)
command.Parameters.Add(parameter);
}
}
Und dann eine Instanz in die Abfrage weitergeben:
using (var connection = new AseConnection("..."))
{
connection.Open();
var parameters = new AseCommandParameters
{
new AseParameter("@table_name", "dbo.sysusers")
};
var results = connection.Query<Foo>("dbo.sp_columns", parameters,
commandType: CommandType.StoredProcedure);
}
Dies funktioniert und ermöglicht es auch, die anzugeben AseDbType
Für jeden Parameter.