MSSQLSERVER数据库- 使用C#来操作事务
就在不久前,我在博客园看到一个名为英雄默问出处的博客。他里面有两篇是介绍用C#来操作事务的。用C#来操作事务和用SQL语句来操作事务原理是一模一样的。总结起来有三个步骤: 1.开启事务 在操作事务上还分为本地事务和分布式事务。我从网上百度下来他们的定义,如下: 上面的定义没看懂也没关系,其实我看这些定义也挺烦的。记得有一回考操作系统,当时老师在课堂上说了一句可能会考定义,例如操作系统是什么,结果呢?操作系统是什么这句我背了好几遍。临到考前的早上还起来再读一次。考后就忘记了。这样的考试也够折腾人的了。
在看这三个小例子前先看一下数据库用的表,为了测试,一切都非常简单 test数据库的bank表有哪些字段的数据 bid?balance ?testLog数据库里的bankLo有哪些字段的数据 id?bid?oldBalance?newBalance?logtime ? 第一小例子 先在数据库里他建存储过程,里面写上事务的SQL语句 USE [test] GO /****** Object: StoredProcedure [dbo].[proc_bankTransaction] Script Date: 08/19/2012 10:42:05 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER procedure [dbo].[proc_bankTransaction] ( @result int output --0表示提交事务失败,表示提交事务成功 ) AS BEGIN declare @sumError int set @sumError=0 BEGIN TRANSACTION --开启事务 update bank set balance=balance-100 where bid='001'; set @sumError = @sumError +@@Error update bank set balance=balance+1000 where bid='002'; set @sumError = @sumError +@@Error IF(@sumError = 0) BEGIN set @result=1 --提交事务,表示提交事物成功 COMMIT TRANSACTION END ELSE BEGIN set @result=0 --回滚事务,表示回滚事务 ROLLBACK TRANSACTION END END C#操作的语句代码: static void Main(string[] args) { using (SqlConnection conn = new SqlConnection("server=.;database=test;uid=sa;pwd=123456")) { conn.Open(); using (SqlCommand cmd = new SqlCommand("proc_bankTransaction",conn)) { cmd.CommandType = CommandType.StoredProcedure; SqlParameter[] paras ={ new SqlParameter("@result",SqlDbType.Int) }; paras[0].Direction = ParameterDirection.Output; try { cmd.Parameters.AddRange(paras); cmd.ExecuteNonQuery(); Console.Write(paras[0].Value);//输出1表示成功,输出0表示失败 } catch (Exception ex) { Console.WriteLine(ex.Message); } } } Console.ReadLine(); } 第二个小例子:使用ADO.NET里面的一个类SqlTransaction来操作本地事务 namespace ConsoleApplication1 { class Program { static void Main(string[] args) { using (SqlConnection conn = new SqlConnection("server=.;database=test;uid=sa;pwd=123456")) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { SqlTransaction transaction = conn.BeginTransaction();//开始事物 cmd.Transaction = transaction; try { cmd.Connection = conn; cmd.CommandText = "update bank set balance='500' where bid='001'"; cmd.ExecuteNonQuery(); cmd.CommandText = "update bank set balance='2100' where bid='002'"; cmd.ExecuteNonQuery(); transaction.Commit();//如果都成功那么提交事物 } catch (Exception ex) { Console.Write(ex.Message); transaction.Rollback();//出现错误,进行回滚 } } } Console.ReadLine(); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data; using System.Data.SqlClient; using System.Transactions; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string bankStr = "server=.;database=test;uid=sa;pwd=123456"; string bankLogStr = "server=.;database=testLog;uid=sa;pwd=123456"; //为了简化操作步骤,假设我们已经知道是原来的balance的值为2100,更改后的值为1100 using (TransactionScope scope = new TransactionScope()) { try { using (SqlConnection conn = new SqlConnection(bankStr)) { conn.Open(); using (SqlCommand cmd = conn.CreateCommand()) { cmd.CommandText = "update bank set balance='1100' where bid='002'"; cmd.ExecuteNonQuery(); } } using (SqlConnection connBankLog = new SqlConnection(bankLogStr)) { connBankLog.Open(); using (SqlCommand cmd = connBankLog.CreateCommand()) { cmd.CommandText = "insert into bankLog(bid,oldBalance,newBalance,logtime) values('002','2100','1100','2010-09-01');"; cmd.ExecuteNonQuery(); } } scope.Complete(); } catch (Exception ex) { Console.Write(ex.Message); } } Console.ReadLine(); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |