首先,感谢Marc Gravell和Sam Saffron让Dapper让宇宙变得更美好。
我是Async支持的新手。我在这里做错了什么?
foo.QueryAsync<long>(...)
以&#34失败;指定演员表无效&#34;但是foo.Query<long>(...)
在同一个上下文中成功返回。
QueryAsync
成功,因此我可以从返回的动态中获取值。我只是想了解为什么只有在使用异步方法时,long
的强制转换才会失败。
更多上下文,实际代码如下。没有取消令牌或任何东西 - 只是试图让它工作。
/// <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
则不产生。
为什么呢?