Dapper .QueryAsync <long>仅在异步</long>时失败并出现强制转换错误

时间:2014-12-20 22:38:11

标签: c# oracle11g .net-4.5 dapper

首先,感谢Marc Gravell和Sam Saffron让Dapper让宇宙变得更美好。

我是Async支持的新手。我在这里做错了什么?

foo.QueryAsync<long>(...)以&#34失败;指定演员表无效&#34;但是foo.Query<long>(...)在同一个上下文中成功返回。

当我没有指定类型时,

QueryAsync成功,因此我可以从返回的动态中获取值。我只是想了解为什么只有在使用异步方法时,long的强制转换才会失败。

Error detail

更多上下文,实际代码如下。没有取消令牌或任何东西 - 只是试图让它工作。

/// <summary>Handles read requests for table contents</summary>
/// <param name="metaData">Metadata for the editor associated with the target table</param>
/// <param name="readRequest">Data containing information needed for the request</param>
public static async Task<ReadResponseModel> ReadAsync(tm_editor metaData, ReadRequestModel readRequest)
{
    DbProviderFactory dbFactory = DbProviderFactories.GetFactory(metaData.Connection.ProviderName);
    IEnumerable<IDictionary<string, object>> data;
    long rowCount = 0;
    string flexKeyCol;
    var parms = new Dictionary<string, object>();

    using(DbConnection connection = dbFactory.CreateConnection()) {
        connection.ConnectionString = metaData.Connection.ConnectionString;
        string selectSql = SqlBuilderModel.Select(readRequest, metaData, dbFactory, out parms, out flexKeyCol);
        string rowCountSql = SqlBuilderModel.rowCount(dbFactory, metaData.TableName);
        var dataTask = connection.QueryAsync(selectSql, new DynamicParameters(parms));
        var countTask = connection.QueryAsync<long>(rowCountSql); // TODO: Cache rowCount
        await Task.WhenAll(countTask, dataTask);
        data = dataTask.Result.Select(row => (row as IDictionary<string, object>));
        if(countTask.Result.Any())
            rowCount = countTask.Result.First();
    }
    ...

编辑: 使用connection.QueryAsync<String>会产生小数 - &gt;字符串转换错误。 当然,下一个试验是:connection.QueryAsync<Decimal>,它很高兴地返回一个十进制。 因此,.QueryAsync或其与驱动程序的交互(Oracle.ManagedDataAccess.Client)似乎产生小数,而.Query则不产生。 为什么呢?

0 个答案:

没有答案