这节接着讲用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语句/// 参数/// 数据集合,出错返回nullpublic 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("未查询到数据");    }});//主线程最后要睡一会,防止数据还没输出程序就结束了Thread.Sleep(5000);

执行结果如下:

有关Task的用法可以参照前文:基于任务的异步编程(Task,async,await)。

关于C#操作数据库的文章到此结束,本文所用的代码可以去我的博客园查看:

https://www.cnblogs.com/charlesmvp/p/13884962.html

END...

android studio进行增删改查代码_使用C#进行数据库增删改查(二)相关推荐

  1. mysql增删改查脚本_脚本方式实现数据库增删改查

    哇塞,一个空格的问题花了一整天的时间终于找出了错~~~ 1.首先实现查询表中的所有数据: 查看数据库表中信息 String dbUrl= "jdbc:mysql://localhost:33 ...

  2. Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  3. Android Studio 单刷《第一行代码》系列 07 —— Broadcast 广播

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  4. Android Studio 单刷《第一行代码》系列 06 —— Fragment 生命周期

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  5. Android Studio 单刷《第一行代码》系列 04 —— Activity 相关

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  6. Android Studio 单刷《第一行代码》系列 03 —— Activity 基础

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  7. Android Studio 单刷《第一行代码》系列 02 —— 日志工具 LogCat

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  8. Android Studio 单刷《第一行代码》系列 01 —— 第一战 HelloWorld

    前言(Prologue) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Android ...

  9. [安卓开发笔记二]android Studio通过jni调用C++代码

    [安卓开发笔记二]android Studio通过jni调用C++代码 16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的 ...

  10. Android Studio 单刷《第一行代码》系列目录

    本文转载自: http://www.cnblogs.com/debuglife/p/4355687.html 作者:DebugLife 转载请注明该声明. 前言(Prologue) 本系列将使用 An ...

最新文章

  1. 16 分频 32 分频是啥意思_Verilog中任意分频的实现
  2. 利用JS获取IE客户端IP及MAC的实现
  3. python 避免多重条件嵌套_如何避免多层嵌套函数
  4. myeclipse2014下卸载,安装maven插件。
  5. mysql5.6时间问题_mysql5.6版本java插入时间的错误
  6. LeetCode Algorithm 414. 第三大的数
  7. VMware虚拟机NAT模式网络配置图文教程
  8. win10常见问题处理办法
  9. 7 centos 查看程序文件数量_解析CentOS 7中系统文件与目录管理
  10. 机器人的动力学和动力学联系_通过机器学习了解幸福动力学(第2部分)
  11. 计算机应用于材料组织结构检测,计算机在材料检测中的应用
  12. OpenStack Nova核心组件和RabbitMQ通信流程分析
  13. 免费申请 Office365 E5 开发者订阅
  14. php调用restful接口_如何使用PHP编写RESTful接口
  15. 高等数学---常见的几个泰勒公式
  16. 线性代数————思维导图(上岸必备)(相似理论)
  17. matplotlib之pyplot模块——向子图添加箭头(arrow())
  18. 内存类型:UDIMM、RDIMM、LRDIMM
  19. Virut.ce-感染型病毒分析报告
  20. java面试答题软件,Java面试题库

热门文章

  1. 他们才是全球高频交易顶级玩家
  2. 容器操作系统再添丁,AWS开源Bottlerocket,类似RancherOS?
  3. 【优化调度】基于matlab多目标粒子群算法求解风电光伏储能电网发电与需求响应调度优化问题【含Matlab源码 239期】
  4. 【元胞自动机】基于matlab激进策略元胞自动机三车道(不开放辅路,软件园影响)交通流模型【含Matlab源码 1297期】
  5. 【语音去噪】基于matlab GUI FIR窗函数音频去噪【含Matlab源码 875期】
  6. 【背包问题】基于matlab多目标粒子群算法求解多背包问题【含Matlab源码 654期】
  7. 【手势识别】基于matlab k-means聚类手势识别【含Matlab源码 386期】
  8. 【数字信号】基于matlab GUI数字电子琴【含Matlab源码 273期】
  9. 高新计算机考试1-8视频,最新版计算机高新考试 PS 第1单元1-8.doc
  10. java9新特性有json吗,磨剑三年,跳票一年,Java9新功能有哪些神通?