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

文章翻译 文章翻译
文章编号: 306574 - 查看本文应用于的产品
本文的发布号曾为 CHS306574
展开全部 | 关闭全部

本文内容

概要

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

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

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

要求

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

创建 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 作为方案,然后单击确定

创建 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 变量来获取受影响的行。

创建并运行存储过程

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

ADO.NET 还引入 DataSet 对象,它是数据的内存驻留表示形式,可提供一致的关系编程模型(与数据来源无关)。本节中的代码使用了所有这些对象。
  1. 双击该 Web 窗体。
  2. 将下面的代码添加到 Web 窗体的“声明”部分,该区域显示在“代码”窗口顶部:
    Imports System.Data
    Imports 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 Then
    Dim MyConnection As SqlConnection
    Dim MyCommand As SqlCommand
    Dim 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()
    Else
    MyDataReader.Close()
    End If
    
    .Dispose()  'Dispose of the Command object.
    MyConnection.Close() 'Close the connection.
    End With
    End 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.Click
    Dim DS As DataSet
    Dim MyConnection As SqlConnection
    Dim 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.Output
    
    DS = 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”开头的所有作者。

疑难解答

  • 如果无法连接到数据库,请确认 ConnectionString 是否正确地指向运行 SQL Server 的服务器。
  • 如果能够连接到数据库,但在尝试创建存储过程时遇到问题,请确认您是否拥有在当前连接的数据库中创建存储过程的正确权限。

参考

有关更多信息,请参见 Microsoft .NET Framework 软件开发工具包 (SDK) 文档中的以下主题:
ADO.NET 概述
http://msdn.microsoft.com/zh-cn/library/h43ks021.aspx

ADO.NET 数据集
http://msdn.microsoft.com/zh-cn/library/zb0sdh0b(VS.71).aspx

使用 .NET 数据提供程序访问数据
http://msdn.microsoft.com/zh-cn/library/s7ee2dwt(vs.71).aspx
有关 ADO.NET 或 Visual Basic .NET 的常规信息,请参阅以下 MSDN 新闻组:
microsoft.public.dotnet.framework.adonet

microsoft.public.dotnet.languages.vb
有关详细信息,请参阅以下书籍:
Wyke, R. Allen, and Sultan Rehman and Brad Leupen.XML Programming (Core Reference).Microsoft Press, 2001.
有关更多信息,请参见以下 Microsoft 培训和认证课程:
2389 使用 ADO.NET 编程
有关如何使用 Microsoft Active Server Pages 执行此任务的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
300488 如何从 ASP 页运行 SQL 存储过程

属性

文章编号: 306574 - 最后修改: 2012年10月24日 - 修订: 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
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