SQL存储过程在.NET数据库中的应用

存储过程|数据|数据库

一.前言:

存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象,任何一个设计良好的数据库应用程序都应该用到存储过程。总的来说,存储过程具有以下一些优点:

◆存储过程允许标准组件式编程

◆存储过程能够实现较快的执行速度

◆存储过程能够减少网络流量

◆存储过程可被作为一种安全机制来充分利用

本文作者将向大家介绍.NET数据库应用程序中存储过程的应用,以及如何将它与ADO.NET中的SqlDataAdapter对象、DataSet对象等结合使用以提高.NET数据库应用程序的总体性能。

二.系统要求:

开发工具:Visual Studio.NET

数据库管理系统:SQL Server 2000(其中包含了示例程序所用到的Pubs数据库)

三.创建一个简单的存储过程:

这里我将向大家介绍如何运用Visual Studio.NET IDE来创建存储过程。运用Visual Studio.NET IDE创建存储过程是非常容易和直观的,你只要在服务器资源管理器中导向到Pubs数据库并展开节点,就会发现包括存储过程在内的各种数据库对象,如图1所示。

在存储过程节点上点击右键便可弹出一个菜单,其中包含了“新建存储过程”的命令。新建一个存储过程后,IDE中的代码编辑窗口便出现如下所示的代码模板:

CREATE PROCEDURE dbo.StoredProcedure1
/*
(
@parameter1 datatype = default value,
@parameter2 datatype OUTPUT )
*/
AS
/* SET NOCOUNT ON */
RETURN

上面的代码模板符合简化的创建存储过程的语法规则,完整的语法规则如下:

CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]

限于篇幅,各个参数的含义在此就不多作介绍了,有兴趣的读者可以参考有关SQL Server 2000数据库管理系统的资料。

下面我对该代码模板中的各个语法成分略作介绍。CREATE PROCEDURE声明创建一个存储过程,后面跟着该存储过程的名称。“/*……*/”中的成分是该存储过程的参数,可包括输入参数和输出参数。AS关键字后面的内容是该存储过程的主体部分,其中是任何数量和类型的包含在存储过程中的SQL语句。RETURN关键字表明存储过程结束并能返回整型状态值给调用者。下面我们就来创建一个简单的不带参数的存储过程并运用之:

CREATE PROCEDURE dbo.up_GetPublisherInfo
AS
SELECT pub_id, pub_name, city, state, country
FROM publishers
RETURN

创建以上存储过程后,保存之。保存完毕,与该存储过程相对应的节点就会出现在服务器资源管理器中。同时请注意代码编辑窗口中的CREATE关键字变为ALTER关键字了,该关键字是用于更改任何现有的存储过程的。要运行上述存储过程,只要点击其节点并在右键弹出菜单中选择“运行存储过程”,运行的结果图示如下:

四.创建一个带参数的存储过程:

以上我们创建了一个简单的不带参数的存储过程,而在实际的应用中往往会用到很多带有参数的存储过程。带有参数的存储过程一般是用于更新数据或是插入数据的。下面我们可以运用同样的操作方法创建一个带参数的存储过程:

CREATE PROCEDURE dbo.up_UpdatePublisherInfo
(
@pub_id char (4),
@pub_name varchar (40),
@city varchar (20),
@state char (2),
@country varchar (30)
)
AS
UPDATE publishers
SET pub_name = @pub_name, city = @city, state = @state,
 country = @country
WHERE ( pub_id = @pub_id )
RETURN

在上面的创建存储过程的代码中,我们通过在名称前添加一个“@”标志来声明存储过程的局部变量-参数,同时还声明了各个参数的类型,确定了各个参数的方向值,也即表明该参数是输入型的还是输出型的或者是输入输出型的或者是返回值型的。用户通过相应的存储过程名称以及正确有效的参数便可调用该存储过程了。还有,你可以通过运用OUTPUT关键字在参数中添加输出型的参数,具体方法请参考上面的语法规则。输出型的参数能返回给调用者相关的信息。

上面的存储过程能更新publishers表中相应出版商的信息。你可以通过点击该存储过程的节点,在右键弹出菜单中选择“运行存储过程”来执行它。一旦执行,IDE中便弹出一个输入出版商信息的对话框(如图3所示)。在该对话框中填入正确有效的更新信息,注意pub_id的值在原来的表中必须存在,然后点击“确定”按钮便可更新数据了。

五.创建简单存储过程的数据库应用程序:

下面我们就运用上述的不带参数的存储过程来一个数据库应用程序,其中还用到了ADO.NET中的SqlDataAdapter对象以及DataSet对象。其中的SqlDataAdapter对象作为SQL Server数据库和DataSet对象的桥梁将两者联系在一起。SqlDataAdapter对象包含了两个常用的方法:Fill()方法和Update()方法。其中的Fill()方法能从数据库中获取相应数据并填充到DataSet对象中,而Update()方法顾名思义就是更新数据集的意思了。在调用Fill()方法以前,我们必须设置好SqlDataAdapter对象的SelectCommand属性,该属性其实是一个SqlCommand对象。SelectCommand属性中包含有效的SQL语句,并能据此从数据库中获取相应数据并填充到DataSet对象中。

首先,我们创建一个Windows Forms应用程序,编程语言为C#。在Visual Studio.NET中创建一个新的项目后,给该项目添加一个新的类-Publishers类,该类封装了连接到后台数据库并获取数据集对象的业务逻辑。步骤如下:

1.添加必要的命名空间引用:using System.Data.SqlClient;

2.给该类添加如下一些必要的变量:

private SqlConnection cnPubs;
private SqlCommand cmdPubs;
private SqlDataAdapter daPubs;
private DataSet dsPubs;

3.在该类的构造函数中完成连接后台数据库,获取SqlDataAdapter对象等业务逻辑:

public Publishers()
{
try
{
// 创建一个数据库连接对象
cnPubs = new SqlConnection( "server=localhost;integrated security=true;database=pubs" );
// 创建一个SqlCommand对象,并指明其命令类型为存储过程
cmdPubs = new SqlCommand();
cmdPubs.Connection = cnPubs;
cmdPubs.CommandType = CommandType.StoredProcedure;
cmdPubs.CommandText = "up_GetPublisherInfo";
// 创建一个SqlDataAdapter对象,设定其SelectCommand属性为上面的SqlCommand对象
daPubs = new SqlDataAdapter();
daPubs.SelectCommand = cmdPubs;
// 创建一个DataSet对象
dsPubs = new DataSet();
}
catch( Exception ) {}
}

4.最后为该类提供一个GetPublisherInfo()方法,该方法用SqlDataAdapter对象填充DataSet对象并返回填充后的DataSet对象,方法如下(值得注意的是:SqlDataAdapter对象会隐式地打开数据库连接并在获取数据后隐式地关闭连接,这就是说DataSet对象是工作在非连接模式下的。而当你显式地打开数据库连接并获取数据后,SqlDataAdapter对象并不会将该连接关闭):

public DataSet GetPublisherInfo()

时间: 2024-10-29 09:54:01

SQL存储过程在.NET数据库中的应用的相关文章

sql server-C#向SQLServer数据库中插入数据,没有反应

问题描述 C#向SQLServer数据库中插入数据,没有反应 C#向SQLServer数据库中插入数据,没有反应,代码如下: string conn, sql, strxm,strxh,strxb,strlxfs; strxm = textBox1.Text; strxh = textBox2.Text; strxb = textBox3.Text; strlxfs = textBox4.Text; conn = "Server=.;Database=13rj;Trusted_Connectio

SQL点滴12—SQL Server备份还原数据库中的小把戏

原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息"is formatted to support  1 media families, but 2 media families are expected according to the backup device specification".如下图: 解决办法是首先选中击上一次备份的文件,点击Remove,去掉当前的备份文件,然后再点击OK备份.这样才能正确的备份.也

有关数据库SQL递归查询在不同数据库中的实现方法_MsSql

本文给大家介绍有关数据库SQL递归查询在不同数据库中的实现方法,具体内容请看下文. 比如表结构数据如下: Table:Tree ID Name ParentId 1 一级  0 2  二级 1 3  三级 2 4 四级 3 SQL SERVER 2005查询方法: //上查 with tmpTree as ( select * from Tree where Id=2 union all select p.* from tmpTree inner join Tree p on p.Id=tmpT

有关数据库SQL递归查询在不同数据库中的实现方法

本文给大家介绍有关数据库SQL递归查询在不同数据库中的实现方法,具体内容请看下文. 比如表结构数据如下: Table:Tree ID Name ParentId 1 一级  0 2  二级 1 3  三级 2 4 四级 3 SQL SERVER 2005查询方法: //上查 with tmpTree as ( select * from Tree where Id=2 union all select p.* from tmpTree inner join Tree p on p.Id=tmpT

MS SQL基础教程:数据库中的连接查询

数据库中的各个表中存放着不同的数据,用户往往需要用多个表中的数据来组合.提炼出所需要的信息.如果一个查询需要对多个表进行操作,就称为连接查询.连接查询的结果集或结果表,称为表之间的连接连接.查询实际上是通过各个表之间共同列的关联性来查询数据的,它是关系数据库查询最主要的特征. 连接查询分为等值连接查询.非等值连接查询.自连接查询.外部连接查询和复合条件连接查询. 10.3.1 等值与非等值连接查询 表之间的连接是通过相等的字段值连接起来的查询称为等值连接查询.可以用两种方式来指定连接条件.下面例

sql server-按条件从数据库中批量导出excel表

问题描述 按条件从数据库中批量导出excel表 一张表中有58万条记录,产地(产地为字符型)也有200个,按产地(如产地为北京的为一个excel表)分类导出带表头的excel表,excel表名与导出的产地一致.求各位大侠帮忙,万分感谢!(用oracle,sql server都可) 解决方案 http://blog.csdn.net/yongsheng0550/article/details/6714111 解决方案二: 数据库数据批量导出到excel利用POI将数据库表导出到Excel 解决方案

sql server-SQLServer如何定位数据库中存储的是那些信息

问题描述 SQLServer如何定位数据库中存储的是那些信息 我有一个网站后台数据库的备份,并且已经在自己机器上还原了,现在我想知道 这个数据库里面的每张表都对应的是网站上的那些信息,有什么好点的办法么?求大神指导 解决方案 这个需要分析,数据库存放数据跟网站信息对应是逻辑关系,只有网站开发者清楚,你需要先分析网站的数据是如何读取,组织的.然后再结合数据库来看各个字段是如何对应关系 解决方案二: NULL在SQLServer数据库日志文件中的存储 解决方案三: 这个只能通过字段找到那些内容是属于

MS SQL基础教程:数据库中的锁

11.5.1 锁的概念 锁(Lock) 是在多用户环境下对资源访问的一种限制.机制当对一个数据源加锁后,此数据源就有了一定的访问限制.我们就称对此数据源进行了"锁定".在SQL Server中,可以对以下的对象进行锁定: 数据行(Row):数据页中的单行数据: 索引行(Key):索引页中的单行数据,即索引的键值: 页(Page):页是SQL Server 存取数据的基本单位,其大小为8KB: 盘区(Extent):一个盘区由8 个连续的页组成: 表(Table): 数据库(Databa

怎样用SQL语句查询一个数据库中的所有表?

SQL  SERVER:  select * from information_schema.tables ORACLE: select table_name from user_tables  ACCESS: select    name    from    MSysObjects    where    type=1    and    flags=0