早期我極少撰寫預存程序,覺得修改資料結構(加欄位、改型別)需同步改動資料表、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 與參數,僅操作實際使用欄位,避免空值轉換錯誤,大幅提升彈性與健壯性。