如何: 使用 Visual C#.NET 在 ASP.NET 中呼叫 SQL Server 預存程序

文章翻譯 文章翻譯
文章編號: 320916 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

這篇文章示範如何使用 ASP.NET 和 ADO.NET 使用 Visual C#.NET,建立並呼叫 Microsoft SQL Server 預存程序的輸入的參數和輸出參數。

本文中的程式碼範例會先檢查預存程序會建立是否存在 Pubs 資料庫也就是隨附於標準的 Microsoft SQL Server 安裝中。如果預存程序不存在,程式碼會建立預存程序會採用一個參數來搜尋 Authors 資料表根據最後一個名稱,並傳回符合的資料列和輸出參數中傳回資料列的數目。

本文也會示範如何建立 Web Form 提供簡單的使用者介面。Web Form 包含下列項目:
  • 在使用者鍵入搜尋條件的文字方塊。
  • DataGrid 控制項,會顯示搜尋結果。
  • Label 控制項顯示傳回的記錄數目。
  • 按鈕 控制項,按一下此按鈕時呼叫的預存程序。

需求

下列清單列出建議的硬體、 軟體、 網路基礎結構及所需的 Service Pack:
  • Microsoft SQL Server 7.0 (含) 以後版本
  • Microsoft Visual Studio.NET
  • Microsoft Visual C#.NET
  • 在資料庫中建立預存程序的權限
本文假設您已熟悉下列主題:
  • ASP.NET
  • SQL Server 預存程序

建立 ASP.NET 專案並加入控制項

本章節中建立 ASP.NET 專案,並建立基本使用者介面。請注意這些步驟使用 Microsoft Visual C#.NET 程式碼。若要建立專案,請依照下列步驟執行:
  1. 按一下 [開始],指向 [程式集]、 指向 [Microsoft Visual Studio.NET,然後再按一下 [Microsoft Visual Studio.NET]。
  2. 在 Visual Studio.NET 開始] 頁面上按一下 [新增專案]。
  3. 在 [新增專案] 對話方塊按一下 [專案類型,] 下的 [Visual C# 專案,然後再按一下 [範本] 下方的 [ASP.NET Web 應用程式
  4. 在 [名稱] 方塊中輸入您的 Web 應用程式的名稱,然後再按一下 [[確定]
  5. 將下列的伺服器控制項加入至 [Web] 表單,並依照它們在表格中所列設定屬性:
    摺疊此表格展開此表格
    控制項ID 屬性文字屬性
    標籤lblLastName輸入作者的姓氏:
    文字方塊txtLastName%
    按鈕btnGetAuthors取得作者
    標籤lblRowCount(資料列計數)

  6. DataGrid 伺服器控制項從工具箱拖曳到 [Web] 表單,並接著將 名稱 屬性設定為 [GrdAuthors
  7. 在方格上按一下滑鼠右鍵,然後按一下 [自動格式設定]。
  8. 按一下 [專業版 1 該配置,然後按一下 [確定]

建立 GetAuthorsByLastName 預存程序

使用下列的 Transact-SQL 程式碼建立 GetAuthorsByLastName 預存程序:
Use Pubs
Go
Create Procedure GetAuthorsByLastName (@au_lname varchar(40), @RowCount int output)  
as 

select * from authors where au_lname like @au_lname; 

/* @@ROWCOUNT returns the number of rows that are affected by the last statement. */ 
select @RowCount=@@ROWCOUNT
				
這個程式碼包含兩個參數: @ au_lname 和 @ 資料列計數。@ au_lname 參數為輸入的參數,會取得在 Authors 資料表中執行像"搜尋的搜尋字串。@ 資料列計數參數為輸出參數使用 @ @ ROWCOUNT 變數以取得受影響的資料列。

建立並執行預存程序

若要存取 SQL Server 資料庫,您必須匯入 System.Data.SqlClient 命名空間提供新的物件,例如 SqlDataReaderSqlDataAdapter 物件。您可以使用 SqlDataReader 從 SQL Server 資料庫讀取順向的資料流的資料列。資料配接器 表示一組的資料命令和您可以使用填滿 資料集 物件,並更新 SQL Server 資料庫的資料庫連接。

ADO.NET 也會引入 DataSet 物件是記憶體常駐表示提供一個一致、 關聯式程式設計模型無論資料來源的資料。本章節中的程式碼會使用所有這些物件。
  1. 按兩下 Web 表單。
  2. 將下列程式碼 (using 指示詞) 加入至您 Web] 表單會出現在 [程式碼] 視窗頂端的 [宣告] 區段:
    using System.Data;
    using System.Data.SqlClient;
    					
  3. 請確定預存程序已經存在,以及建立新的預存程序,請與 SqlDataReader 物件使用 SqlCommand 物件。您可以使用 SqlCommand 對資料庫執行任何的 SQL 命令。接著會呼叫 ExecuteReader 方法 SqlCommand 返回 SqlDataReader,其中包含您的查詢相符的資料列。

    加入下列程式碼的 Web Form Page_Load 事件中:
    	private void Page_Load(object sender, System.EventArgs e)
    	{
    		// Only run this code the first time the page is loaded.
    		// The code inside the IF statement is skipped when you resubmit the page.
    		if (!IsPostBack)
    		{
    			//Create a connection to the SQL Server; modify the connection string for your environment
    			//SqlConnection MyConnection = new SqlConnection("server=(local);database=pubs;Trusted_Connection=yes");
    			SqlConnection MyConnection = new SqlConnection("server=(local);database=pubs;UID=myUser;PWD=myPassword;");
    
    			// Create a Command object, and then set the connection.
    			// The following SQL statements check whether a GetAuthorsByLastName  
    			// stored procedure already exists.
    			SqlCommand MyCommand = new SqlCommand("select * from sysobjects where id = object_id(N'GetAuthorsByLastName')" +
    			"  and OBJECTPROPERTY(id, N'IsProcedure') = 1", MyConnection);
    
    			// Set the command type that you will run.
    			MyCommand.CommandType = CommandType.Text;
    
    			// Open the connection.
    			MyCommand.Connection.Open();
    
    			// Run the SQL statement, and then get the returned rows to the DataReader.
    			SqlDataReader MyDataReader = MyCommand.ExecuteReader();
    
    			// If any rows are returned, the stored procedure that you are trying 
    			// to create already exists. Therefore, try to create the stored procedure
    			// only if it does not exist.
    			if(!MyDataReader.Read())
    			{
    				MyCommand.CommandText = "create procedure GetAuthorsByLastName" + 
    					" (@au_lname varchar(40), select * from authors where" +
    					" au_lname like @au_lname; select @RowCount=@@ROWCOUNT";
    				MyDataReader.Close();
    				MyCommand.ExecuteNonQuery();
    			}
    			else
    			{
    				MyDataReader.Close();
    			}
    
    			MyCommand.Dispose();  //Dispose of the Command object.
    			MyConnection.Close(); //Close the connection.
    		}
    
    		// Add the event handler to the Button_Click event.
    		this.btnGetAuthors.Click += new System.EventHandler(this.btnGetAuthors_Click);
    	}
    					
  4. btnGetAuthors] 按鈕的 Click 事件中呼叫的預存程序,然後使用 SqlDataAdapter 物件執行預存程序。您必須建立預存程序的參數,並將它附加到 參數 集合的 SqlDataAdapter 物件。

    Page_Load 事件之後加入下列程式碼:
    	private void btnGetAuthors_Click(object sender, System.EventArgs e)
    	{
    		//Create a connection to the SQL Server; modify the connection string for your environment.
    		//SqlConnection MyConnection = new SqlConnection("server=(local);database=pubs;Trusted_Connection=yes");
    		SqlConnection MyConnection = new SqlConnection("server=(local);database=pubs;UID=myUser;PWD=myPassword;");
    
    		//Create a DataAdapter, and then provide the name of the stored procedure.
    		SqlDataAdapter MyDataAdapter = new SqlDataAdapter("GetAuthorsByLastName", MyConnection);
    
    		//Set the command type as StoredProcedure.
    		MyDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure;
    
    		//Create and add a parameter to Parameters collection for the stored procedure.
    		MyDataAdapter.SelectCommand.Parameters.Add(new SqlParameter("@au_lname", SqlDbType.VarChar, 40));
    
    		//Assign the search value to the parameter.
    		MyDataAdapter.SelectCommand.Parameters["@au_lname"].Value = (txtLastName.Text).Trim();
    
    		//Create and add an output parameter to the Parameters collection. 
    		MyDataAdapter.SelectCommand.Parameters.Add(new SqlParameter("@RowCount", SqlDbType.Int, 4));
    
    		//Set the direction for the parameter. This parameter returns the Rows that are returned.
    		MyDataAdapter.SelectCommand.Parameters["@RowCount"].Direction = ParameterDirection.Output;
    
    		//Create a new DataSet to hold the records.
    		DataSet DS = new DataSet();
    		
    		//Fill the DataSet with the rows that are returned.
    		MyDataAdapter.Fill(DS, "AuthorsByLastName");
    
    		//Get the number of rows returned, and assign it to the Label control.
    		//lblRowCount.Text = DS.Tables(0).Rows.Count().ToString() & " Rows Found!"
    		lblRowCount.Text = MyDataAdapter.SelectCommand.Parameters[1].Value + " Rows Found!";
    
    		//Set the data source for the DataGrid as the DataSet that holds the rows.
    		GrdAuthors.DataSource = DS.Tables["AuthorsByLastName"].DefaultView;
    
    		//NOTE: If you do not call this method, the DataGrid is not displayed!
    		GrdAuthors.DataBind();
    
    		MyDataAdapter.Dispose(); //Dispose the DataAdapter.
    		MyConnection.Close(); //Close the connection.
    	}
    					
  5. 在 [方案總管] 中以滑鼠右鍵按一下.aspx] 頁面,然後按一下 [設定為起始頁]。
  6. 儲存此專案,然後按一下 [Visual Studio.NET 中的 [開始]。請注意編譯專案,而且預設網頁執行。
  7. 在 [文字方塊] 中輸入作者的姓氏,,然後按一下 [Get 作者。請注意呼叫預存程序,而且傳回的資料列填入 DataGrid

    您可以提供 SQL Server 型別搜尋字串,例如 G %,傳回所有作者的姓氏開頭字母 G.」]

疑難排解

  • 如果您不能連接至資料庫,請確定 ConnectionString 正確指到正在執行 SQL Server 的伺服器。
  • 如果連接至該資料庫,但如果您遇到的問題,當您嘗試建立預存程序請確定您有正確的權限,您要連接的資料庫中建立預存程序。

屬性

文章編號: 320916 - 上次校閱: 2003年12月5日 - 版次: 3.3
這篇文章中的資訊適用於:
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft ASP.NET (included with the .NET Framework)
  • Microsoft ASP.NET 1.1
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# .NET 2003 標準版
關鍵字:?
kbmt kbhowtomaster kbsqlclient kbstoredproc kbsystemdata KB320916 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:320916
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com