将 GetFieldValueAsync 与 GetFieldType 中的类型一起使用
using GetFieldValueAsync with type from GetFieldType
我有一个通用的 reader,我想将它从同步转换为异步。
原代码为
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
而无法正常工作
The type arguments for method 'GetFieldValueAsync
' cannot be
inferred from the usage. Try specifying the type arguments explicitly.
我也试过从 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)
返回像同步对象那样的对象有理论上的原因吗??
小记,题外话
如果有人坚持要知道我为什么要为十进制编写不同的代码,this is the issue。
我假设你在谈论 DbDataReader
Class。
来自文档:
Reads a forward-only stream of rows from a data source.
一旦 Read or ReadAsync 读取该行,该行的值将全部存储在内存中,不需要任何 I/O,因此不需要异步。
更新:
原来,DbDataReader
Class中有GetFieldValueAsync
方法,但没有GetValueAsync
方法。
我有一个通用的 reader,我想将它从同步转换为异步。
原代码为
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
而无法正常工作The type arguments for method '
GetFieldValueAsync
' cannot be inferred from the usage. Try specifying the type arguments explicitly.
我也试过从 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)
返回像同步对象那样的对象有理论上的原因吗??
小记,题外话
如果有人坚持要知道我为什么要为十进制编写不同的代码,this is the issue。
我假设你在谈论 DbDataReader
Class。
来自文档:
Reads a forward-only stream of rows from a data source.
一旦 Read or ReadAsync 读取该行,该行的值将全部存储在内存中,不需要任何 I/O,因此不需要异步。
更新:
原来,DbDataReader
Class中有GetFieldValueAsync
方法,但没有GetValueAsync
方法。