你目前正处于脱机状态,正在等待 Internet 重新连接

如何通过使用 Visual Basic .NET 在 ASP.NET 中调用 SQL Server 存储过程

本文的发布号曾为 CHS306574
有关本文的 Microsoft Visual C# .NET 版本,请参见 320916.
有关本文的 Microsoft Visual J# .NET 版本,请参见 320622.
有关本文的 Microsoft Visual Basic 6.0 版本,请参见 164485.
有关本文的 Microsoft Visual Basic 6.0 版本,请参阅 300488.

本任务的内容

概要
本文介绍如何将 ASP.NET 和 ADO.NET 与 Visual Basic .NET 配合使用以创建并调用带有输入参数和输出参数的 Microsoft SQL Server 存储过程。

本文中的代码示例首先检查要创建的存储过程在数据库中是否存在。如果存储过程不存在,则代码创建一个存储过程,该过程采用一个参数来根据姓氏搜索 Authors 表,并在输出参数中返回匹配的行及行数。

本文还介绍如何创建提供简单用户界面的 Web 窗体。Web 窗体包含下列项目:
  • 用户在其中键入搜索条件的文本框。
  • 显示搜索结果的 DataGrid 控件。
  • 显示返回记录个数的 Label 控件。
  • 单击按钮时调用存储过程的 Button 控件。
back to the top

要求

下面的列表列出了推荐使用的硬件、软件、网络架构以及所需的 Service Pack:
  • Microsoft SQL Server 7.0 或更高版本
  • Microsoft Visual Studio .NET
  • Microsoft Visual Basic .NET
  • 在数据库中创建存储过程的权限
本文假定您熟悉下列主题:
  • SQL Server 存储过程
back to the top

创建 ASP.NET 项目并添加控件

在本节中,您将创建 ASP.NET 项目并生成基本的用户界面。注意,这些步骤使用 Microsoft Visual Basic .NET 代码。若要创建项目,请按照下列步骤操作:
  1. 单击开始,指向程序,指向 Microsoft Visual Studio .NET,然后单击 Microsoft Visual Studio .NET
  2. 在 Visual Studio .NET 起始页上,单击新建项目
  3. 新建项目对话框中,单击项目类型下面的 Visual Basic 项目,然后单击模板下面的 ASP.NET Web 应用程序
  4. 名称框中,键入 Web 应用程序的名称,然后单击确定
  5. 将下面的服务器控件添加到 Web 窗体中,并按照属性在表中列出的情况设置属性:
    控件ID 属性文本属性
    LabellblLastName键入作者的姓氏:
    TextBoxtxtLastName%
    ButtonbtnGetAuthors获取作者
    LabellblRowCount(行数)

  6. DataGrid 服务器控件从工具箱拖到 Web 窗体上,并将 Name 属性设置为 GrdAuthors
  7. 右键单击该网格,然后单击自动套用格式
  8. 单击 Professional 1 作为方案,然后单击确定
back to the top

创建 GetAuthorsByLastName 存储过程

使用下面的 Transact-SQL 代码创建 GetAuthorsByLastName 存储过程:
Create Procedure GetAuthorsByLastName1 (@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 和 @RowCount。@au_lname 参数是输入参数,该参数获取搜索字符串以便在 Authors 表中执行一个“类似”搜索。@RowCount 参数是输出参数,该参数使用 @@ROWCOUNT 变量来获取受影响的行。

back to the top

创建并运行存储过程

若要访问 SQL Server 数据库,您必须导入 System.Data.SqlClient 命名空间,该命名空间提供新对象,例如 SqlDataReaderSqlDataAdapter 对象。可以使用 SqlDataReader 从 SQL Server 数据库中读取行的只进数据流。DataAdapter 表示一组数据命令和一个数据连接,可用来填充 DataSet 对象以及更新 SQL Server 数据库。

ADO.NET 还引入 DataSet 对象,它是数据的内存驻留表示形式,可提供一致的关系编程模型(与数据来源无关)。本节中的代码使用了所有这些对象。
  1. 双击该 Web 窗体。
  2. 将下面的代码添加到 Web 窗体的“声明”部分,该区域显示在“代码”窗口顶部:
    Imports System.DataImports System.Data.SqlClient					
  3. 若要确保存储过程存在并创建新的存储过程,请结合使用 SqlCommand 对象和 SqlDataReader 对象。可以使用 SqlCommand 针对数据库运行任何 SQL 命令。然后调用 SqlCommandExecuteReader 方法以返回 SqlDataReader,它包含查询的匹配行。

    在 Web 窗体的 Page_Load 事件中添加以下代码:
    '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 Not IsPostBack ThenDim MyConnection As SqlConnectionDim MyCommand As SqlCommandDim MyDataReader As SqlDataReader'Create a Connection object.MyConnection = New SqlConnection("server=(local);database=pubs;Trusted_Connection=yes")'Create a Command object, and then set the connection.'The following SQL statements check whether a GetAuthorsByLastName stored procedure 'already exists.MyCommand = New SqlCommand("if object_id('pubs..GetAuthorsByLastName') is not null " + "begin" + " if objectproperty(object_id('pubs..GetAuthorsByLastName'), 'IsProcedure')= 1" + " select object_id('pubs..GetAuthorsByLastName')" + " else" + " return " + "end" + " else" + " return", MyConnection)With MyCommand'Set the command type that you will run..CommandType = CommandType.Text'Open the connection..Connection.Open()'Run the SQL statement, and then get the returned rows to the DataReader.MyDataReader = .ExecuteReader()'If any rows are retuned, 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 Not MyDataReader.Read() Then.CommandText = "create procedure GetAuthorsByLastName (@au_lname varchar(40), " & _ @RowCount int output) " & _ " as select * from authors where au_lname like @au_lname; select @RowCount=@@ROWCOUNT"MyDataReader.Close().ExecuteNonQuery()ElseMyDataReader.Close()End If.Dispose()  'Dispose of the Command object.MyConnection.Close() 'Close the connection.End WithEnd If					
  4. btnGetAuthors 按钮的 Click 事件中调用存储过程,然后使用 SqlDataAdapter 对象运行存储过程。必须为该存储过程创建参数,并将它附加到 SqlDataAdapter 对象的 Parameters 集合中。

    将以下代码附加到 Page_Load 事件后面:
    Private Sub btnGetAuthors_Click(ByVal sender As System.Object, _ByVal e As System.EventArgs) Handles btnGetAuthors.ClickDim DS As DataSetDim MyConnection As SqlConnectionDim MyDataAdapter As SqlDataAdapter'Create a connection to the SQL Server.MyConnection = New SqlConnection("server=(local);database=pubs;Trusted_Connection=yes")'Create a DataAdapter, and then provide the name of the stored procedure.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 = Trim(txtLastName.Text)'Create and add an output parameter to Parameters collection. MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@RowCount", _SqlDbType.Int, 4))'Set the direction for the parameter.This parameter returns the Rows returned.MyDataAdapter.SelectCommand.Parameters("@RowCount").Direction = ParameterDirection.OutputDS = New DataSet() 'Create a new DataSet to hold the records.MyDataAdapter.Fill(DS, "AuthorsByLastName") 'Fill the DataSet with the rows returned.'Get the number of rows returned, and then 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'Bind the DataSet to the DataGrid. 'NOTE:If you do not call this method, the DataGrid is not displayed!Grdauthors.DataBind()MyDataAdapter.Dispose() 'Dispose of the DataAdapter.MyConnection.Close() 'Close the connection.End Sub					
  5. 在解决方案资源管理器中,右键单击 .aspx 页,然后单击“设为起始页”。
  6. 保存项目,然后在 Visual Studio .NET 中单击开始。请注意,将编译项目并运行默认页。
  7. 在文本框中键入作者的姓氏,然后单击获取作者。请注意,将会调用存储过程,并且返回的行将填充 DataGrid

    可以提供 SQL Server 类型的搜索字符串,如 G%,它将返回姓氏以字母“G”开头的所有作者。
back to the top

疑难解答

  • 如果无法连接到数据库,请确认 ConnectionString 是否正确地指向运行 SQL Server 的服务器。
  • 如果能够连接到数据库,但在尝试创建存储过程时遇到问题,请确认您是否拥有在当前连接的数据库中创建存储过程的正确权限。
back to the top
参考
有关更多信息,请参见 Microsoft .NET Framework 软件开发工具包 (SDK) 文档中的以下主题:有关 ADO.NET 或 Visual Basic .NET 的常规信息,请参阅以下 MSDN 新闻组:有关详细信息,请参阅以下书籍:
Wyke, R. Allen, and Sultan Rehman and Brad Leupen.XML Programming (Core Reference).Microsoft Press, 2001.
有关更多信息,请参见以下 Microsoft 培训和认证课程:有关如何使用 Microsoft Active Server Pages 执行此任务的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
300488 如何从 ASP 页运行 SQL 存储过程
back to the top
属性

文章 ID:306574 - 上次审阅时间:10/24/2012 13:23:00 - 修订版本: 7.0

Microsoft ASP.NET 1.0, Microsoft ASP.NET 1.1, Microsoft ADO.NET 1.1, Microsoft Visual .NET 2002 标准版, Microsoft Visual Basic .NET 2003 标准版

  • kbhowtomaster kbsqlclient kbsystemdata KB306574
反馈