萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 網路程式設計 >> ASP 程式設計

ASP 連接資料庫完整教學:從 DSN 到 DSN-less、Recordset 操作與 SQL 實務

兩種連線模式

1. DSN(資料來源名稱)模式

在控制台 → ODBC 管理員建立系統 DSN,程式碼僅需引用名稱:

connStr = "DSN=MyAccessDSN"
' 或帶入帳密
connStr = "DSN=MySQLDSN;UID=sa;PWD=password"

優點:連線資訊集中管理,移植只需改 DSN 設定。
缺點:需伺服器管理員權限建立 DSN,虛擬主機通常不提供。

2. DSN-less(無 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 ""
  Do While Not rs.EOF
    Response.Write ""
    Response.Write ""
    Response.Write ""
    Response.Write ""
    Response.Write ""
    rs.MoveNext
  Loop
  Response.Write "
ID名稱價格
" & rs("ProductID") & "" & Server.HTMLEncode(rs("ProductName")) & "" & FormatCurrency(rs("Price")) & "
" End If rs.Close: Set rs = Nothing conn.Close: Set conn = Nothing %>

Recordset 開啟模式參數

參數常數值說明
CursorTypeadOpenForwardOnly0唯讀、僅向前(預設、效能最好)
adOpenKeyset1可移動、可見他人異動
adOpenDynamic2完全動態、支援書籤
adOpenStatic3靜態複本、可移動、不可見他人異動
LockTypeadLockReadOnly1唯讀(預設)
adLockOptimistic3樂觀鎖定、更新時檢查衝突
adLockPessimistic2悲觀鎖定、編輯即鎖定

參數化查詢(防 SQL 注入)

<%
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
%>

常用 SQL 範本速查

條件篩選

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

效能與安全建議

  • 連線物件儲存於 Application/Session? 不要!請在每個頁面請求中建立、用完即關閉。
  • 大量資料:使用 adOpenForwardOnly + adLockReadOnly,並分頁顯示。
  • 永遠使用參數化查詢,拒絕字串拼接 SQL。
  • 錯誤處理:包裹 On Error Resume Next 檢查 Err.Number,記錄日誌不暴露給使用者。
copyright © 萬盛學電腦網 all rights reserved