在控制台 → ODBC 管理員建立系統 DSN,程式碼僅需引用名稱:
connStr = "DSN=MyAccessDSN"
' 或帶入帳密
connStr = "DSN=MySQLDSN;UID=sa;PWD=password"
優點:連線資訊集中管理,移植只需改 DSN 設定。
缺點:需伺服器管理員權限建立 DSN,虛擬主機通常不提供。
直接在連線字串指定驅動程式與檔案路徑:
' Access 2000-2003 (.mdb)
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("/db/data.mdb")
' Access 2007+ (.accdb)
connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Server.MapPath("/db/data.accdb")
' SQL Server
connStr = "Provider=SQLOLEDB;Data Source=192.168.1.100;Initial Catalog=MyDB;User ID=webuser;Password=secret"
<%
Dim conn, rs, sql, connStr
connStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("/db/demo.mdb")
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open connStr
Set rs = Server.CreateObject("ADODB.Recordset")
sql = "SELECT ProductID, ProductName, Price FROM Products WHERE CategoryID = 3 ORDER BY ProductName"
rs.Open sql, conn, 1, 1 ' adOpenKeyset, adLockReadOnly
If rs.EOF And rs.BOF Then
Response.Write "查無資料"
Else
Response.Write "ID 名稱 價格 "
Do While Not rs.EOF
Response.Write ""
Response.Write "" & rs("ProductID") & " "
Response.Write "" & Server.HTMLEncode(rs("ProductName")) & " "
Response.Write "" & FormatCurrency(rs("Price")) & " "
Response.Write " "
rs.MoveNext
Loop
Response.Write "
"
End If
rs.Close: Set rs = Nothing
conn.Close: Set conn = Nothing
%>
| 參數 | 常數 | 值 | 說明 |
|---|---|---|---|
| CursorType | adOpenForwardOnly | 0 | 唯讀、僅向前(預設、效能最好) |
| adOpenKeyset | 1 | 可移動、可見他人異動 | |
| adOpenDynamic | 2 | 完全動態、支援書籤 | |
| adOpenStatic | 3 | 靜態複本、可移動、不可見他人異動 | |
| LockType | adLockReadOnly | 1 | 唯讀(預設) |
| adLockOptimistic | 3 | 樂觀鎖定、更新時檢查衝突 | |
| adLockPessimistic | 2 | 悲觀鎖定、編輯即鎖定 |
<%
Dim cmd, param
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = conn
cmd.CommandText = "SELECT * FROM Users WHERE Username = ? AND Status = ?"
cmd.CommandType = 1 ' adCmdText
' 依序 Append 參數,型別請對應資料庫欄位
cmd.Parameters.Append cmd.CreateParameter("@username", 200, 1, 50, Request.Form("username")) ' adVarChar
cmd.Parameters.Append cmd.CreateParameter("@status", 3, 1, , 1) ' adInteger
Set rs = cmd.Execute
' ... 處理 rs
%>
SELECT * FROM T WHERE F = 'value'
SELECT * FROM T WHERE F LIKE '%keyword%'
SELECT TOP 10 * FROM T ORDER BY F DESC
SELECT * FROM T WHERE F IN ('a','b','c')
SELECT * FROM T WHERE F BETWEEN '2024-01-01' AND '2024-12-31'
UPDATE T SET F1=v1, F2=v2 WHERE PK = ?
DELETE FROM T WHERE PK = ?
INSERT INTO T (F1,F2) VALUES (?,?)
SELECT COUNT(*) AS cnt FROM T
SELECT SUM(Amount) AS total FROM Orders WHERE OrderDate >= '2024-01-01'
SELECT AVG(Score) AS avg FROM Exams
adOpenForwardOnly + adLockReadOnly,並分頁顯示。On Error Resume Next 檢查 Err.Number,記錄日誌不暴露給使用者。