闲来无事,写一个通用的直持多数据库的DBHelper,支持单连接批量执行SQL

因为用了TransactionScope所以请引用System.TransactionScope.dll

代码尚未测试,请不要在生产环境中使用,后续会用测试好的代码替换,并会持续支持,欢迎大家一起学习

欢迎加入 QQ群一起学习 254082423

废话不多说直接上代码

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace Utility
{
internal class DbObject
{
/// <summary>
/// 脚本
/// </summary>
internal string CommandText
{
get;set;
} /// <summary>
/// 脚本参数集
/// </summary>
internal IList<IDbDataParameter> DbParameters
{
get;
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Transactions; namespace Utility
{
internal class DBHelper<T> where T : class, IDbConnection, new()
{ /// <summary>
/// 装载参数
/// </summary>
/// <param name="command"></param>
/// <param name="parameters"></param>
private void PrepareDbParameters(IDbCommand command, IDbDataParameter[] parameters)
{
if (Equals(command, null))
throw new Exception("Command对象不能为空"); foreach (var item in parameters)
command.Parameters.Add(item);
} private void PrepareDbParameters(IDbCommand command, IList<IDbDataParameter> parameters)
{
if (Equals(command, null))
throw new Exception("Command对象不能为空"); foreach (var item in parameters)
command.Parameters.Add(item);
} /// <summary>
/// 执行查询
/// </summary>
/// <typeparam name="U"></typeparam>
/// <param name="connectionString">连接字符串</param>
/// <param name="commandText">查询语句</param>
/// <param name="parameters">查询参数</param>
/// <returns>数据集</returns>
internal DataSet ExecuteQuery<U>(string connectionString, CommandType commandType, string commandText,
IDbDataParameter[] parameters)
where U : class, IDbDataAdapter, new()
{
using (IDbConnection conn = new T())
{
conn.ConnectionString = connectionString;
IDbCommand command = conn.CreateCommand();
command.CommandType = commandType;
command.CommandText = commandText;
this.PrepareDbParameters(command, parameters);
using (var ds = new DataSet())
{
IDbDataAdapter adapter = new U();
adapter.SelectCommand = command;
adapter.Fill(ds);
return ds;
}
}
} /// <summary>
/// 执行查询
/// </summary>
/// <param name="connectionString">连接字符串</param>
/// <param name="commandType">脚本类型</param>
/// <param name="commandText">执行的脚本</param>
/// <param name="parameters">执行参数</param>
/// <param name="behavior">查询结果行为</param>
/// <returns></returns>
internal IDataReader ExecuteReader(string connectionString, CommandType commandType, string commandText,
IDbDataParameter[] parameters, CommandBehavior behavior)
{
using (IDbConnection conn = new T())
{
conn.ConnectionString = connectionString;
IDbCommand command = conn.CreateCommand();
command.CommandType = commandType;
command.CommandText = commandText;
this.PrepareDbParameters(command, parameters);
if (conn.State == ConnectionState.Broken)
conn.Close(); if (conn.State != ConnectionState.Open)
conn.Open(); using (var reader = command.ExecuteReader(behavior))
{
return reader;
}
}
} /// <summary>
/// 执行SQL
/// </summary>
/// <param name="connectionString"></param>
/// <param name="commandType"></param>
/// <param name="commandText"></param>
/// <param name="parameters"></param>
internal U ExecuteScalar<U>(string connectionString, CommandType commandType, string commandText,
IDbDataParameter[] parameters)
where U : struct
{
using (IDbConnection conn = new T())
{
conn.ConnectionString = connectionString;
IDbCommand command = conn.CreateCommand();
command.CommandType = commandType;
command.CommandText = commandText;
this.PrepareDbParameters(command, parameters);
if (conn.State == ConnectionState.Broken)
conn.Close(); if (conn.State != ConnectionState.Open)
conn.Open(); var result = (U)command.ExecuteScalar();
conn.Close();
return result;
}
} /// <summary>
/// 批量执行SQL
/// </summary>
/// <param name="connectionString"></param>
/// <param name="commandType"></param>
/// <param name="commandText"></param>
/// <param name="parameters"></param>
/// <param name="behavior"></param>
/// <returns></returns>
internal IList<U> ExecuteScalarBatch<U>(string connectionString, CommandType commandType, IList<DbObject> dbObjects)
where U : struct
{
using (IDbConnection conn = new T())
{
using (TransactionScope trans = new TransactionScope())
{
IList<U> list = new List<U>();
try
{
for (var i = ; i < dbObjects.Count; i++)
{
var curDbObj = dbObjects[i];
conn.ConnectionString = connectionString;
IDbCommand command = conn.CreateCommand();
command.CommandType = commandType;
command.CommandText = curDbObj.CommandText;
this.PrepareDbParameters(command, curDbObj.DbParameters.ToArray());
if (conn.State == ConnectionState.Broken)
conn.Close(); if (conn.State != ConnectionState.Open)
conn.Open(); var result = (U)command.ExecuteScalar();
list.Add(result);
trans.Complete();
}
}
catch (Exception ex)
{
throw ex;
} return list;
}
}
} /// <summary>
/// 执行SQL
/// </summary>
/// <param name="connectionString"></param>
/// <param name="commandType"></param>
/// <param name="commandText"></param>
/// <param name="parameters"></param>
/// <param name="behavior"></param>
/// <returns></returns>
internal int ExecuteNoneQuery(string connectionString, CommandType commandType, string commandText,
IDbDataParameter[] parameters, CommandBehavior behavior)
{
using (IDbConnection conn = new T())
{
conn.ConnectionString = connectionString;
IDbCommand command = conn.CreateCommand();
command.CommandType = commandType;
command.CommandText = commandText;
this.PrepareDbParameters(command, parameters);
if (conn.State == ConnectionState.Broken)
conn.Close(); if (conn.State != ConnectionState.Open)
conn.Open(); int affectCount = command.ExecuteNonQuery();
return affectCount;
}
} /// <summary>
/// 批量执行SQL
/// </summary>
/// <param name="connectionString"></param>
/// <param name="commandType"></param>
/// <param name="commandText"></param>
/// <param name="parameters"></param>
/// <param name="behavior"></param>
/// <returns></returns>
internal IList<int> ExecuteNoneQueryBatch<U>(string connectionString, CommandType commandType, IList<DbObject> dbObjects)
{
using (IDbConnection conn = new T())
{
using (TransactionScope trans = new TransactionScope())
{
IList<int> list = new List<int>();
try
{
for (var i = ; i < dbObjects.Count; i++)
{
var curDbObj = dbObjects[i];
conn.ConnectionString = connectionString;
IDbCommand command = conn.CreateCommand();
command.CommandType = commandType;
command.CommandText = curDbObj.CommandText;
this.PrepareDbParameters(command, curDbObj.DbParameters.ToArray());
if (conn.State == ConnectionState.Broken)
conn.Close(); if (conn.State != ConnectionState.Open)
conn.Open(); var result = command.ExecuteNonQuery();
list.Add(result);
trans.Complete();
}
}
catch (Exception ex)
{
throw ex;
} return list;
}
}
} }
}

后续会放出基于该类的SqlHelper

打造 通用的 支持多数据库 操作的 DBHelper的更多相关文章

  1. MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 六:支持多数据库操作

    本次主要内容:修正MongoDB.Repository框架对多数据库的支持. 在之前的五篇文章中对MongoDB.Repository框架做了简单的介绍是实现思路.之前是考虑MongoDB.Repos ...

  2. C#---数据库访问通用类、Access数据库操作类、mysql类 .[转]

    原文链接 //C# 数据库访问通用类 (ADO.NET)using System;using System.Collections.Generic;using System.Text;using Sy ...

  3. C#---数据库访问通用类、Access数据库操作类、mysql类 .

    //C# 数据库访问通用类 (ADO.NET)using System;using System.Collections.Generic;using System.Text;using System. ...

  4. 数据库操作封装类 DBHelper.cs

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Co ...

  5. Android打造属于自己的数据库操作类。

    1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要 ...

  6. [SQL Server]用 C# 在 LinqPad 建立 Linked Server 跨服务器数据库操作

    在涉及老项目数据迁移的时候,数据库结构已经完全发生变化,而且需要对老数据进行特殊字段的处理,而且数据量较大,使用Navicat导出单表之后,一个表数据大概在100多万的样子,直接导出SQL执行根本行不 ...

  7. spring3: 对JDBC的支持 之 关系数据库操作对象化

    7.3.1  概述 所谓关系数据库对象化其实就是用面向对象方式表示关系数据库操作,从而可以复用. Spring JDBC框架将数据库操作封装为一个RdbmsOperation,该对象是线程安全的.可复 ...

  8. 使用ado.net打造通用的数据库操作类

    最近在项目中使用中碰到了这样一种情况,查询的数据是从Oracle中获取的,但是记录下来的数据是存在Sql Server中(企业Oracle数据库管理太严,没办法操作).而且我在之前的工作中也碰到过使用 ...

  9. 通用数据库操作类,前端easyui-datagrid,form

    实现功能:     左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[ ...

随机推荐

  1. [转]Java汉字按照拼音排序

    最近项目上使用到汉字排序的问题,网上搜索了一下后普遍使用下面的方法比较. @Test public void test_sort_pinyin() { Collator cmp = Collator. ...

  2. OC基础11:基本的C语言特性2

    "OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 19.定义一个int类型的指针: int ...

  3. c#中(int)、int.Parse()、int.TryParse、Convert.ToInt32的区别

    本文来自:http://blog.csdn.net/tangjunping/article/details/5443337 以前经常为这几种数据类型转换方式而迷茫,这次为了彻底搞清它们之间的区别和优缺 ...

  4. 移动端WEB开发 代码片段

    WebApp是指基于Web的系统和应用,其作用是向广大的最终用户发布一组复杂的内容和功能(不明白说的是什么).其实Web APP就是一个针对Iphone.Android等智能手机优化后的web站点,它 ...

  5. Oracle日志文件常用操作

    Oracle关于日志文件基本操作1.查询系统使用的是哪一组日志文件:select * from v$log; 2.查询正在使用的组所对应的日志文件:select * from v$logfile; 3 ...

  6. 创建和使用RMAN存储脚本

    创建和使用RMAN存储脚本:1.连接恢复目录(可以不连接到目标库):C:\Users\Administrator>rman target sys/rusky@rusky catalog=rcat ...

  7. linux下的时间及时区设置

    一.时间设置及同步 1修改系统时间 #date -s 06/18/14 #date -s 14:20:50 2命令查看.设置硬件时间 #hwclock  --show 或者clock  --show ...

  8. <!--转换office时需要此配置 --> <identity impersonate="true" />

    1.需要对Office 进行操作时 ,添加权限  <!--转换office时需要此配置 --> <identity impersonate="true" /> ...

  9. c# 校验文本框的正则

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #region ...

  10. css绝对定位、相对定位和文档流的那些事

    前言 接触html.和css时间也不短了,但每次用div+css布局的时候心里还是有点儿虚,有时候干脆就直接用table算了,很多时候用div会出现些不可预料的问题,虽然花费一定时间能够解决,但总不是 ...