dataReader.GetValue(i) 抛出 System.InvalidOperationException

dataReader.GetValue(i) throws System.InvalidOperationException

.Net 4.5/WPF/MVVM/ADO.Net/Oracle 11g/Oracle.DataAccess.Client

使用IDataReader接口


所以,我有 sealed BusinessObject 构建器 class,它接受一个 DataReader 对象,根据 PropertyMap 转换该 DataReader 中每个字段内的数据 - PropertyMap 从 class 和 returns 中检索 ListItem.

然后将此 ListItem 添加到 List,然后使用 List 处理数据,在 View 上显示数据等。

整个过程在我的应用程序中的其他地方工作得很好,今天我尝试使用 BusinessObject 构建器过程将一组新记录转换为列表并在我的仪表板中使用它。

本条目的属性映射如下。

-       pinfo   Count = 9   System.Collections.Generic.Dictionary<string,System.Reflection.PropertyInfo>
    +       [0] {[LATEST_LOAD_TIME, System.DateTime LATEST_LOAD_TIME]}  
    +       [1] {[LAST_DELIVERY, System.DateTime LAST_DELIVERY]}    
    +       [2] {[MAXVALDATE, System.DateTime MAXVALDATE]}  
    +       [3] {[MINVALDATE, System.DateTime MINVALDATE]}  
    +       [4] {[COMPLETED, Int32 COMPLETED]}  
    +       [5] {[FAILED, Int32 FAILED]}    
    +       [6] {[IN_PROGRESS, Int32 IN_PROGRESS]}  
    +       [7] {[NOT_STARTED, Int32 NOT_STARTED]}  
    +       [8] {[TOTAL, Int32 TOTAL]}

但是,一旦进程遇到下面的 if () 子句

for (int i = 0; i < dataReader.FieldCount; i++)
{
    if (dataReader.GetValue(i) != DBNull.Value)
    {
        try
        {   

它抛出一个 System.InvalidOperationException 异常。请参阅下面的完整异常详细信息。

+       dataReader  {Oracle.DataAccess.Client.OracleDataReader} System.Data.IDataReader {Oracle.DataAccess.Client.OracleDataReader}
-       dataReader.GetValue(i)  'dataReader.GetValue(i)' threw an exception of type 'System.InvalidOperationException'  object {System.InvalidOperationException}
    -           base    {"Operation is not valid due to the current state of the object."}  System.SystemException {System.InvalidOperationException}
        -       base    {"Operation is not valid due to the current state of the object."}  System.Exception {System.InvalidOperationException}
            +       Data    {System.Collections.ListDictionaryInternal} System.Collections.IDictionary {System.Collections.ListDictionaryInternal}
                        HelpLink    null    string
                        HResult -2146233079 int
            +       InnerException  null    System.Exception
                        Message "Operation is not valid due to the current state of the object."    string
                        Source  "Oracle.DataAccess" string
                        StackTrace  "   at Oracle.DataAccess.Client.OracleDataReader.GetValue(Int32 i)" string
            -       TargetSite  {System.Object GetValue(Int32)} System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo}
            +       [System.Reflection.RuntimeMethodInfo]   {System.Object GetValue(Int32)} System.Reflection.RuntimeMethodInfo
            -       base    {System.Object GetValue(Int32)} System.Reflection.MemberInfo {System.Reflection.RuntimeMethodInfo}
            +       CustomAttributes    Count = 0   System.Collections.Generic.IEnumerable<System.Reflection.CustomAttributeData> {System.Collections.ObjectModel.ReadOnlyCollection<System.Reflection.CustomAttributeData>}
            +       DeclaringType   {Name = "OracleDataReader" FullName = "Oracle.DataAccess.Client.OracleDataReader"}  System.Type {System.RuntimeType}
                        MemberType  Method  System.Reflection.MemberTypes
                        MetadataToken   100665607   int
            +       Module  {Oracle.DataAccess.dll} System.Reflection.Module {System.Reflection.RuntimeModule}
                    Name    "GetValue"  string
            +       ReflectedType   {Name = "OracleDataReader" FullName = "Oracle.DataAccess.Client.OracleDataReader"}  System.Type {System.RuntimeType}
                        Attributes  FamANDAssem | Family | Virtual | HideBySig  System.Reflection.MethodAttributes
                        CallingConvention   Standard | HasThis  System.Reflection.CallingConventions
                        ContainsGenericParameters   false   bool
                        IsAbstract  false   bool
                        IsAssembly  false   bool
                        IsConstructor   false   bool
                        IsFamily    false   bool
                        IsFamilyAndAssembly false   bool
                        IsFamilyOrAssembly  false   bool
                        IsFinal false   bool
                        IsGenericMethod false   bool
                        IsGenericMethodDefinition   false   bool
                        IsHideBySig true    bool
                        IsPrivate   false   bool
                        IsPublic    true    bool
                        IsSecurityCritical  true    bool
                        IsSecuritySafeCritical  true    bool
                        IsSecurityTransparent   false   bool
                        IsSpecialName   false   bool
                        IsStatic    false   bool
                        IsVirtual   true    bool
            +       MethodHandle    {System.RuntimeMethodHandle}    System.RuntimeMethodHandle
                        MethodImplementationFlags   IL  System.Reflection.MethodImplAttributes
            +       Non-Public members      
            +       Static members      
            +       Non-Public members  

我知道异常说

Message "Operation is not valid due to the current state of the object."

我认为 DataReader 可能已关闭,但事实并非如此。状态见下方

-       dataReader  {Oracle.DataAccess.Client.OracleDataReader} System.Data.IDataReader {Oracle.DataAccess.Client.OracleDataReader}
    +       [Oracle.DataAccess.Client.OracleDataReader] {Oracle.DataAccess.Client.OracleDataReader} Oracle.DataAccess.Client.OracleDataReader
            Depth   0   int
            IsClosed    false   bool
            RecordsAffected -1  int
    -       Results View    Expanding the Results View will enumerate the IEnumerable   
        -       [0] {System.Data.Common.DataRecordInternal} object {System.Data.Common.DataRecordInternal}
        -       base    {System.Data.Common.DataRecordInternal} System.Data.Common.DbDataRecord {System.Data.Common.DataRecordInternal}
                FieldCount  9   int
                FieldCount  9   int

此外,请查看 DataReader 记录确实包含值

-       _values {object[9]} object[]
                [0] 0   object {decimal}
                [1] 0   object {decimal}
                [2] 0   object {decimal}
                [3] 0   object {decimal}
                [4] 1502    object {decimal}
        +       [5] {}  object {System.DBNull}
        +       [6] {}  object {System.DBNull}
        +       [7] {5/5/2015 12:00:00 AM}  object {System.DateTime}
        +       [8] {4/30/2015 12:00:00 AM} object {System.DateTime}
        +       [1] {System.Data.Common.DataRecordInternal} object {System.Data.Common.DataRecordInternal}
        +       [2] {System.Data.Common.DataRecordInternal} object {System.Data.Common.DataRecordInternal}

最初数据记录中的第一项是 DateTime 类型,我认为可能是因为这个错误。所以我更改了序号列以将 int 类型的记录作为第一项 - 但仍然抛出异常。

我认为它与 GetValue() 方法有关,但不确定。

有人知道可能是什么问题以及任何建议/帮助吗?

抱歉代码/异常示例太长,但不想错过任何细节...

GetValue 应该 return DBNull 用于空值,但试试这个

if (!dataReader.isDBNull(i)) 
{
    ...
}

SqlDataReader.IsDBNull

或试试这个语法

if (!DBNull.Value.Equals(dataReader.GetValue(i))) 

我有同样的异常,因为我忘记在调用 reader.getValue(0) 之前调用 reader.Read() 方法。 也许对某人有帮助。