闲来无事,写一个通用的直持多数据库的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. 续上文----线性表之单链表(C实现)

    本文绪上文线性表之顺序表(C实现) 本文将继续使用单链表实现线性表的另外一种存储结构.这种使用链表实现的存储结构在内存中是不连续的. C实现代码如下: #include<stdio.h> ...

  2. poj1966Cable TV Network(无向图最小点割集 ISAP+邻接矩阵)

    题目请戳这里 邻接表的ISAP被卡了一天...TLE....终于被卡了...好忧桑啊啊啊... 题目大意:给一张无向图,求最少去掉几个点使图不连通. 题目分析:求无向图的点连通度,拆点建图跑最大流.具 ...

  3. RTNETLINK answers: Operation not permitted

    如果出现:RTNETLINK answers: Operation not permitted,那是因为没有权限. 解决办法:su,输入root密码.

  4. asp.net调用非托管dll,无法加载 DLL,找不到指定模块解决方法。

    最近开发一个项目,里面用到了非.net开发的一个dll文件接口,发现发布到window2003服务器上后,运行网站总是提示 "无法加载 DLL"D:\11\1.dll": ...

  5. 天气情况(思维,dp思想)

    天气情况 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  6. SharePoint Search之(一):创建Search服务应用程序

    计划写一个关于怎样使用SharePoint Search的系列,包括下面几个方面: (一)创建Search Service Application (二)持续爬网(continues crawl) ( ...

  7. 【MFC学习笔记-作业8-蝴蝶飞~】【什么鬼作业】

    作业要求: 用定时器控制蝴蝶在窗口废物,如图所示... 这是什么鬼作业啊...蝴蝶还要我这个手残手画啊233333333          (ノಠ .ಠ)ノ彡┻━┻ 不过多亏之前几个鬼作业的福 收获颇 ...

  8. Spring学习之Ioc控制反转(2)

    开始之前: 1. 本博文为原创,转载请注明出处 2. 作者非计算机科班出身,如有错误,请多指正 ---------------------------------------------------- ...

  9. C++学习之重载运算符1

    C++除可重载函数之后,还允许定义已有的运算符,这样通过运算符重载可像处理数据使用它们. 先来个代码 #include<iostream> using namespace std; cla ...

  10. self-introduction

    2014.9被同桌kpm带入坑....虽然现在不同班了...(Orz搞分班程序坑了他自己...) 入OI之后就没什么其他兴趣了...偶尔看看番.. 是数据结构控..(算不上吧?)  指针党. 来自广东 ...