Web 頁面收集用戶輸入(名、姓、年齡),服務端需動態生成 INSERT 語句寫入數據庫。本文展示一個健壯的 buildSQLInsert 函數,自動處理字段名映射、數據類型推斷、NULL 值與字符串轉義。
<form method="post">
First Name: <input name="fName"><br>
Last Name: <input name="lName"><br>
Age: <input name="age"><br>
<input type="submit">
</form>
<%
Function buildSQLInsert(targetTable, omitFields)
Dim iStr, vStr, nStr, x, fieldName, fieldData, typeDelimPos
iStr = "INSERT INTO " & targetTable & " "
vStr = "VALUES ("
nStr = "("
For Each x In Request.Form
fieldName = UCase(x)
' 跳過排除字段
If InStr(UCase(omitFields), fieldName) = 0 Then
fieldData = Replace(Request.Form(fieldName), "'", "''")
If Trim(fieldData) = "" Then
fieldData = "NULL"
vStr = vStr & fieldData & ", "
nStr = nStr & fieldName & ", "
Else
typeDelimPos = InStr(fieldName, "_")
If typeDelimPos = 0 Then
' 約定:字段名含 "_" 後綴標識類型,如 "age_int"
' 無後綴視為文本
nStr = nStr & fieldName & ", "
vStr = vStr & "'" & fieldData & "', "
Else
' 解析類型後綴
Dim typeSuffix
typeSuffix = Mid(fieldName, typeDelimPos + 1)
Select Case LCase(typeSuffix)
Case "int", "number"
vStr = vStr & fieldData & ", "
Case "date"
vStr = vStr & "#" & fieldData & "#, "
Case "bool", "bit"
vStr = vStr & IIf(fieldData = "on", 1, 0) & ", "
Case Else
vStr = vStr & "'" & fieldData & "', "
End Select
nStr = nStr & Left(fieldName, typeDelimPos - 1) & ", "
End If
End If
End If
Next
' 移除尾部逗號並閉合
If Right(nStr, 2) = ", " Then nStr = Left(nStr, Len(nStr) - 2)
If Right(vStr, 2) = ", " Then vStr = Left(vStr, Len(vStr) - 2)
nStr = nStr & ")"
vStr = vStr & ")"
buildSQLInsert = iStr & nStr & " " & vStr
End Function
%>
<%
Dim sql
sql = buildSQLInsert("Users", "submit|btn") ' 排除提交按鈕等非數據字段
Response.Write sql
' 輸出範例:INSERT INTO Users (FNAME, LNAME, AGE) VALUES ('John', 'Doe', 30)
%>
字段名_類型 形式(如 age_int、birth_date)隱式聲明類型,避免硬編碼。NULL 而非空字符串。omitFields 參數支持管道分隔多字段排除。動態拼接 SQL 存在注入風險。生產系統必須改用參數化查詢(Command.Parameters)或 ORM 框架。本函數僅供教學、原型或受控內網環境參考。