背景资料:
我们使用强类型DataSet来管理事务文件。也就是说,DataSet不使用任何类型的数据库作为其后备存储;相反,DataSet用于读取和写入XML文件到磁盘。 WriteXml(fileName As String)用于输出特定的数据行,其他表中的所有相关行自动嵌入到输出中。
ReadXml方法用于在启动时加载这些文件。
最初,这个类是用VB.NET中的代码生成工具生成的。但是,由于该系统已经到位,因此已经进行了许多手动修改。即重生这些课程在这一点上并不是一个真正的选择(你喜欢Boo和嘶嘶声;我没有这样做)。
在现场使用我们系统的客户经历了一个奇怪的例外;一个我们不能轻易复制的。基本上,一个案例发生在系统试图读取DataSet中已有的事务的值,并导致“InvalidCastException”。
(顺便说一句:我们的系统运行在一个简化的WinCE系统上,使用Compact Framework v3.5;因为它是简单的,没有安装提供异常消息的CAB文件,但考虑到它的上下文,我可以做得很好猜...)
如果我理解正确,当从具有DBNull值的DataSet访问强类型属性时,就会发生这种情况。
如果这就是全部,我就不会写这个。
但是,该列的问题是其“AllowDBNulls”属性设置为False。我已经检查并重新检查了这一点,并确认 被设置为False。
所以...这不应该是不可能的吗?当此属性设置为False时,如何发生InvalidCastException?
以下是一些代码片段确实展示了我们在设置列时所做的工作:
Private Sub InitClass()
'Snip...'
Me.columnTransactionMode = DatasetUtilities.addColumn(Me.Columns, "transactionMode", GetType(System.Int32), False, False)
'Snip...'
End Sub
DatasetUtilities.addColumn方法:
Friend Shared Function addColumn(ByRef columns As Data.DataColumnCollection, _
ByRef columnName As String, ByRef type As Type, _
ByRef allowDBNull As Boolean, ByRef isUnique As Boolean) As Data.DataColumn
Dim column As Data.DataColumn
column = New Data.DataColumn(columnName, type, Nothing, System.Data.MappingType.Attribute)
columns.Add(column)
column.AllowDBNull = allowDBNull
column.Unique = isUnique
Return column
End Function
CustomerTransactionRow类的transactionMode属性:
Public Property transactionMode() As Integer
Get
Return CType(Me(Me.tableCustomerTransaction.transactionModeColumn), Integer)
End Get
Set(ByVal Value As Integer)
Me(Me.tableCustomerTransaction.transactionModeColumn) = Value
End Set
End Property
这是我们迄今为止第一次也是唯一一份此问题的报告。我将通过异常处理尽可能地防止这种情况再次发生。但是,如果我确切知道问题发生的原因,我会感觉好多了。
谢谢你的时间,全部!
答案 0 :(得分:0)
尝试为任何不允许NULL的列设置默认值。我最近遇到类似的情况,其中AllowDBNull设置为false,但如果未指定默认值,则新行中的列仍包含NULL。 AFAIK这是正常行为。在我的情况下,设置默认值或显式设置任何新行中的值解决了问题。
干杯! JE