c#调用存储过程两种方法

摘要:
传统的调用方法不仅速度慢,而且代码会随着存储过程的增加而扩展,难以维护。调用存储过程来实现数据库操作是许多程序员使用的方法,大多数程序员在可以使用存储过程时使用存储过程,很少直接使用SQL语句,因此存储过程非常有用和重要。从以上分析中,我们可以看出在应用程序中使用存储过程是必要的。调用存储过程的两种不同方法为了突出新方法的优点,首先介绍在.NET中调用存储过程“官方”方法。
摘要 存储过程的调用在B/S系统中用的很多。传统的调用方法不仅速度慢,而且代码会随着存储过程的增多不断膨胀,难以维护。新的方法在一定程度上解决了这些问题。 

  关键词 ASP.NET;存储过程 
  
  在使用.NET的过程中,数据库访问是一个很重要的部分,特别是在B/S系统的构建过程中,数据库操作几乎成为了一个必不可少的操作。调用存储过程实现数据库操作使很多程序员使用的方法,而且大多数的程序员都是能使用存储过程就使用存储过程,很少直接使用SQL语句,所以存储过程是很有用而且很重要的。 

  存储过程简介 

  简单的说,存储过程是由一些SQL语句和控制语句组成的被封装起来的过程,它驻留在数据库中,可以被客户应用程序调用,也可以从另一个过程或触发器调用。它的参数可以被传递和返回。与应用程序中的函数过程类似,存储过程可以通过名字来调用,而且它们同样有输入参数和输出参数。 

  根据返回值类型的不同,我们可以将存储过程分为三类:返回记录集的存储过程, 返回数值的存储过程(也可以称为标量存储过程),以及行为存储过程。顾名思义,返回记录集的存储过程的执行结果是一个记录集,典型的例子是从数据库中检索出符合某一个或几个条件的记录;返回数值的存储过程执行完以后返回一个值,例如在数据库中执行一个有返回值的函数或命令;最后,行为存储过程仅仅是用来实现数据库的某个功能,而没有返回值,例如在数据库中的更新和删除操作。 

  使用存储过程的好处 

  相对于直接使用SQL语句,在应用程序中直接调用存储过程有以下好处: 

  (1)减少网络通信量。调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条的调用SQL语句要高得多。 

  (2)执行速度更快。有两个原因:首先,在存储过程创建的时候,数据库已经对其进行了一次解析和优化。其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接调用。 

  (3)更强的适应性:由于存储过程对数据库的访问是通过存储过程来进行的,因此数据库开发人员可以在不改动存储过程接口的情况下对数据库进行任何改动,而这些改动不会对应用程序造成影响。 

  (4) 布式工作:应用程序和数据库的编码工作可以分别独立进行,而不会相互压制。 

  由以上的分析可以看到,在应用程序中使用存储过程是很有必要的。 

  两种不同的存储过程调用方法 

  为了突出新方法的优点,首先介绍一下在.NET中调用存储过程的“官方”方法。另外,本文的所有示例程序均工作于SqlServer数据库上,其它情况类似,以后不再一一说明。本文所有例子均采用C#语言。 

  要在应用程序中访问数据库,一般性的步骤是:首先声明一个数据库连接SqlConnection,然后声明一个数据库命令SqlCommand,用来执行SQL语句和存储过程。有了这两个对象后,就可以根据自己的需要采用不同的执行方式达到目的。需要补充的是,不要忘记在页面上添加如下的引用语句:using System.Data.SqlClient。 

  就执行存储过程来说,如果执行的是第一类存储过程,那么就要用一个DataAdapter将结果填充到一个DataSet中,然后就可以使用数据网格控件将结果呈现在页面上了;如果执行的是第二和第三种存储过程,则不需要此过程,只需要根据特定的返回判定操作是否成功完成即可。 

  (1)执行一个没有参数的存储过程的代码如下: 
SqlConnection conn=new SqlConnection(“connectionString”); 
SqlDataAdapter da = new SqlDataAdapter(); 
da.SelectCommand = new SqlCommand(); 
da.SelectCommand.Connection = conn; 
da.SelectCommand.CommandText = "NameOfProcedure"; 
da.SelectCommand.CommandType = CommandType.StoredProcedure; 

  然后只要选择适当的方式执行此处过程,用于不同的目的即可。 

  (2)执行一个有参数的存储过程的代码如下(我们可以将调用存储过程的函数声明为ExeProcedure(string inputdate)): 
SqlConnection conn=new SqlConnection(“connectionString”); 
SqlDataAdapter da = new SqlDataAdapter(); 
da.SelectCommand = new SqlCommand(); 
da.SelectCommand.Connection = conn; 
da.SelectCommand.CommandText = "NameOfProcedure"; 
da.SelectCommand.CommandType = CommandType.StoredProcedure; 
(以上代码相同,以下为要添加的代码) 
param = new SqlParameter("@ParameterName", SqlDbType.DateTime); 
param.Direction = ParameterDirection.Input; 
param.Value = Convert.ToDateTime(inputdate); 
da.SelectCommand.Parameters.Add(param); 

  这样就添加了一个输入参数。若需要添加输出参数: 

//设置存储过程的参数值,其中@ParameterName为存储过程的参数. 
param = new SqlParameter("@ParameterName", SqlDbType.DateTime); 
param.Direction = ParameterDirection.Output; 
param.Value = Convert.ToDateTime(inputdate); //存储过程参数值; 
da.SelectCommand.Parameters.Add(param); 

  若要获得参储过程的返回值: 
param = new SqlParameter("@ParameterName", SqlDbType.DateTime); 
param.Direction = ParameterDirection.ReturnValue; 
param.Value = Convert.ToDateTime(inputdate); 
da.SelectCommand.Parameters.Add(param); 

执行:   DataSet myds=new DataSet(); 
da.Fill(myds,"tableName"); 

  从上面的代码我们可以看出,当存储过程比较多或者存储过程的参数比较多时,这种方法会大大影响开发的速度;另外一方面,如果项目比较大,那么这些用于数据库逻辑的函数在以后的维护中也是一个很大的负担。那么,有没有一种改进的方法可以解决这个问题呢?想到在执行没有参数的存储过程时只需要传入一个存储过程的名字就可以调用相应的存储过程,而且在SqlServer数据库中我们可以直接在查询分析器中敲入“存储过程名(参数列表)”样的字符串就可以执行存储过程,那么,是否可以把这种思想应用到应用程序中呢?

  于是在编译器中键入相应代码。这些代码是在调用不带参数的存储过程的代码的基础上改的。具体代码如下: 
SqlConnection conn=new SqlConnection(“connectionString”); 
SqlDataAdapter da = new SqlDataAdapter(); 
da.SelectCommand = new SqlCommand(); 
da.SelectCommand.Connection = conn; 
da.SelectCommand.CommandText = "NameOfProcedure(’para1’,’para2’,para3)"; 
da.SelectCommand.CommandType = CommandType.StoredProcedure; 

  为了使代码更具有代表性,要调用的存储过程的第一个和第二个参数都为字符串类型,第三个参数为整型。执行以后发现,完全可以达到预期的效果! 

  两种调用方法的比较 
   
  通过比较我们可以看到,第二种方法具有一个很明显的优点,那就是可以提高开发速度,节省开发时间,而且代码容易维护,在一定程度上也减少了系统大小。但是,由于对存储过程参数的处理比较笼统,如果要获取输出参数或者得到存储过程的返回值,这种方法就不能满足需要了。虽然如此,但是,这种方法毕竟可以让开发人员少些很大一部分的代码。如果不需要获取输出参数和返回值,那么几乎可以做到“一劳永逸”。因此在实际的程序开发中,这种方法还是具有一定的实用价值的。 

用来创建DataRead的存储过程调用; 
        
             //数据库连接字符串 
             string      connStr="Server=localhost;database=stuIMS;uid=sa;pwd=admin"; 
             //建立连接 
             SqlConnection conn=new SqlConnection(connStr); 
             //建立查询命令 
             SqlCommand myCommand=new SqlCommand("存储过程名",conn);            
             //调用存储过程名 
             myCommand.CommandType=CommandType.StoredProcedure; 

             //设置存储过程的参数值,其中@id 为存储过程的参数. 
             SqlParameter id=myCommand.Parameters.Add("@id",SqlDbType.NText); 
             id.Value=存储过程参数值; 

             //执行命令 
             SqlDataReader reader=myCommand.ExecuteReader();//读取数据 
             //或者 

             SqlDataReader reader=myCommand.ExecuteNonQuery();//数据更新 

http://sptgreen.javaeye.com/blog/351038 

免责声明:文章转载自《c#调用存储过程两种方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇移动界面UI颜色设计Mac之brew使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于MYSQL字符集问题(一)

  MySQL的字符集支持(Character Set Support)有两个方面:     字符集(Character set)和排序方式(Collation)。   对于字符集的支持细化到四个层次:     服务器(server),数据库(database),数据表(table)和连接(connection)。MySQL默认字符集   MySQL对于...

MySQL更改数据库数据存储目录

MySQL数据库默认的数据库文件位于/var/lib/mysql下,有时候由于存储规划等原因,需要更改MySQL数据库的数据存储目录。下文总结整理了实践过程的操作步骤。 1:确认MySQL数据库存储目录 [root@DB-Server tmp]# mysqladmin -u root -p variables | grep datadir Enter...

SQL Server 2016 CTP2.2 的关键特性

SQL Server 2016 CTP2.2 的关键特性 正如微软CEO 说的,SQL Server2016 是一个Breakthrough Flagship  Database(突破性的旗舰级数据库) SQL Server2016 CTP2.2是微软数据平台历史上迈出最大的一步,更快的事务处理和查询、任何设备更深入的洞察力、更先进的分析能力、全新安全技术...

Oracle用户,权限,角色以及登录管理 scoot 授权

Oracle用户,权限,角色以及登录管理 1. sys和system用户的区别 system用户只能用normal身份登陆em。除非你对它授予了sysdba的系统权限或者syspoer系统权限。sys用户具有“SYSDBA”或者“SYSOPER”权限,登陆em也只能用这两个身份,不能用normal。 -- 最重要的区别,存储的数据的重要性不同 sys所有...

Oracle12c 性能优化攻略:攻略1-1:创建具有最优性能的数据库

一:章节前言 本章着眼于影响表中数据存储性能的数据库特性。 表的性能部分取决于在创建之前所应用的数据库特性。例如:在最初创建数据库时采用的物理存储特性以及相关的表空间都会在后来影响表的性能。类似地,表性能还受到最开始选择的物理特性的影响。例如:表类型和数据类型。 因此应用实践中使用的数据库、表空间、和表的创建标准(并将性能问题放在心上),就形成了优化数据...

mysql数据库设置外键,更新与删除选项

CASCADE:父表delete、update的时候,子表会delete、update掉关联记录;SET NULL:父表delete、update的时候,子表会将关联记录的外键字段所在列设为null,所以注意在设计子表时外键不能设为not null;RESTRICT:如果想要删除父表的记录时,而在子表中有关联该父表的记录,则不允许删除父表中的记录;NO A...