存儲過程是資料庫邏輯封裝與效能優化的關鍵工具。本文詳細說明如何在 ASP 中使用 ADO Command 物件呼叫無參數、無回傳記錄集的存儲過程,並比較不同呼叫方式的優劣。
/* SQL Server */
CREATE PROCEDURE dbo.DelUserAll
AS
BEGIN
SET NOCOUNT ON;
DELETE FROM dbo.UserInfo;
END
GO
<%
Dim cmd, connStr, rowsAffected
connStr = "Provider=SQLOLEDB;Data Source=.;Initial Catalog=MyDB;User Id=sa;Password=pwd;"
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = connStr
cmd.CommandText = "DelUserAll"
cmd.CommandType = 4 ' adCmdStoredProc
cmd.Prepared = True ' 預編譯提升效能
On Error Resume Next
cmd.Execute , rowsAffected ' 無回傳記錄集,取得影響列數
If Err.Number <> 0 Then
Response.Write "執行失敗:" & Err.Description
Err.Clear
Else
Response.Write "已刪除 " & rowsAffected & " 筆記錄"
End If
On Error GoTo 0
Set cmd = Nothing
%>
| 方式 | 適用場景 | 優點 | 缺點 |
|---|---|---|---|
| Command.Execute | 無回傳記錄集的 DDL/DML | 效能最佳、參數化支援完整、可取得 RecordsAffected | 語法稍繁瑣 |
| Connection.Execute | 簡單一次性執行 | 程式碼最精簡 | 無參數化、難除錯、無 RecordsAffected |
| Recordset.Open | 需回傳記錄集的 SELECT | 可捲動游標、豐富導航 | 資源消耗大、不適用無回傳 SP |
<%
' 存儲過程:CREATE PROC GetUserByEmail @Email NVARCHAR(256)
Dim cmd, rs, email
email = "user@example.com"
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = connStr
cmd.CommandText = "GetUserByEmail"
cmd.CommandType = 4
cmd.Prepared = True
' 明確定義參數(推薦)
Dim param : Set param = cmd.CreateParameter("@Email", 202, 1, 256, email) ' adVarWChar, adParamInput
cmd.Parameters.Append param
Set rs = cmd.Execute
If Not rs.EOF Then
Response.Write "使用者:" & rs("UserName")
End If
rs.Close : Set rs = Nothing
Set cmd = Nothing
%>
<%
' 存儲過程:CREATE PROC AddUser @Name NVARCHAR(50), @NewID INT OUTPUT
Dim cmd, newUserId
Set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = connStr
cmd.CommandText = "AddUser"
cmd.CommandType = 4
' 輸入參數
cmd.Parameters.Append cmd.CreateParameter("@Name", 202, 1, 50, "新用戶")
' 輸出參數
cmd.Parameters.Append cmd.CreateParameter("@NewID", 3, 2, , 0) ' adInteger, adParamOutput
cmd.Execute
newUserId = cmd.Parameters("@NewID").Value
Response.Write "新建使用者 ID:" & newUserId
Set cmd = Nothing
%>