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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top