ASP.NET 2.0 中透過 SqlDataAdapter 與 SqlCommand 執行預存程序,配合 CommandType.StoredProcedure 與參數集合,實現安全、高效、可維護的資料庫操作。本文示範帶參數與不帶參數兩種預存程序的完整呼叫模式。
-- 不帶參數:查詢所有使用者
CREATE PROCEDURE dbo.oa_selectalluser
AS
SELECT * FROM UserInfo
GO
-- 帶參數:依 ID 查詢使用者
CREATE PROCEDURE dbo.oa_SelectByID
@id INT
AS
SELECT * FROM UserInfo WHERE ID = @id
GO
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
string connStr = ConfigurationManager.ConnectionStrings["oaConnectionString"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlDataAdapter da = new SqlDataAdapter())
{
da.SelectCommand = new SqlCommand("oa_selectalluser", conn);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
DataSet ds = new DataSet();
da.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
}
}
}
protected void btn_search_Click(object sender, EventArgs e)
{
string connStr = ConfigurationManager.ConnectionStrings["oaConnectionString"].ConnectionString;
using (SqlConnection conn = new SqlConnection(connStr))
using (SqlDataAdapter da = new SqlDataAdapter())
{
da.SelectCommand = new SqlCommand("oa_SelectByID", conn);
da.SelectCommand.CommandType = CommandType.StoredProcedure;
// 建立參數
SqlParameter param = new SqlParameter("@id", SqlDbType.Int);
param.Direction = ParameterDirection.Input;
param.Value = Convert.ToInt32(txt_value.Text);
da.SelectCommand.Parameters.Add(param);
DataSet ds = new DataSet();
da.Fill(ds);
GridView1.DataSource = ds;
GridView1.DataBind();
}
}
指定命令類型為預存程序,CommandText 僅需程序名稱,不需 SQL 陳述式。
| 屬性 | 說明 | 範例 |
|---|---|---|
ParameterName | 對應預存程序參數名稱(含 @) | @id |
SqlDbType | 資料庫型別,確保型別安全 | SqlDbType.Int |
Direction | Input/Output/InputOutput/ReturnValue | ParameterDirection.Input |
Value | 參數值,需型別轉換 | Convert.ToInt32(txt.Text) |
Size | 字串/二進位型別長度 | 50 (NVarChar) |
cmd.Parameters.Add(param):加入 SqlParameter 物件。cmd.Parameters.AddWithValue("@id", value):簡易寫法(型別推斷,效能略低)。cmd.Parameters.Add("@id", SqlDbType.Int).Value = value:鏈式寫法。// 預存程序包含 OUTPUT 參數
CREATE PROCEDURE dbo.oa_InsertUser
@Name NVARCHAR(50),
@NewID INT OUTPUT
AS
INSERT INTO UserInfo (Name) VALUES (@Name)
SET @NewID = SCOPE_IDENTITY()
GO
// C# 呼叫取得 OUTPUT 值
SqlParameter outputParam = new SqlParameter("@NewID", SqlDbType.Int);
outputParam.Direction = ParameterDirection.Output;
cmd.Parameters.Add(outputParam);
cmd.ExecuteNonQuery();
int newId = (int)cmd.Parameters["@NewID"].Value;
<asp:SqlDataSource ID="sdsUsers" runat="server"
ConnectionString="<%$ ConnectionStrings:oaConnectionString %>"
SelectCommand="oa_SelectByID"
SelectCommandType="StoredProcedure">
<SelectParameters>
<asp:ControlParameter Name="@id" ControlID="txt_value" PropertyName="Text" Type="Int32" />
</SelectParameters>
</asp:SqlDataSource>
<asp:GridView ID="GridView1" runat="server" DataSourceID="sdsUsers" />
零後置程式碼,參數自動從控制項取值,支援分頁/排序/快取。
EXECUTE 權限,不需直接資料表權限。Direction 未設定導致 OUTPUT 參數無法回傳值。ConfigurationManager 讀取。using 區塊導致連線洩漏。掌握預存程序呼叫模式,是 ASP.NET 2.0 資料庫應用開發的核心基本功。