.net 我如何使用Dapper';s使用Sybase ASE的强类型查询参数?

.net 我如何使用Dapper';s使用Sybase ASE的强类型查询参数?,.net,ado.net,sap-ase,dapper,.net,Ado.net,Sap Ase,Dapper,可以将查询参数作为匿名对象传递,并支持任何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.sysuser

可以将查询参数作为匿名对象传递,并支持任何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);
}
使用(var-connection=new-AseConnection(“…”)
{
connection.Open();
var results=connection.Query(
“dbo.sp_columns”,新的{table_name=“dbo.sysusers”},
commandType:commandType.StoredProcess);
}
。。。将引发以下错误:

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
Sybase.Data.AseClient.aseception:过程sp_columns需要参数@table_name,但未提供该参数。
在Sybase.Data.AseClient.AseCommand上。ᜁ(Int32 A_0)
在Sybase.Data.AseClient.AseCommand上。ᜄ()
在Sybase.Data.AseClient.AseCommand上。ᜀ(命令行为A_0)
在Sybase.Data.AseClient.AseCommand.System.Data.IDbCommand.ExecuteReader()中
在SqlMapper.cs中的Dapper.SqlMapper.d_u13`1.MoveNext()处:第579行
位于System.Collections.Generic.List`1..ctor(IEnumerable`1集合)
at System.Linq.Enumerable.ToList(IEnumerable`1源)
在SqlMapper.cs中的Dapper.SqlMapper.Query(IDbConnection cnn、字符串sql、对象参数、IDbTransaction transaction、布尔缓冲、可为null的`1 commandTimeout、可为null的`1 commandType):第536行
将其更改为带有“@table\u name”的简洁的
DynamicParameters
集也不起作用


如何使用Dapper将强类型参数传递给Sybase?

据我所知,原因似乎与Sybase的
AseParameter
类有关,并且没有正确地将
DbType
映射到
AseDbType

您可以通过定义自定义Dapper
IDynamicParameters
set,并直接用
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);
    }
}
public类AseCommandParameters:List,SqlMapper.IDynamicParameters
{
public void AddParameters(IDbCommand,SqlMapper.Identity)
{
foreach(此字段中的var参数)
command.Parameters.Add(参数);
}
}
然后将实例传递到查询中:

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);
}
使用(var-connection=new-AseConnection(“…”)
{
connection.Open();
var参数=新参数
{
新参数(“@table_name”,“dbo.sysusers”)
};
var results=connection.Query(“dbo.sp_列”,参数,
commandType:commandType.StoredProcess);
}

这可以工作,还可以为每个参数指定
AseDbType

这非常有趣!我想不出一个干净的方法来把它变成“核心”库,但是。。。太棒了,我把维基删除了。。。我不认为这有什么意义,这就是为什么我要使用IDynamicParameters,我赞成它的好用法。我还建议你在这里向sybase开一张罚单。。。他们是我所知道的第一家经纪公司。你的解决方案帮了我很大的忙。奇怪的是,这个问题最初是在2011年描述的,现在是2016年,它仍然没有得到解决。你能告诉我在哪里可以报告这个错误的更多细节吗?现在是2018年,Sybase甚至更坏,甚至与dotnet Core不兼容。我们正在用MSSQL替换它,除了兼容性之外没有其他原因。我想知道他们认为他们的客户到底是谁。