Как я могу использовать твердые параметры запроса Dapper с Sybase ASE?
-
27-10-2019 - |
Вопрос
Озвученная может передать параметры запроса в качестве анонимных объектов и поддерживает любого поставщика данных ADO.net. Однако при выполнении следующего запроса против драйверов 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);
}
... брошена следующая ошибка:
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
Изменение его на ошеломление DynamicParameters
Установить с "@table_name" также не работает.
Как я могу перенести параметры сильного типа в Sybase с Dapper?
Решение
Насколько я могу судить, причина, по -видимому, связана с Sybase's AseParameter
класс, а не правильно отображать DbType
к AseDbType
ценности.
Вы можете обойти эту проблему, определив пользовательский ошеломляющий IDynamicParameters
установить и заполнять его 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);
}
}
А затем передавая экземпляр в запрос:
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);
}
Это работает, а также позволяет указать AseDbType
Для каждого параметра.