背景信息優先:設置爲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
這是這個問題的第一個也是唯一的報告,已經過時了。我將盡我所能地採取異常處理措施來防止這種情況再次發生。但是,如果我確切地知道問題發生的原因,我會感覺好多了。
感謝您的時間!
由於我不能重現錯誤,我不知道這是否修復它;但聽起來像最好的做法一樣。感謝您的建議。 – CAP 2010-11-15 17:48:52