使用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线程中进行耗时操作时我们需要将这种操作放在后台,下面以查询操作为例做一下异步版本的演示:
/// <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))
{
try
{
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);
}
else
{
Console.WriteLine("未查询到数据");
}
});
执行结果如下:

有关Task的用法可以参照前文:基于任务的异步编程(Task,async,await)。
个人公众号,热爱分享,知识无价。

使用C#进行数据库增删改查ADO.NET(二)的更多相关文章
- 使用C#进行数据库增删改查ADO.NET(一)
这节讲一下如何使用C#进行数据库的增删改查操作,本节以SQL Server数据库为例. .NET 平台,使用ADO.NET 作为与数据库服务器的桥梁,我们通过ADO.NET就可以使用C#语言操作数据库 ...
- 使用C#进行数据库增删改查ADO.NET(三)
文章代码如下: class Program { static void Main (string[] args) { //连接数据库 string connString = "server= ...
- NX二次开发-NX访问SqlServer数据库(增删改查)C#版
版本:NX9+VS2012+SqlServer2008r2 以前我写过一个NX访问MySQL数据库(增删改查)的文章https://www.cnblogs.com/nxopen2018/p/12297 ...
- Yii2.0高级框架数据库增删改查的一些操作(转)
yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2.0高级框架数据库增删改查的一些操作 --------------------------- ...
- 2. MongoDB基本操作 —— 用Mongo.exe操作数据库增删改查
一.开篇 传统的关系数据库一般由数据库(database).表(table).记录(record)三个层次概念组成,MongoDB是由数据库(database).集合(collection).文档对象 ...
- go——beego的数据库增删改查
一直都不理解使用go语言的时候,为什么还要自己去装beego,以为使用go便可以解决所有的问题,结果在朋友的点拨下,才意识到: go与beego的关系就好比是nodejs与thinkjs的关系,因此也 ...
- (转)SQLite数据库增删改查操作
原文:http://www.cnblogs.com/linjiqin/archive/2011/05/26/2059182.html SQLite数据库增删改查操作 一.使用嵌入式关系型SQLite数 ...
- Yii2.0高级框架数据库增删改查的一些操作
yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2.0高级框架数据库增删改查的一些操作 --------------------------- ...
- WindowsPhone8 数据库增删改查
今天第一次在博客园发表文章,如果有的地方写的不对,还请大家指出! 1.这就是一个简单wp8数据库增删改查 1.创建数据表Person [Table] public class Person : INo ...
随机推荐
- java二叉树遍历——深度优先(DFS)与广度优先(BFS) 递归版与非递归版
介绍 深度优先遍历:从根节点出发,沿着左子树方向进行纵向遍历,直到找到叶子节点为止.然后回溯到前一个节点,进行右子树节点的遍历,直到遍历完所有可达节点为止. 广度优先遍历:从根节点出发,在横向遍历二叉 ...
- HDU_3746 Cyclic Nacklace 【KMP的应用】
一.题目 HDU3746 二.分析 KMP比较好解决的一个问题:如果求一个串中的循环节? 仔细回想KMP的用法,重点是next数组,相当于就是后缀和前缀的比较,那么不正是方便了我们确定循环节? 如果以 ...
- BIMFACE二次开发SDK 开源C#版
[ BIMFace.SDK.CSharp ] 是基于微软.NET 技术封装的用于 BIMFACE 二次开发的通用类库.其中封装了BIMFace服务端API,包含基础API.文件上传API.文件转换AP ...
- Python读写配置文件模块--Configobj
一.介绍 我们在项目的开发过程中应该会遇到这样的问题:我们的项目读取某个配置文件,然后才能按照配置的信息正常运行服务,当我们需要对修改服务的某些信息时,可以直接修改这个配置文件,重启服务即可,不用再去 ...
- 攻防世界 maze NJUPT CTF 2017
迷宫题 1 __int64 __fastcall main(__int64 a1, char **a2, char **a3) 2 { 3 signed __int64 mid_i; // rbx 4 ...
- 阿里云 RTC QoS 弱网对抗之变分辨率编码
本文为 QoS 弱网优化系列的第二篇 作者|安基程.田伟峰 审校| 泰一 视频编码中的变分辨率问题及解决 变分辨率在弱网场景的实际应用中非常常见,网络状况不好的时候降低分辨率可以降低码率,减少块效应, ...
- K8S单集群桌面安装笔记【k8s-for-docker-desktop】
一.K8S集群基本的拓扑结构 二.下载 k8s-for-docker-desktop k8s桌面单集群安装,基本上选择 k8s-for-docker-desktop或者minikube两类,本文采用前 ...
- " "( 双引号) 与 ' '( 单引号) 差在哪?-- Shell十三问<第四问>
" "( 双引号) 与 ' '( 单引号) 差在哪?-- Shell十三问<第四问> 经过前面两章的学习,应该很清楚当你在 shell prompt 后面敲打键盘.直到 ...
- 以聊天的形式解决traefik2.1.X的一个问题
海口-老男人 17:24:48 大哥,这个是啥报错呀 海口-老男人 17:27:04 E0413 09:23:13.134144 1 reflector.go:153] pkg/mod/k8s.io/ ...
- Linux命令的应用
目录 Linux命令 Linux文件管理命令 用户管理 权限管理 vi文本编辑器 find查找命令 磁盘管理命令 压缩及解压 Linux 进程 Linux运行tomcat Linux安装mysql 卸 ...