打造 通用的 支持多数据库 操作的 DBHelper
闲来无事,写一个通用的直持多数据库的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的更多相关文章
- MongoDB:利用官方驱动改装为EF代码风格的MongoDB.Repository框架 六:支持多数据库操作
本次主要内容:修正MongoDB.Repository框架对多数据库的支持. 在之前的五篇文章中对MongoDB.Repository框架做了简单的介绍是实现思路.之前是考虑MongoDB.Repos ...
- C#---数据库访问通用类、Access数据库操作类、mysql类 .[转]
原文链接 //C# 数据库访问通用类 (ADO.NET)using System;using System.Collections.Generic;using System.Text;using Sy ...
- C#---数据库访问通用类、Access数据库操作类、mysql类 .
//C# 数据库访问通用类 (ADO.NET)using System;using System.Collections.Generic;using System.Text;using System. ...
- 数据库操作封装类 DBHelper.cs
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Co ...
- Android打造属于自己的数据库操作类。
1.概述 开发Android的同学都知道sdk已经为我们提供了一个SQLiteOpenHelper类来创建和管理SQLite数据库,通过写一个子类去继承它,就可以方便的创建.管理数据库.但是当我们需要 ...
- [SQL Server]用 C# 在 LinqPad 建立 Linked Server 跨服务器数据库操作
在涉及老项目数据迁移的时候,数据库结构已经完全发生变化,而且需要对老数据进行特殊字段的处理,而且数据量较大,使用Navicat导出单表之后,一个表数据大概在100多万的样子,直接导出SQL执行根本行不 ...
- spring3: 对JDBC的支持 之 关系数据库操作对象化
7.3.1 概述 所谓关系数据库对象化其实就是用面向对象方式表示关系数据库操作,从而可以复用. Spring JDBC框架将数据库操作封装为一个RdbmsOperation,该对象是线程安全的.可复 ...
- 使用ado.net打造通用的数据库操作类
最近在项目中使用中碰到了这样一种情况,查询的数据是从Oracle中获取的,但是记录下来的数据是存在Sql Server中(企业Oracle数据库管理太严,没办法操作).而且我在之前的工作中也碰到过使用 ...
- 通用数据库操作类,前端easyui-datagrid,form
实现功能: 左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[ ...
随机推荐
- js中使用队列发送ajax请求
最近,项目中需要按照先后顺序发送ajax请求,并且在一次请求结束后才能发起下一次,不然就会导致逻辑错误. 解决办法是定义一个数组,保存ajax请求数据. 以下使用extjs4定义一个类 Ext.def ...
- OC基础11:基本的C语言特性2
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 19.定义一个int类型的指针: int ...
- 不借助第三方jar包实现文件上传
假设实现文件上传难道非要借助第三方jar包(最经常使用的莫过于apache的commons-fileupload工具包)来实现吗?答案是否定的.以下通过样例演示在不借助第三方jar包的前提下怎样实现文 ...
- .NET系统架构改造的经验和教训
转自: http://robbinfan.com/blog/43/rid-off-dotnet-experience 在互联网行业,基于Unix/Linux的网站系统架构毫无疑问是当今主流的架构解决方 ...
- Asp.Net MVC4下设置W3P3(IIS)调试步骤
环境] VS 2012 IIS7.5 [问题] MVC项目在创建时和APS.NET不同,不能够选择服务器类型,不能够直接把项目创建到IIS上. 如果在项目中直接更改属性,更换调试服务器类型,会报错 ...
- 解决UITableView数据没有充满屏幕时,显示多余的空白cell的问题
#pragma mark 去除多余的线 -(void) clearExtrLine{ UIView *view = [[UIView alloc] init]; view.backgroundColo ...
- juce中的BailOutChecker
界面库中值得注意的一点就是对象响应事件的时候自身被删除了,那么后续的访问自然就会出问题,所以需要在响应事件之后先添加引用,相关处理之后再查看自身是否已经被删除,如果已经被删除那么就直接退出.juce中 ...
- 如何对MySQL 对于大表(千万级)进行优化
如何对Mysql中的大型表进行优化 @(mysql 笔记) 收集信息 1.数据的容量:1-3年内会大概多少条数据,每条数据大概多少字节: 2.数据项:是否有大字段,那些字段的值是否经常被更新: 3.数 ...
- 在Windows的Wamp环境下安装Composer
注意: PHP缺少openssl扩展. 你可能会去屏幕右下角的Wamp的控制台,去加载php的openssl扩展,或者在php.ini中去掉 extension=php_openssl.dll 这一行 ...
- 自给自足:动手打造html5俄罗斯方块
时间:凌晨2:36 历时:两晚+半个下午 代码:约300行 这两天发烧,头痛脑壳昏的,没想到竟然还能有动力去做小游戏,其实这不是我第一次想要弄个俄罗斯方块,前几个星期的时候就尝试着去弄一个,然后被凌乱 ...