使用 ASP.NET 的過程中, 資料庫訪問是一個很重要的部分, 特別是在 B/S 系統的構建過程中, 資料庫操作幾乎成為了一個必不可少的操作。調用預存程序實現資料庫操作是很多程式員使用的方法。本文將和大家一起學習預存程序ASP.NET 資料庫應用程式中預存程序的應用, 以此提高 ASP.NET 資料庫應用程式的總體效能。
1. 關於預存程序
預存程序 (Stored Procedure) 是一組為了完成特定功能的SQL 陳述式集, 經編譯後儲存在資料庫中。使用者通過指定預存程序的名字並給出參數( 如果該預存程序帶有參數)
來執行它。預存程序是資料庫中的一個重要對象, 任何一個設計良好的資料庫應用程式都應該用到預存程序。
1. 效能方面:
● 預存程序提供了許多標準sql 語言中所沒有的進階特性。其傳遞參數和執行邏輯運算式的功能, 有助於應用程式設計者處理複雜任務。
● 預存程序提供了安全機制, 可以只給使用者授予訪問預存程序的許可權, 而不授予使用者訪問預存程序中涉及到的表的許可權,從而保證資料庫中資料的完整性。
● 預存程序在第一次執行後, 會在 SQL Server 的緩衝區中建立查詢樹, 這樣在第二次執行該預存程序時, 無須進行編譯,所以其執行速度比在程式裡執行 sql 語句快很多。
● 預存程序儲存在本機伺服器上, 減少了網路負載及執行該過程所需的執行時間。
2. 程式結構方面:
● 從程式的可擴充性看, 使用預存程序會對程式以後的修改帶來方便。比如資料庫的結構改變了, 只需修改相對應的儲存結構, 和程式中的調用部分即可。
● 一個預存程序可以視為使用者為完成某個特定功能而編寫的一個功能模組, 使用者或其他使用者可以在自己其他的預存程序中引用該預存程序, 從而實現代碼的重用性, 提高開發 的品質和效率。
由以上的分析可以看到, 在應用程式中使用預存程序是很有必要的。
3. 預存程序類型
根據傳回值類型的不同, 我們可以將預存程序分為三類: 返回記錄集的預存程序, 返回數值的預存程序( 也可以稱為標量預存程序) , 以及行為預存程序。顧名思義, 返回記錄
集的預存程序的執行結果是一個記錄集, 典型的例子是從資料庫中檢索出符合某一個或幾個條件的記錄; 返回數值的預存程序執行完以後返回一個值, 例如在資料庫中執行一個有
傳回值的函數或命令; 最後, 行為預存程序僅僅是用來實現資料庫的某個功能, 而沒有傳回值, 例如在資料庫中的更新和刪除操作。
2.ASP.NET中使用預存程序
在 ASP.NET 中應用預存程序要在應用程式中訪問資料庫, 一般性的步驟是: 首先聲明一個資料庫連接SqlConnection, 然後聲明一個資料庫命令SqlCommand, 用來執行
SQL 陳述式和預存程序。有了這兩個對象後,就可以根據自己的需要採用不同的執行方式達到目的。就執行預存程序來說, 如果執行的是第一類預存程序, 那麼就要用一個
DataAdapter 將結果填充到一個DataSet 中, 然後就可以使用資料格控制項將結果呈現在頁面上了; 如果執行的是第二和第三種預存程序, 則不需要此過程, 只需要根據特定的返回判定操作是否成功完成即可。
1. 簡單預存程序的應用
(1) 建立一個簡單的預存程序在SQL Server內建的 Northwind 資料庫上建立一個名為my_proc 的預存程序, 該預存程序返回目的地為美國的訂單。
具體命令如下:
USE NorthwindGoCreate PROC my_procAsSELECT * FROM order WHERE ShipCountry='USA'Go
(2) 建立調用簡單預存程序的應用程式:
下面就通過程式來調用這個預存程序。建立一個檔案叫StorePro.aspx, 其中用到了ADO.NET 中的SqlDataAdapter 對象以及 DataSet 對象。SqlDataAdapter 對象
作為 SQL Server 資料庫和DataSet 對象的橋樑將兩者聯絡在一起。SqlDataAdapter 對象包含了兩個常用的方法: Fill( ) 方法和 Update( ) 方法。而 Fill( ) 方法能從資料
庫中擷取相應資料並填充到 DataSet 對象中。在調用Fill() 方法以前, 我們必須設定好 SqlDataAdapter 對象的 SelectCommand 屬性, 該屬性其實是一個SqlCommand
對象。SelectCommand 屬性中包含有效SQL 陳述式, 並能據此從資料庫中擷取相應資料並填充到 DataSet 對象中。
程式碼如下:
Default.aspx頁面:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server"> <title>無標題頁</title></head><body> <form id="form1" runat="server"> <div> <asp:GridView ID="GridView1" runat="server"> </asp:GridView> </div> </form></body></html>
Default.aspx.cs:
using System;using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using System.Data.SqlClient;public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { SqlConnection sqlcon=new SqlConnection(); sqlcon.ConnectionString="Data Source=localhost;Initial Catalog=Northwind;User Id=sa;Password=123"; SqlDataAdapter sda = new SqlDataAdapter("my_proc",sqlcon);//調用存貯過程"my_proc" sda.SelectCommand.CommandType = CommandType.StoredProcedure;//設定命令類型為存貯過程 DataSet ds = new DataSet(); sda.Fill(ds,"orders"); GridView1.DataSource=ds.Tables["orders"]; GridView1.DataBind(); }}
3. 總結:
本文討論了預存程序的基本知識以及通過執行個體說明了在ASP.NET 資料庫應用程式中如何結合SqlDataAdapter 對象、DataSet 對象、SqlParameter 對象等構建資料驅動的應用程式。我們不難發現將資料更新商務邏輯封裝在預存程序中是一種很好的設計方法, 它能提高應用程式的可管理性、可擴充性以及資料庫的安全性。
link:http://www.cnblogs.com/gisera/articles/1266697.html