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

DotNetNuke 自訂表單模組資料結構(三):動態 SQL 與 HashTable 實現靈活寫入

     編輯:關於ASP.NET

早期我極少撰寫預存程序,覺得修改資料結構(加欄位、改型別)需同步改動資料表、SP、呼叫端,極繁瑣。但習慣後發現 SP 確有優勢,被迫養成嚴謹設計習慣。DNN 安裝全模組後擁有近千個 SP,可見其依賴程度。

為何放棄預存程序?

前文已將 UDT 的 UserDefinedRows 表拆分為「基本欄位表」(列表顯示、查詢用)與「擴充欄位表」(僅明細頁用)。實際使用欄位於執行期決定,而非設計期固定。若 SP 強制更新所有欄位,未使用的日期/數值欄位會報錯或寫入髒資料。期望未使用欄位保持 NULL,故需執行期動態生成 INSERT/UPDATE SQL。

動態寫入核心函數

Public Overrides Function AddHashRow(ByVal field As Hashtable) As Integer
  Dim sqlComm As SqlCommand = New SqlCommand()
  Dim strSql As String = "INSERT INTO RedstartFormRow ("
  Dim strField As String = ""
  Dim strParm As String = ""

  For Each dic As DictionaryEntry In field
    If strField <> "" Then strField = strField & ", "
    strField = strField & dic.Key.ToString()
    If strParm <> "" Then strParm = strParm & ", "
    strParm = strParm & "@" & dic.Key.ToString()
    sqlComm.Parameters.Add(New SqlParameter("@" & dic.Key.ToString(), GetNull(dic.Value.ToString())))
  Next

  strSql = strSql & strField & ") VALUES (" & strParm & ")"
  strSql = strSql & "; select SCOPE_IDENTITY()"

  Dim sqlConn As New SqlConnection()
  sqlConn.ConnectionString = ConnectionString
  sqlConn.Open()
  sqlComm.Connection = sqlConn
  sqlComm.CommandText = strSql
  Return CType(sqlComm.ExecuteScalar(), Integer)
End Function

透過 Hashtable 傳遞「欄位名→值」對,動態組裝 SQL 與參數,僅操作實際使用欄位,避免空值轉換錯誤,大幅提升彈性與健壯性。

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