使用C#进行数据库增删改查ADO.NET(二)
这节接着讲用C#进行数据库CRUD,高级部分。
事务:
事务是执行一批sql语句,如果中途失败,全部回滚,数据不会受影响,中途没有出错则会提交事务,真正对数据进行修改。C#提供了SqlTransaction类来处理数据库事务,下面通过一个示例方法来看一下这个类如何使用:
using(SqlConnection connection=new SqlConnection(connString) { //开启连接 connection.Open(); using (SqlCommand command = connection.CreateCommand ()) { using (SqlTransaction transaction = connection.BeginTransaction ()) { try { int count = 0; //将事务对象绑定到执行对象上 command.Transaction = transaction; if (parameters != null) command.Parameters.AddRange (parameters); //执行sql,注意:此时数据并未真正修改 foreach (string sql in sqls) { command.CommandText = sql; count += command.ExecuteNonQuery(); } //执行时不出错就会提交事务,此时数据真正被修改 transaction.Commit(); return count; } catch { //执行时出错或者中途连接断开都会回滚事务 transaction.Rollback(); return 0; } } } }
使用连接对象创建出执行对象和事务对象,执行完毕没有错误的话,执行事务对象的Commit()方法提交,如果出错执行Rollback()方法回滚。
异步方法:
在我们在执行sql的时候有时希望是异步执行的,为此微软推出了Task类和一批基于Task的异步方法,很典型的就是在老方法后加上Async这个后缀,如:ExecuteNonQuery()的异步版本是ExecuteNonQueryAsync()。尤其是在UI线程中进行耗时操作时我们需要将这种操作放在后台,下面以查询操作为例做一下异步版本的演示:
////// 执行查询操作(异步泛型版) /// /// sql语句 /// 参数 /// 数据集合,出错返回null public static async Task > SelectDBAsync
(string sql, SqlParameter[] parameters) where T : new() { if (connection == null) { Console.WriteLine ("数据库未连接"); return null; } ? using (SqlCommand command = new SqlCommand (sql, connection)) { try { if (parameters != null) { command.Parameters.AddRange (parameters); } //调用异步方法 SqlDataReader reader = await command.ExecuteReaderAsync (); if (reader.HasRows) { List data = new List (); Type type = typeof (T); object o = Activator.CreateInstance (type); while (reader.Read ()) { foreach (var property in type.GetProperties ()) { property.SetValue (o, reader[property.Name]); } data.Add ((T)o); } reader.Close (); return data; } ? return null; } catch { return null; } } } ? //在主线程中调用此方法查询数据(数据表跟上一篇文章一样),具体逻辑如下: SqlParameter[] parameters = new[] { new SqlParameter ("@sname", "李四"), }; Task > studentInfo = ADOUtils.SelectDBAsync
("select SID,SName,SGender from StudentInfo where SName=@sname ", parameters); studentInfo.ContinueWith((result) => { if (studentInfo != null) foreach (StudentModel studentModel in result.Result) { Console.WriteLine(studentModel); } else { Console.WriteLine("未查询到数据"); } });
执行结果如下:
有关Task的用法可以参照前文:基于任务的异步编程(Task,async,await)。
个人公众号,热爱分享,知识无价。