每個資料存取系統需處理「未明確指定的欄位值」。關聯式資料庫用 NULL,但 .NET 型別無法自動轉換資料庫 NULL(直接賦值拋異常),且各資料存儲實現 NULL 方式不同。
Nothing?Nothing 不拋異常,但值強依賴型別(String=""、Date=MinValue、Integer=0、Boolean=False)。IsNothing() 結果不一致,無法跨層傳遞統一語義。定義應用層編碼的空值常數,在 DAL 層轉換為資料庫實際 DBNull.Value,抽象物理細節。
Public Class Null
' 應用層編碼空值
Public Shared ReadOnly Property NullInteger() As Integer : Get : Return -1 : End Get : End Property
Public Shared ReadOnly Property NullDate() As Date : Get : Return Date.MinValue : End Get : End Property
Public Shared ReadOnly Property NullString() As String : Get : Return "" : End Get : End Property
Public Shared ReadOnly Property NullBoolean() As Boolean : Get : Return False : End Get : End Property
' 表現層:設定欄位為應用層空值
Public Shared Function SetNull(ByVal objField As Object) As Object
If TypeOf objField Is Integer Then Return NullInteger
ElseIf TypeOf objField Is Date Then Return NullDate
ElseIf TypeOf objField Is String Then Return NullString
ElseIf TypeOf objField Is Boolean Then Return NullBoolean
Else Throw New NullReferenceException()
End If
End Function
' BLL 層:依 PropertyInfo 型別設定空值
Public Shared Function SetNull(ByVal objPropertyInfo As PropertyInfo) As Object
Select Case objPropertyInfo.PropertyType.ToString
Case "System.Int16","System.Int32","System.Int64","System.Single","System.Double","System.Decimal" : Return NullInteger
Case "System.DateTime" : Return NullDate
Case "System.String","System.Char" : Return NullString
Case "System.Boolean" : Return NullBoolean
Case Else : Throw New NullReferenceException()
End Select
End Function
' DAL 層:應用層空值 → 資料庫 DBNull
Public Shared Function GetNull(ByVal objField As Object, ByVal objDBNull As Object) As Object
GetNull = objField
If TypeOf objField Is Integer AndAlso objField = NullInteger Then Return objDBNull
ElseIf TypeOf objField Is Date AndAlso objField = NullDate Then Return objDBNull
ElseIf TypeOf objField Is String AndAlso objField = NullString Then Return objDBNull
ElseIf TypeOf objField Is Boolean AndAlso objField = NullBoolean Then Return objDBNull
Else Throw New NullReferenceException()
End If
End Function
' 判斷是否為應用層空值
Public Shared Function IsNull(ByVal objField As Object) As Boolean
Return objField = SetNull(objField)
End Function
End Class
限制: 僅適用於資料庫欄位允許 NULL 的情況;要求 DAL 與 BLL 型別一致。