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))
{
...
}
或试试这个语法
if (!DBNull.Value.Equals(dataReader.GetValue(i)))
我有同样的异常,因为我忘记在调用 reader.getValue(0)
之前调用 reader.Read()
方法。
也许对某人有帮助。
.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))
{
...
}
或试试这个语法
if (!DBNull.Value.Equals(dataReader.GetValue(i)))
我有同样的异常,因为我忘记在调用 reader.getValue(0)
之前调用 reader.Read()
方法。
也许对某人有帮助。