使用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 ...
随机推荐
- Android 开发学习进程0.30 builder模式创建popwindow
builder模式创建自定义popwindow builder设计模式 将一个复杂的对象构建与它的表示分离,简化代码的使用方式.当对象有多个参数或多个零件同时初始化方法同时初始化方法有默认值时,采用此 ...
- 真会C#微信小程序的习题数据JSON文件下载链接
完全没有精力去维护了,所以小程序停掉,集中精力做一件事. 链接: https://pan.baidu.com/s/1xL45KxDzR5oEQM6nwBA5rw 提取码: qv6n
- git操作初启篇(一)
关于git是什么我想我也不用多说什么,其实关于git的操作在他们的官网上有详细的说明,一项新的技术官网上的一定是最权威的,所以学习一门技术我个人更倾向于看官网,下面的是git的官网https://gi ...
- 全网最详细的Linux命令系列-mkdir命令
Linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 命令格式: mkdir [选项] 目录... 命令功能: ...
- java面试-公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解
一.公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解 公平锁:多个线程按照申请的顺序来获取锁. 非公平锁:多个线程获取锁的先后顺序与申请锁的顺序无关.[ReentrantLock 默认非公平.s ...
- 给出N个字符串恰好由三位字母(大小写)组成,再给出M个查询字符串,问每个查询字符串在N个字符中出现的次数。
1 #include<cstdio> 2 const int maxn = 100; 3 char S[maxn][5], temp[5]; 4 int hashTable[52 * 52 ...
- 聊聊 OAuth 2.0 的 token expire_in 使用
问题背景 有同学私信问了这样的问题,访问 pig4cloud 的演示环境 查看登录请求 network 返回报文如下: { "access_token":"16d3579 ...
- Linux保护机制和绕过方式
Linux保护机制和绕过方式 CANNARY(栈保护) 栈溢出保护是一种缓冲区溢出攻击缓解手段,当函数存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来让shellcode能够得到执行.用C ...
- 解决JDK9以上的非法反射访问警告
1 问题描述 JDK9以上很多库都有这种非法反射访问的警告,比如protostuff: 解决方法两个: JDK降级 添加JVM参数 2 原因 降到JDK8能解决以上问题. 但是这不是本文的重点. 先说 ...
- Pycharm Fiddler Requests https in _create raise ValueError("check_hostname requires server_hostname
打开Fiddler, 开启抓取https, 在PyCharm中使用requests 发送https请求, 遇到 in _create raise ValueError("check_ho ...