设置为AllowDBNulls = False的强类型DataColumn是否可以为其值设置DBNull?

时间:2010-11-12 20:54:11

标签: xml vb.net dataset .net

背景资料:

我们使用强类型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

这是我们迄今为止第一次也是唯一一份此问题的报告。我将通过异常处理尽可能地防止这种情况再次发生。但是,如果我确切知道问题发生的原因,我会感觉好多了。

谢谢你的时间,全部!

1 个答案:

答案 0 :(得分:0)

尝试为任何不允许NULL的列设置默认值。我最近遇到类似的情况,其中AllowDBNull设置为false,但如果未指定默认值,则新行中的列仍包含NULL。 AFAIK这是正常行为。在我的情况下,设置默认值或显式设置任何新行中的值解决了问题。

干杯! JE