sql使用存储过程和交易
在过去的一年。学习数据库的时候学校有存储过程。永远只是知道一些理论,我不知道怎么用。时隔一年,最终找到怎样使用存储过程了。
在机房收费系统中。有些操作。须要多次运行sql语句,多次运行完毕才算是完毕这个事件流。
可是假设当中有一个环节出了错误,那么没出错误的那些操作是不是就多余了。
运行存储过程。就是运行多句SQl语句。而事务。是为了控制这些语句 要么都做,要么 都不做。
在机房收费系统中。运行sql语句的时候。
一般的sql语句用法:定义一个字符串,用于存放sql语句。之后指明commandtype=commandType.text 假设有參数的情况下,须要提供參数。
使用存储过程的方法:写好存储过程,在vs中直接调用。指明commandtype=CommandType.StoredProcedure 假设有參数的情况下,须要提供參数。使用存储过程,避免了在vs中写 字符串。
接下来看一个实例。题:设置基本数据,首先须要取消之前使用的基本数据,然后再插入新的基本数据。
首先。把使用的存储过程预先写入数据库。
Create procedure [dbo].[SetBasicData] @rate char(16),@steptime char(16),@leasttime char(16),@mincash char(16),@cardtype char(16),@Heaf char(16) as begin tran update T_Basic set cardtype='不使用' where cardtype=@cardtype insert into T_Basic values(@rate,@steptime,@leasttime,@mincash,@cardtype,@Heaf,default,default) if @@ROWCOUNT<>2 --检查以上两条sql语句是否正确运行 rollback tran --没有正确运行,回滚 else commit tran --正确运行,提交事务
写完之后。能够在以下的位置 找到写好的存储过程。
在这里,就省略U层和B层了。
仅仅对照一下D层的代码就能够了。
1、没有使用存储过程的D层代码
''' <summary> ''' 插入新的基本数据 ''' </summary> ''' <param name="basic">新的基本数据实体</param> ''' <param name="head">操作人的姓名</param> ''' <returns></returns>返回true表示插入成功,返回false表示失败 ''' <remarks></remarks> Public Function SetBasicInfo(basic As Entity.BasicInfoEntity, head As String) As Boolean Implements IDAL.IBasic.SetBasicInfo Dim strSQL As String strSQL = "Update BasicData_Info set status='不使用' where status=@status Insert into BasicData_Info(Rate,stepTime,leasttime,preparetime,mincash,head,status) values(@Rate,@stepTime,@leastTime,@prepareTime,@minCash,@head,@status)" Dim helper As New SqlHelper Dim sqlparameter As SqlParameter() = {New SqlParameter("@Rate", basic.Rate), New SqlParameter("@stepTime", basic.StepTime), New SqlParameter("@leastTime", basic.LeastTime), New SqlParameter("@minCash", basic.MinCash), New SqlParameter("@head", head), New SqlParameter("@status", basic.Status)} Dim flag As Boolean flag = helper.UpdDelAlter(strSQL, CommandType.Text, sqlparameter) Return flag End Function
2、使用存储过程的D层代码
''' <summary> ''' 设置基本数据 ''' </summary> ''' <param name="basic">基本数据实体</param> ''' <returns></returns>返回true表示插入成功,返回false表示失败 ''' <remarks></remarks> Public Function SetBasicData(basic As Entity.BasicEntity) As Boolean Implements IDAL.IBasic.SetBasicData Dim strSQL As String = "SetBasicData" '存储过程名 Dim sqlparams As SqlParameter() = {New SqlParameter("@rate", basic.Rate), New SqlParameter("@steptime", basic.StepTime), New SqlParameter("@leasttime", basic.LeastTime), New SqlParameter("@mincash", basic.MinCash), New SqlParameter("@cardtype", basic.CardType), New SqlParameter("@Heaf", basic.Heaf)} '传入參数 Dim helper As New SqlHelper Dim flag As Boolean flag = helper.UpdDelAlter(strSQL, CommandType.StoredProcedure, sqlparams) Return flag End Function
对照上面的两种方法。
第一种方法:假设插入的基本数据设定有错,那么运行该操作之后,该系统中基本数据就被改动为‘不使用’的状态。出现错误。
另外一种方法,省去了写sql语句的麻烦。并且 假设数据库有变动,不须要改动代码。能够直接在sql server中 改动存储过程,也方便调试。
总结:使用存储过成能够提高数据的运行速度。当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。能够极大的提高数据库的使用效率,降低程序的运行时间,这一点在较大数据量的数据库的操作中是很重要的。在代码上看。SQL语句和程序代码语句的分离。能够提高程序代码的可读性
假设有更加上优化方法。欢迎指出!
版权声明:本文博客原创文章。博客,未经同意,不得转载。