首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

DNN 資料存取策略(二):Null 值處理機制——統一應用層與資料層的空值語義

     編輯:關於ASP.NET

每個資料存取系統需處理「未明確指定的欄位值」。關聯式資料庫用 NULL,但 .NET 型別無法自動轉換資料庫 NULL(直接賦值拋異常),且各資料存儲實現 NULL 方式不同。

為何不用 VB.NET Nothing?

  • 屬性設為 Nothing 不拋異常,但值強依賴型別(String=""、Date=MinValue、Integer=0、Boolean=False)。
  • IsNothing() 結果不一致,無法跨層傳遞統一語義。

DNN 解決方案:Null 靜態類別

定義應用層編碼的空值常數,在 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 型別一致。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved