在使用 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 Northwind
Go
Create PROC my_proc
As
SELECT * 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();
}
}
2. 带有参数的存储过程的应用
(1) 创建带有参数的存储过程在 SQL Server 自带的 Northwind 数据库上新建一个名为my_proc 的存储过程, 该存储过程返回目的地为某一国家的订单( 其中某一国家通过表单输入)
具体命令如下:
USE Northwind
Go
Create PROC my_proc @in_Country varchar(20)
As
SELECT * FROM order WHERE ShipCountry=@in_country
Go
(2) 创建表单程序如下:
<html>
<body>
<form action =" StorePro2.aspx">国家: <input name="country" type=text size=10 >
<input type=submit name="submit" value="提交">
</form>
</body>
</html>
(3) 创建调用参数存储过程的应用程序
在运用带有参数的存储过程建立数据库应用程序时, 我们一般都要用到 SqlParameter 类, 该类封装了各种与 Sql 参数相关的属性和方法。其中的属性包括了 ParameterName, SqlDBType,Direction, Size, Value, SourceColumn 以及 SourceVersion 等。其中ParameterName, SqlDBType, Direction, Size 等属性是用于匹配存储过程中定义的参数的。下面就通过程序来调用这个存储过程。
创建一个文件叫 StorePro2.aspx。
该程序的代码与 StorePro.aspx 程序代码基本相同, 只不过是在第 12 行和第 13 行之间间插入语句:
sda.SelectCommand.Parameters.Add ("@in_country",SqlDbType.NVarChar).Value= Request.QueryString("country ")其中: Request.QueryString("country ")来自表单中接收的数据。
3. 总结:
本文讨论了存储过程的基本知识以及通过实例说明了在ASP.NET 数据库应用程序中如何结合SqlDataAdapter 对象、DataSet 对象、SqlParameter 对象等构建数据驱动的应用程序。我们不难发现将数据更新业务逻辑封装在存储过程中是一种很好的设计方法, 它能提高应用程序的可管理性、可扩展性以及数据库的安全性。