2010-11-12 19 views
0

背景信息優先:設置爲AllowDBNulls = False的強類型DataColumn是否具有其值的DBNull?

我們使用強類型的DataSet來管理事務文件。也就是說,DataSet不使用任何類型的數據庫作爲其後備存儲;而是使用DataSet來讀取和寫入XML文件到磁盤。 WriteXml(fileName As String)用於輸出特定的數據行,其他表中的所有從屬行自動嵌入到輸出中。

ReadXml方法用於在啓動時加載這些文件。

最初,這個類是使用VB.NET中的代碼生成工具生成的。但是,由於該系統已經到位,所以已經進行了許多手動修改。即在這一點上重新生成課程並不是真正的選擇(噓和噓你所有喜歡;我沒有這樣做)。

在現場使用我們的系統的客戶已經遇到了奇怪的異常;一個我們不容易重現的。基本上,系統試圖讀取已存在於DataSet中的事務的值時發生了一種情況,並導致出現「InvalidCastException」。我們的系統使用Compact Framework v3.5在簡化的WinCE系統上運行;因爲它是基本的,所以沒有安裝提供異常消息的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

嘗試爲任何不允許NULL的列設置默認值。我最近有一種類似的情況,其中AllowDBNull設置爲false,但如果未指定缺省值,則新行中的列仍包含NULL。 AFAIK這是正常的行爲。在我的情況下設置默認值或顯式設置任何新行中的值解決了問題。

乾杯! JE

+0

由於我不能重現錯誤,我不知道這是否修復它;但聽起來像最好的做法一樣。感謝您的建議。 – CAP 2010-11-15 17:48:52

相關問題