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?
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.