将GetFieldValueAsync与GetFieldType中的类型一起使用



我有一个通用读取器,我想将它从同步转换为异步。

原始代码为

while (DR.Read())
{
count++;
Field[] fields = new Field[DR.FieldCount];
for (int i = 0; i < DR.FieldCount; i++)
{
Field field = new Field();
field.RowCount = count;
field.FieldCount = i;
field.Name = DR.GetName(i);
field.DataType = DR.GetDataTypeName(i);
// decimal overflow workaround 
field.ObjValue =
field.DataType == "Decimal"?
DR.GetDouble(i) :
DR.GetValue(i);
fields[i] = field;
}
yield return fields;
}

而且还可以。我试图做的是

List<Field[]> ret = new List<Field[]>();
while (await DR.ReadAsync())
{
count++;
Field[] fields = new Field[DR.FieldCount];
for (int i = 0; i < DR.FieldCount; i++)
{
Field field = new Field();
field.RowCount = count;
field.FieldCount = i;
field.Name = DR.GetName(i);
field.DataType = DR.GetDataTypeName(i);
// decimal overflow workaround 
field.ObjValue =
field.DataType == "Decimal" ?
((object)await DR.GetFieldValueAsync<double>(i)) :
((object)await DR.GetFieldValueAsync(i));
fields[i] = field;
}
ret.Add(fields);
}

由于错误CS0411 而无法工作

方法"GetFieldValueAsync"的类型参数不能为根据用法推断。请尝试显式指定类型参数。

我也尝试过从Type t = DR.GetFieldType(i)指定类型,但我也不能指定await DR.GetFieldValueAsync<t>(i)

我在这里运气不好吗?

我应该在异步方法中恢复到以下阻塞代码吗?

// decimal overflow workaround 
field.ObjValue =
field.DataType == "Decimal" ?
DR.GetDouble(i) :
DR.GetValue(i);

为什么没有DR.GetValueAsync(i)返回像同步对应对象一样的对象,这有理论上的原因吗??

次要注释,脱离主题

如果有人坚持要知道我为什么要为十进制编写不同的代码,这就是问题所在。

我猜你说的是DbDataReader类。

来自文件:

从数据源读取仅向前的行流。

read或ReadAsync读取该行后,该行的值将全部在内存中,这不需要任何I/O,因此不需要异步。

更新:

事实证明,DbDataReader类中有一个GetFieldValueAsync方法,但没有GetValueAsync方法。

相关内容

  • 没有找到相关文章

最新更新