闲来无事,写一个通用的直持多数据库的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. eclipse ctrl链接设置

    选择[Window]菜单 Preferences ——>General——>Editors——>Text Editors——>Hyperlinking

  2. mode(思维,注意内存)

    mode Time Limit:1000MS     Memory Limit:1024KB     64bit IO Format:%lld & %llu Submit Status Pra ...

  3. C#基础:委托 【转】

    委托是C#中最为常见的内容.与类.枚举.结构.接口一样,委托也是一种类型.类是对象的抽象,而委托则可以看成是函数的抽象.一个委托代表了具有相同参数列表和返回值的所有函数.比如: delegate in ...

  4. 通过P-SMR看State Machine Replication

    在一个复制系统中,为了保持一致性,各个replicated server是串行运行.这样性能上就会比仅仅有一台server的系统慢,由于仅仅有一台server能够进行并行处理.假设在复制系统中各个se ...

  5. repeater 一个td多个div显示图片

    <table class="table table-bordered table-responsive"> <tbody> <asp:Repeater ...

  6. maven02 命令

  7. js 刷新网页

    1. Javascript 返回上一页history.go(-1), 返回两个页面: history.go(-2); 2. history.back(). 3. window.history.forw ...

  8. (一)使用Fragment实现QQ的底部按钮

    版权声明:本文出自郭霖的博客,转载必须注明出处. 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/13171191 现在Fragmen ...

  9. Sybase Power Designer 16.5破解版下载

    http://pan.baidu.com/s/1ddsjs  下载后正常安装,然后将压缩文件里的dll文件拷到安装目录下覆盖原文件,启动Power Designer后,选择help-->abou ...

  10. 使用CRT定位内存泄漏

    1. 使能内存泄漏检测#define _CRTDBG_MAP_ALLOC#include <stdlib.h>#include <crtdbg.h>注1:语句顺序不能修改:注2 ...