Comment puis-je utiliser les paramètres de requête fortement typés de Dapper avec Sybase ASE?

.net ado.net dapper sybase-ase

Question

Dapper peut transmettre des paramètres de requête en tant qu'objets anonymes et prend en charge tous les fournisseurs de données ADO.NET. Toutefois, lors de l'exécution de la requête suivante sur les pilotes Sybase 15 ADO.NET:

using (var connection = new AseConnection("..."))
{
    connection.Open();

    var results = connection.Query<Foo>(
        "dbo.sp_columns", new { table_name = "dbo.sysusers"}, 
        commandType: CommandType.StoredProcedure);
}

... l'erreur suivante est renvoyée:

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

Le changer en Dapper DynamicParameters avec "@ nom_table" ne fonctionne pas non plus.

Comment passer des paramètres fortement typés à Sybase avec Dapper?

Réponse acceptée

Pour autant que je AseParameter , la raison semble être AseParameter classe AseParameter de Sybase et ne pas mapper correctement DbType aux valeurs AseDbType .

Vous pouvez contourner le problème en définissant un ensemble personnalisé Dapper IDynamicParameters et en le AseParameter directement avec les objets AseParameter :

public class AseCommandParameters : List<AseParameter>, SqlMapper.IDynamicParameters
{
    public void AddParameters(IDbCommand command, SqlMapper.Identity identity)
    {
        foreach (var parameter in this)
            command.Parameters.Add(parameter);
    }
}

Et puis en passant une instance dans la requête:

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);
}

Cela fonctionne et vous permet également de spécifier le type AseDbType pour chaque paramètre.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi