(一)ADO.NET事务
定义:所谓事务,可以看做是一个操作单元,是最小的操作单位,在这个事务中的操作,要么全部执行成功,要么全部失败。
在一个事务性操作的环境下,操作有着以下的4种特性,被称为ACID特性
原子性(Atomicity) | 当事务结束,它对所有资源状态的改变都被视为一个操作,这些操作要不同时成功,要不同时失败 |
一致性(Consistency) | 操作完成后,所有数据必须符合业务规则,否则事务必须中止 |
隔离性(Isolation) | 事务以相互隔离的方式执行,事务以外的实体无法知道事务过程中的中间状态 |
持久性(Durable) | 事务提交后,数据必须以一种持久性方式存储起来
|
(1)参数化查询
//(1)构造连接字符串:如果integrated security=true表示可以在不知道数据库用户名和密码的情况下时,依然可以连接数据库,如果integrated security=false,或者不写,表示一定要输入正确的数据库登录名和密码。sspi ,相当于 True,建议用这个代替 True。 string connSQL = @"data source=服务器名称;initial catalog=数据库名称;persist security info=True;user id=用户名;password=密码;MultipleActiveResultSets=True"; //(2)生成连接字符串.--可以省略如果不能省略,下面要这样写SqlConnection conn = new SqlConnection(connStr.ConnectionString) // SqlConnectionStringBuilder connStr = new SqlConnectionStringBuilder(connSQL); //(3)打开到数据库的连接 :SqlConnection表示一个到 SQL Server 数据库的打开的连接 using (SqlConnection conn = new SqlConnection(connSQL)) { try { //(4)打开连接 conn.Open(); //(5)实例SqlTransaction类--查询不用开事务 // SqlTransaction _tran = conn.BeginTransaction(); //(6)写一个sql命令,使用参数化命令--MenuID StringBuilder strSQL = new StringBuilder(); strSQL.Append("select * from sys_menu where menuid>=@menuid and ParaID!=@ParaID"); //(7)为事务创建一个命令,创建command命令 SqlCommand cmd = new SqlCommand(strSQL.ToString(), conn); // cmd.Transaction = _tran; //构造Parameter对象 int mesnuid = 185; int paraid = 0; SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@menuid", mesnuid), new SqlParameter("@ParaID", paraid) }; cmd.Parameters.AddRange(paras); //(8)开启事务 // conn.BeginTransaction(); SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read()) { //FieldCount获取数据中的行数 for (int i = 0; i < reader.FieldCount; ++i) { //GetName指定列的名称,GetValue指定=列的值 Console.WriteLine("{0}:{1}", reader.GetName(i), reader.GetValue(i)); } } reader.Close(); Console.Read(); } catch (Exception e) { //_tran.Rollback(); }
(2)修改--包含事务
ExcuteNonQuery---通常使用它来执行Update、Insert和Delete语句。
该方法返回值意义如下:
对于Update、Insert和Delete语句,返回值为该命令所影响的行数。
对于所有其他类型的语句,返回值为-1。
//(1)构造连接字符串:如果integrated security=true表示可以在不知道数据库用户名和密码的情况下时,依然可以连接数据库,如果integrated security=false,或者不写, //表示一定要输入正确的数据库登录名和密码。sspi ,相当于 True,建议用这个代替 True。 string connSQL = @"data source=.;initial catalog=测试;persist security info=True;user id=测试;password=测试;MultipleActiveResultSets=True"; //(2)生成连接字符串.--可以省略如果不能省略,下面要这样写SqlConnection conn = new SqlConnection(connStr.ConnectionString) // SqlConnectionStringBuilder connStr = new SqlConnectionStringBuilder(connSQL); //(2)连接数据库 using(SqlConnection conn=new SqlConnection(connSQL)) { //(3)开启--可以放到后面开始执行ExcuteNonQuery方法的时候开启连接。 conn.Open(); //(4)创建Command命令 string sql = "update sys_menu set iscount=@iscount where menuid=@menuid"; SqlCommand cmd = new SqlCommand(sql,conn); //(5)参数化 int iscount=0; int menuid=184; SqlParameter[] para = new SqlParameter[] { new SqlParameter("@iscount", iscount), new SqlParameter("@menuid",menuid) }; cmd.Parameters.AddRange(para); //(6)开启事务 SqlTransaction _tran = conn.BeginTransaction(); cmd.Transaction = _tran; try { int RecordsAffected = cmd.ExecuteNonQuery(); _tran.Commit(); } catch (Exception e) { _tran.Rollback(); } conn.Close(); conn.Dispose(); }
(3)异步
使用 ADO.NET 2.0 的异步进程 , 数据库连接字符串要添加 Asynchronous Processing=true
如果执行多条命令连接字符串还要添加 MultipleActiveResultSets=true
string connSQL = @"data source=测试服务器;initial catalog=测试库;persist security info=True;user id=用户名;password=密码;MultipleActiveResultSets=True;Asynchronous Processing=true";
using(SqlConnection conn=new SqlConnection(connSQL)) { //(3)开启--可以放到后面开始执行ExcuteNonQuery方法的时候开启连接。 conn.Open(); //(4)创建Command命令 string sql = "update sys_menu set iscount=@iscount where menuid=@menuid"; StringBuilder strSQL = new StringBuilder(); for (int i = 184; i <= 210; ++i) { strSQL.Append("update sys_menu set iscount=0 where menuid="); strSQL.Append(i+";"); } SqlCommand cmd = new SqlCommand(strSQL.ToString(), conn); //(6)开启事务 SqlTransaction _tran = conn.BeginTransaction(); cmd.Transaction = _tran; try { IAsyncResult pending = cmd.BeginExecuteNonQuery(); while (pending.IsCompleted == false) { //异步未完成。可以在这里做其他操作。 for (int x = 0; x <= 10; x++) { Console.WriteLine(x*1); } } Console.WriteLine("异步完成"); // int RecordsAffected = cmd.ExecuteNonQuery(); cmd.EndExecuteNonQuery(pending); _tran.Commit(); } catch (Exception e) { _tran.Rollback(); } conn.Close(); conn.Dispose(); Console.Read(); }