通用数据库帮助类DBHelper(含log日志信息实时记录)
项目需要,需要一个通用的数据库操作类,增删改查、事务、存储过程、日志记录都要有,于是在已有的帮助类上做了一些改进,并将log4j的.NET版--log4net嵌入其中记录sql的执行环境和状态。
用起来还是比较顺手的,因此分享一下供参考。其中log4net需要通过VS的NuGet程序包管理器引入然后引用。
日志记录功能只是个辅助,先说一下数据库帮助类的主体思路:
成员变量:
- 数据库连接字符串
- 数据库连接(根据字符串实例化得到的SqlConnection对象)
- 事务
- 参数键值对
- 用于记录日志的实例
构造方法:(供外部初始化调用)
- 无参(默认的连接字符串)
- 有参(指定连接字符串)
辅助功能方法:(主要供内部调用)
- 打开、关闭、释放数据库连接(使用比较频繁)
- 参数初始化、清空(多个地方用到)
- Command生成与设置(每次sql执行必不可少的操作)
- GetDataAdapter等中间结果函数(若是返回DataSet,DataTable结果集都会用到)
供外部调用方法:
- 添加参数
- 返回执行成败的结果
- 返回数据集(DataSet,DataTable,DataReader)
- 执行存储过程、事务
1. LogHelper:
using log4net;
using log4net.Layout;
using System.Collections.Generic; namespace CH_Common
{
public class LogHelper
{
private static ILog log;
private static LogHelper logHelper;
public static ILog GetInstance()
{
logHelper = new LogHelper();
return log;
}
public static ILog GetInstance(string configPath)
{
logHelper = new LogHelper(configPath);
return log;
}
private LogHelper()
{
log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
} private LogHelper(string configPath)
{
log4net.Config.XmlConfigurator.Configure(new System.IO.FileInfo(configPath));
log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
} }
}
2. DBHelper:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net;
using System.Configuration; namespace CH_Common
{
public class DBHelper
{
#region 成员变量
string connectionString;
SqlConnection connection;
SqlTransaction transaction;
Hashtable listParameters;
private ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
#endregion #region 构造方法
/// <summary>
/// 默认构造方法
/// </summary>
public DBHelper()
{
this.connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
connection = new SqlConnection(connectionString);
} /// <summary>
/// 含参的构造方法
/// </summary>
/// <param name="connectionString">连接字符串</param>
public DBHelper(string connectionString)
{
this.connectionString = connectionString;
connection = new SqlConnection(connectionString);
}
#endregion #region 数据库连接的打开、关闭、释放
/// <summary>
/// 打开数据库连接
/// </summary>
public void Open()
{
if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
}
/// <summary>
/// 关闭数据库连接
/// </summary>
public void Close()
{
if (connection.State.ToString() == "Open")
{
connection.Close();
InitMember();
}
}
/// <summary>
/// 参数初始化
/// </summary>
void InitMember()
{
listParameters = null;
//cmd = null;
} /// <summary>
/// 释放连接
/// </summary>
public void Dispose()
{
if (connection != null)
{
connection.Close();
connection.Dispose();
}
GC.Collect();
}
#endregion #region 设置连接字符串
/// <summary>
/// 设置连接字符串
/// </summary>
/// <param name="strConnectionString">连接字符串</param>
public void SetConnection(string strConnectionString)
{
connectionString = strConnectionString;
connection = new SqlConnection(connectionString);
}
#endregion #region Command的生成与设置
/// <summary>
/// 设置Command
/// </summary>
/// <param name="SQL">SQL文</param>
/// <param name="cmdType">CommandType</param>
private SqlCommand SetCmd(string SQL, CommandType cmdType)
{
Open();
SqlCommand cmd = new SqlCommand(SQL, connection);
if (null != transaction)
{
cmd.Transaction = transaction;
}
cmd.CommandType = cmdType;
cmd.CommandText = SQL;
cmd.Parameters.Clear();
string strSQLLog = "";
if (listParameters != null)
{
foreach (DictionaryEntry parameter in listParameters)
{
cmd.Parameters.Add(new SqlParameter(parameter.Key.ToString(), parameter.Value));
strSQLLog = strSQLLog + "[" + parameter.Key.ToString() + "]=[" + parameter.Value.ToString() + "]";
}
log.Info(strSQLLog);
ClearParameter();
}
return cmd;
}
/// <summary>
/// 生成Commond
/// </summary>
/// <param name="SQL"></param>
/// <returns></returns>
private SqlCommand CreateCmd(string SQL)
{
return SetCmd(SQL, CommandType.Text);
} private SqlCommand CreateProc(string procName)
{
return SetCmd(procName, CommandType.StoredProcedure);
} #endregion #region SqlDataReader返回
/// <summary>
/// SqlDataReader返回
/// </summary>
/// <param name="SQL">SQL文</param>
/// <returns>SqlDataReader</returns>
private SqlDataReader ReturnDataReader(string SQL)
{
return CreateCmd(SQL).ExecuteReader();
}
#endregion #region SqlParameter参数追加
/// <summary>
/// SqlParameter参数追加
/// </summary>
/// <param name="ParamName">参数名</param>
/// <param name="Value">参数值</param>
public void AddParameter(string ParamName, object Value)
{
try
{
if (listParameters == null)
{
listParameters = new Hashtable();
}
listParameters.Add(ParamName, Value);
}
catch (Exception ex)
{
log.Error("Add SqlParameter Error: " + ex.Message);
log.Error(ex);
throw ex;
}
}
#endregion #region SqlParameter清空
/// <summary>
/// SqlParameter清空
/// </summary>
public void ClearParameter() { listParameters = null; }
#endregion #region SqlDataAdapter适配器返回
/// <summary>
/// SqlDataAdapter适配器返回
/// </summary>
/// <param name="SQL">SQL语句</param>
/// <returns>SqlDataAdapter对象</returns>
private SqlDataAdapter GetDataAdapter(string SQL)
{
SqlDataAdapter Da = new SqlDataAdapter(); Da.SelectCommand = SetCmd(SQL, CommandType.Text);
SqlCommandBuilder custCB = new SqlCommandBuilder(Da);
return Da;
}
#endregion #region SQL执行 /// <summary>
/// SQL执行
/// </summary>
/// <param name="SQL">SQL语句</param>
/// <returns>-1:失败 其他:成功</returns>
public int ExeCmd(string SQL)
{
int ret = -; string strSQLLog = string.Empty;
string sqlLog = "";
if (listParameters != null)
{
strSQLLog = SQL;
foreach (DictionaryEntry parameter in listParameters)
{
strSQLLog = strSQLLog.Replace("@" + parameter.Key.ToString(), "'" + parameter.Value.ToString() + "'");
sqlLog = sqlLog + "[" + parameter.Key.ToString() + "]=[" + parameter.Value.ToString() + "]";
}
} try
{
log.Info("SQL Execute Start:" + SQL + " " + sqlLog);
ret = CreateCmd(SQL).ExecuteNonQuery();
log.Info("SQL Execute End");
}
catch (Exception ex)
{
log.Error("SQL Execute Error Occured:" + SQL + " " + sqlLog);
log.Error("SQL Execute ErrorMessage:" + ex.Message);
log.Error(ex);
RollbackTransaction();
throw ex;
}
finally
{
if (null == transaction)
{
Close();
} ClearParameter();
}
return ret;
}
#endregion #region DataSet返回 /// <summary>
/// SQL执行
/// </summary>
/// <param name="SQL">SQL文</param>
/// <returns>DataSet</returns>
public DataSet ReturnDataSet(string SQL)
{
DataSet Ds = new DataSet();
try
{
log.Info("SQL Execute Start:" + SQL);
SqlDataAdapter Da = GetDataAdapter(SQL);
Da.Fill(Ds);
log.Info("SQL Execute End");
}
catch (Exception ex)
{
log.Error("SQL Execute Error Occured:" + SQL);
log.Error("SQL Execute ErrorMessage:" + ex.Message);
log.Error(ex);
throw ex;
}
finally
{
if (null == transaction)
{
Close();
}
}
return Ds;
}
#endregion #region DataTable返回
/// <summary>
/// DataTable返回
/// </summary>
/// <param name="SQL">SQL文</param>
/// <returns>DataTable</returns>
public DataTable ReturnDataTable(string SQL)
{
DataTable dt = new DataTable("tempDt");//跨进程序列化,需要为datatable命名
try
{
log.Info("SQL Execute Start:" + SQL);
SqlDataAdapter Da = GetDataAdapter(SQL);
Da.Fill(dt);
log.Info("SQL Execute End");
}
catch (Exception ex)
{
log.Error("SQL Execute Error Occured:" + SQL);
log.Error("SQL Execute ErrorMessage:" + ex.Message);
log.Error(ex);
throw ex;
}
finally
{
if (null == transaction)
{
Close();
}
}
return dt;
}
#endregion #region 事务
/// <summary>
/// 开始事务
/// </summary>
public void BeginTransaction()
{
Open();
//cmd = connection.CreateCommand();
transaction = connection.BeginTransaction(); //cmd.Transaction = transaction;
}
/// <summary>
/// 提交事务
/// </summary>
public void CommitTransaction()
{
try
{
if (null != transaction)
{
transaction.Commit();
}
}
catch (System.Exception ex)
{
log.Error("transaction error:" + ex.Message);
log.Error(ex);
transaction.Rollback();
throw ex;
}
finally
{
transaction = null;
Close();
}
}
/// <summary>
/// 回滚事务
/// </summary>
public void RollbackTransaction()
{
if (null != transaction)
{
transaction.Rollback();
transaction = null;
}
}
#endregion #region 存储过程
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="proc_name"></param>
/// <returns></returns>
public int ExecProcedure(string proc_name)
{
int ret = -; string strSQLLog = string.Empty;
string sqlLog = "";
if (listParameters != null)
{ foreach (DictionaryEntry parameter in listParameters)
{
strSQLLog = strSQLLog.Replace("@" + parameter.Key.ToString(), "'" + parameter.Value.ToString() + "'");
sqlLog = sqlLog + "[" + parameter.Key.ToString() + "]=[" + parameter.Value.ToString() + "]";
}
} try
{
log.Info("Procedure Execute Start:" + proc_name + " " + sqlLog);
ret = CreateProc(proc_name).ExecuteNonQuery();
log.Info("Procedure Execute End");
}
catch (Exception ex)
{
log.Error("Procedure Execute Error Occured:" + proc_name + " " + sqlLog);
log.Error("Procedure Execute ErrorMessage:" + ex.Message);
log.Error(ex);
RollbackTransaction();
throw ex;
}
finally
{
if (null == transaction)
{
Close();
} ClearParameter();
}
return ret;
}
#endregion
}
}
3. log4net配置文件:
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<log4net>
<!-- 日志输出定义 -->
<appender name="ReceiveLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="file" type="log4net.Util.PatternString" value="Logs" />
<param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
<param name="StaticLogFileName" value="false" />
<!--混合(大小与日期)-->
<param name="rollingStyle" value="Composite" />
<param name="DatePattern" value="/yyyyMMdd/'info.'yyyyMMdd'.log'" />
<!--单个日志文件大小上限5M-->
<param name="maximumFileSize" value="5MB" />
<!--1.2.3计数类型-->
<param name="CountDirection" value=""/>
<!--最多产生的日志文件数,超过则只保留最新的(n+)个。设定值value="-1"为不限文件数-->
<param name="MaxSizeRollBackups" value="-1" />
<!--追加-->
<param name="AppendToFile" value="true" />
<!-- 日志格式 -->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy/MM/dd_HH:mm:ss.fff} %t %-8p %C %M %m %exception%n" />
</layout>
<!-- 应用此配置的过滤器 -->
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="DEBUG" />
<levelMax value="INFO" />
</filter>
</appender>
<appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
<param name="file" type="log4net.Util.PatternString" value="Logs" />
<param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" />
<param name="StaticLogFileName" value="false" />
<!--混合(大小与日期)-->
<param name="rollingStyle" value="Composite" />
<param name="DatePattern" value="/yyyyMMdd/'error.'yyyyMMdd'.log'" />
<!--单个日志文件大小上限5M-->
<param name="maximumFileSize" value="5MB" />
<!--1.2.3计数类型-->
<param name="CountDirection" value=""/>
<!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数-->
<param name="MaxSizeRollBackups" value="-1" />
<!--追加-->
<param name="AppendToFile" value="true" />
<!-- 日志格式 -->
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy/MM/dd_HH:mm:ss.fff} %t %-8p %C %M %m %exception%n" />
</layout>
<!-- 应用此配置的过滤器---->
<filter type="log4net.Filter.LevelRangeFilter">
<levelMin value="ERROR" />
<levelMax value="FATAL" />
</filter>
</appender>
<root>
<level value="INFO" />
<appender-ref ref="ReceiveLogFileAppender" />
<appender-ref ref="ErrorLogFileAppender" />
</root>
</log4net>
</configuration>
帮助类的用法非常简便:
1.new 一个DBHelper对象dbhelper出来;
2.sql文中需要传入参数时:dbhelper.AddParameter(“@para”,“para”);
3.执行sql返回结果:dbhelper.ReturnDataTable(sql);
一次搞定,以后的项目基本都可以复用,还是值得花些时间来整理理解的,每次都重新编码或是搜集别人的代码怎么说效率都比较低下,没必要!
通用数据库帮助类DBHelper(含log日志信息实时记录)的更多相关文章
- DataAccess通用数据库访问类,简单易用,功能强悍
以下是我编写的DataAccess通用数据库访问类,简单易用,支持:内联式创建多个参数.支持多事务提交.支持参数复用.支持更换数据库类型,希望能帮到大家,若需支持查出来后转换成实体,可以自行扩展dat ...
- 通用数据库操作类,前端easyui-datagrid,form
实现功能: 左端datagrid显示简略信息,右侧显示选中行详细信息,数据库增删改 (1)点击选中行,右侧显示详细信息,其中[新增].[修改].[删除]按钮可用,[保存]按钮禁用 (2)点击[ ...
- 一个通用数据库访问类(C#,SqlClient)
本文转自:http://www.7139.com/jsxy/cxsj/c/200607/114291.html使用ADO.NET时,每次数据库操作都要设置connection属性.建立connecti ...
- 我也来写:数据库访问类DBHelper
一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...
- 我也来写:数据库访问类DBHelper(转)
一.前言 相信许多人都百度过:“.net 数据库访问类”.然后就出来一大堆SqlHelper.我也用过这些SqlHelper,也自己写过,一堆静态方法,开始使用起来感觉很不错,它们也确实在很多时候可以 ...
- C#.NET数据库访问类DBHelper
这是一个与C# .NET通用的数据库访问类,包含了工厂模式.事务处理等安全机制. 调用方式: DBHelper db = new DBHelper(); DbCommand cmd = db.GetS ...
- java程序显示log日志信息的方法
首先需要引入maven依赖 <dependency> <groupId>commons-logging</groupId> <artifactId>co ...
- 数据库助手类 DBHelper
using System; using System.Collections.Generic; using System.Text; using System.Configuration; using ...
- ADO.NET 使用通用数据库操作类Database (SQL Server)
一.Web.config配置 <connectionStrings> <add name="constr_name" connectionString=" ...
随机推荐
- Openstack容器项目之Magnum
本文以Newton版本为例. 1.Magnum简介 Magnum项目通过Openstack API能够在Openstack中创建基于容器的服务,但它本身并不直接对容器进行操作,而是通过Kubernet ...
- 面向UI编程:ui.js 1.1 使用观察者模式完成组件之间数据流转,彻底分离组件之间的耦合,完成组件的高内聚
开头想明确一些概念,因为有些概念不明确会导致很多问题,比如你写这个框架为什么不去解决啥啥啥的问题,哎,心累. 什么是框架? 百度的解释:框架(Framework)是整个或部分系统的可重用设计,表现为一 ...
- [Netty] - Netty入门(最简单的Netty客户端/服务器程序)
Java中的NIO是一种解决阻塞式IO问题的基本技术,但是NIO的编写对java程序员是有比较高的要求的.那么Netty就是一种简化操作的一个成熟的网络IO编程框架.这里简单介绍一个程序,代码是< ...
- H5常见的兼容问题及解决
最近这两天经常遇到一些麻烦的兼容问题,统一整理一下,比较简单也不是特别全面,希望大家多多交流. 几种IE6 bug的解决方法 1)png24位的图片在iE6浏览器上出现背景,解决方案是做成PNG8.也 ...
- js拉起或下载app
产品提了个需求,通过手机网页判断是否安装了自己公司app,如果安装了则拉起app,没有安装则跳转到下载页. 经过各种查阅资料尝试总结了一个还算可以的办法. 拉起app的原理就是js和原生统一好一个地址 ...
- BZOJ 2463: [中山市选2009]谁能赢呢?(博弈论)
好吧我能说这道题我是猜过去的么= =,看到只有一个数x,x=2时alice赢,就猜奇数bob赢,偶数alice赢,然后就稀里糊涂过了= = 后来找了http://www.haogongju.net/a ...
- Java Web(十二) commons-fileupload上传下载
今天心态正常...继续努力.. --WH 一.上传原理和代码分析. 上传:我们把需要上传的资源,发送给服务器,在服务器上保存下来. 下载:下载某一个资源时,将服务器上的该资源发送给浏览器. 难点:服务 ...
- 小红帽5.9 配置静态IP上网问题
本来无一物,何处染尘埃. DHCP连得好好的,手痒试下STATIC,静态IP 首先进入/etc/sysconfig/network-scripts/ifcfg-eth0, 写入各种参数: BOOTPR ...
- android保存照片到相册的一些事
由于最近工作需求的原因,有一个功能就是将webView里面的照片保存到本地,并且能够直接在相册中有一个及时的反馈. 项目中,具体是实现流程是这样的设计webview点击交互事件,当点击webview中 ...
- 点击Robot Framework的桌面快捷图标后,没有反应(没有打开应用程序)
http://www.cnblogs.com/zhengyihan1216/p/6397478.html 这篇文章中介绍了如何安装Robot Framework以及如何在桌面上创建快捷方式. 但是有 ...