使用C#进行数据库增删改查(二)
这节接着讲用C#进行数据库CRUD,高级部分。
事务:
事务是执行一批sql语句,如果中途失败,全部回滚,数据不会受影响,中途没有出错则会提交事务,真正对数据进行修改。C#提供了SqlTransaction类来处理数据库事务,下面通过一个示例方法来看一下这个类如何使用:
using(SqlConnection connection=new SqlConnection(connString)
//开启连接
connection.Open();
using (SqlCommand command = connection.CreateCommand ())
using (SqlTransaction transaction = connection.BeginTransaction ())
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线程中进行耗时操作时我们需要将这种操作放在后台,下面以查询操作为例做一下异步版本的演示:
/// <summary>
/// 执行查询操作(异步泛型版)
/// </summary>
/// <param name="sql">sql语句</param>
/// <param name="parameters">参数</param>
/// <returns>数据集合,出错返回null</returns>
public static async Task<List<T>> SelectDBAsync<T> (string sql, SqlParameter[] parameters) where T : new()
if (connection == null)
Console.WriteLine ("数据库未连接");
return null;
using (SqlCommand command = new SqlCommand (sql, connection))
if (parameters != null)
command.Parameters.AddRange (parameters);
//调用异步方法
SqlDataReader reader = await command.ExecuteReaderAsync ();
if (reader.HasRows)
List<T> data = new List<T> ();
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<List<StudentModel>> studentInfo = ADOUtils.SelectDBAsync<StudentModel> ("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);
Console.WriteLine("未查询到数据");