如何: 调用 SQL Server 存储过程在 ASP.NET 中使用 Visual C#.net

文章翻译 文章翻译
文章编号: 320916 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本文演示如何使用 ASP.NET 和 ADO.NET 使用 Visual C#.net 创建并调用一个 Microsoft SQL Server 存储带有输入的参数和输出参数的过程。

这篇文章中的代码示例首先检查您将创建该存储的过程是否存在标准 Microsoft SQL Server 安装中包括了 Pubs 数据库中。如果不存在存储的过程,该代码将创建一个带有搜索基于姓 作者 表的一个参数和返回匹配的行和在输出参数中返回的行数的存储的过程。

本文还演示了如何创建 Web 窗体,提供了一个简单的用户界面。Web 窗体中包含以下项:
  • 用户在其中键入搜索条件的文本框。
  • 显示搜索结果的 DataGrid 控件。
  • 一个 标签 控件,该控件显示返回的记录数。
  • 单击该按钮时调用该存储的过程的 按钮 控件。

要求

下面的列表概述了建议的硬件、 软件、 网络的基础结构和所需的服务包:
  • 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 参数是获取要执行"像"搜索,请在 作者 表中搜索字符串的输入的参数。@ 行数参数是输出参数,以获取受影响的行中使用 @ @ ROWCOUNT 变量。

创建和运行存储的过程

若要进行 SQL Server 数据库中,您必须导入新的对象,如 SqlDataReaderSqlDataAdapter 对象提供了在 System.Data.SqlClient 命名空间。您可以使用 SqlDataReader SQL Server 数据库中读取行的一个只进流。DataAdapter 代表一组数据命令和数据库连接,您可以使用填充 数据集 对象,并更新 SQL Server 数据库。

ADO.NET 还引入了是驻留在内存中的表示形式提供一致的、 关系的编程模型,无论数据源的数据在 数据集 对象。本节中的该代码使用所有这些对象。
  1. 双击 Web 窗体。
  2. 下面的代码 (该 using 指令) 添加到代码窗口的顶部会出现在 Web 窗体的声明部分:
    using System.Data;
    using System.Data.SqlClient;
    					
  3. 若要确保存在存储的过程并创建一个新的存储的过程使用 SqlCommand 对象与 SqlDataReader 对象。使用 SqlCommand 可以对数据库运行任何 SQL 命令。然后调用 ExecuteReader 方法的 SqlCommand 返回 SqlDataReader,其中包含您的查询的匹配行。

    Page_Load 事件的 Web 窗体中添加以下代码:
    	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. 在文本框中键入作者的姓氏,然后单击 获取作者。请注意调用存储的过程和返回的行填充 数据网格

    您可以提供 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 标准版
  • Microsoft Visual C# .NET 2003 标准版
关键字:?
kbmt kbhowtomaster kbsqlclient kbstoredproc kbsystemdata KB320916 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 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