【问题标题】:How can I use Dapper's strongly-typed query parameters with Sybase ASE?如何在 Sybase ASE 中使用 Dapper 的强类型查询参数?
【发布时间】:2012-03-14 06:51:01
【问题描述】:

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

将其更改为使用“@table_name”设置的 Dapper DynamicParameters 也不起作用。

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

【问题讨论】:

    标签: .net ado.net sap-ase dapper


    【解决方案1】:

    据我所知,原因似乎与 Sybase 的 AseParameter 类有关,而不是将 DbType 正确映射到 AseDbType 值。

    您可以通过定义自定义 Dapper 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

    【讨论】:

    • 这很有趣!我想不出一个干净的方法来把它变成“核心”库,但是......令人着迷。
    • 我在这里删除了 wiki ... 不明白这一点,这几乎就是 IDynamicParameters 的原因,我赞成很好的用法。
    • 还建议您在此处使用 sybase 开票...他们是我所知道的第一个 this 损坏的供应商
    • 您的解决方案对我帮助很大。奇怪的是这个问题最初是在 2011 年描述的,现在是 2016 年,仍然没有修复。你能告诉我在哪里可以报告这个错误吗?
    • 现在是 2018 年,Sybase 更加损坏,甚至与 dotnet Core 不兼容略微。我们将其替换为 MSSQL,仅出于兼容性原因。我想知道他们认为他们的客户到底是谁。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    相关资源
    最近更新 更多