操作数据库的那点代码,别在费劲每个数据库都写一遍SQLHelper,SQLiteHelper,OleDbHelper,了,这里都有了.

接口不发了,自己抽取定义就行了.

public abstract class DbHelperBase : IDbHelper
{
/// <summary>
/// 直接获得连接字符串
/// </summary>
/// <param name="connStr"></param>
public DbHelperBase(string connStr)
{
_ConnStr = connStr;
_LockExecNonQuery = new object();
_LockGetDataReader = new object();
_LockGetScalar = new object();
_LockGetDataSet = new object();
}
/// <summary>
/// 连接字符串
/// </summary>
protected string _ConnStr;
/// <summary>
/// 是否事务
/// </summary>
bool _IsTrans = false; object _LockExecNonQuery;
object _LockGetDataReader;
object _LockGetScalar;
object _LockGetDataSet; protected abstract DbConnection DBConnectionObj { get; }
protected abstract DbCommand DbCommandObj { get; }
protected abstract DbDataAdapter DbDataAdapterObj { get; }
protected DbTransaction DbTransObj;
/// <summary>
/// 当前连接
/// </summary>
public DbConnection CurrentConnection
{
get
{
return DBConnectionObj;
}
}
/// <summary>
/// 执行sql问错误写日志方法
/// </summary>
protected virtual void WriteErrLog(Exception ex, string sqlText, params DbParameter[] param)
{
StringPlus logs = new StringPlus();
logs.AppendLine("SQL文本:");
logs.AppendLine(sqlText);
logs.AppendLine("Sql文参数:");
if (param != null)
{
foreach (DbParameter item in param)
{
logs.AppendSpaceLine(1, "参数名:{0},参数值:{1}", item.ParameterName, item.Value);
}
}
logs.AppendLine("原始错误:");
logs.AppendLine(ex.Message);
LogHelper.WriteLog("DbErrorLog", logs.ToString());
}
/// <summary>
/// 打开连接,如果已经打开则什么都不执行了
/// </summary>
protected virtual void OpenConnection()
{
if (DBConnectionObj.State != ConnectionState.Open)
{
DBConnectionObj.ConnectionString = _ConnStr;
DBConnectionObj.Open();
}
}
/// <summary>
/// 关闭连接,如果没有开始事务或连接打开时才关闭
/// </summary>
void CloseConnect()
{
if (!_IsTrans)
{
if (DBConnectionObj.State == ConnectionState.Open)
{
DBConnectionObj.Close();
DBConnectionObj.Dispose();
}
}
}
/// <summary>
/// 给当前DbCommand对象赋值,并且OpenConnection();
/// </summary>
void SetCommandAndOpenConnect(string sqlText, CommandType cmdType, params DbParameter[] param)
{
//按说赋值Connection,CommandType,是不用多次赋值的
DbCommandObj.CommandType = cmdType;
DbCommandObj.Connection = DBConnectionObj;
DbCommandObj.Parameters.Clear();
if (param != null)
{
DbCommandObj.Parameters.AddRange(param);
}
DbCommandObj.CommandText = sqlText;
OpenConnection();
}
/// <summary>
/// 开始执行事务
/// </summary>
public virtual void TransStart()
{
OpenConnection();
DbTransObj = DBConnectionObj.BeginTransaction();
DbCommandObj.Transaction = DbTransObj;
_IsTrans = true;
}
/// <summary>
/// 事务提交
/// </summary>
public virtual void TransCommit()
{
_IsTrans = false;
DbTransObj.Commit();
CloseConnect();
}
/// <summary>
/// 事务回滚
/// </summary>
public virtual void TransRollback()
{
_IsTrans = false;
DbTransObj.Rollback();
CloseConnect();
}
/// <summary>
/// 执行一条指定命令类型(SQL语句或存储过程等)的SQL语句,返回所影响行数
/// </summary>
public virtual int ExecNonQuery(string sqlText, CommandType cmdType, params DbParameter[] param)
{
lock (_LockExecNonQuery)
{
try
{
SetCommandAndOpenConnect(sqlText, cmdType, param);
return DbCommandObj.ExecuteNonQuery();
}
catch (Exception ex)
{
WriteErrLog(ex, sqlText, param);
throw new DbDataException();
}
finally
{
CloseConnect();
}
}
}
/// <summary>
/// 执行一条普通SQL语句的命令,返回所影响行数
/// </summary>
public virtual int ExecNonQuery(string sqlText, params DbParameter[] param)
{
return ExecNonQuery(sqlText, CommandType.Text, param);
}
/// <summary>
/// 获得DataReader对象
/// </summary>
public virtual DbDataReader GetDataReader(string sqlText, CommandType cmdType, CommandBehavior cmdBehavior, params DbParameter[] param)
{
lock (_LockGetDataReader)
{
try
{
SetCommandAndOpenConnect(sqlText, cmdType, param);
DbDataReader dbReader = DbCommandObj.ExecuteReader(cmdBehavior);
return dbReader;
}
catch (Exception ex)
{
WriteErrLog(ex, sqlText, param);
throw new DbDataException();
}
finally
{
//DataReader用dbReader对象来关闭,即使非事务也是,不要把注释取消
//CloseConnect();
}
}
}
/// <summary>
/// 获得DataReader对象
/// </summary>
public virtual DbDataReader GetDataReader(string sqlText, CommandType cmdType, params DbParameter[] param)
{
CommandBehavior cmdBehavior;
if (_IsTrans)
{
cmdBehavior = CommandBehavior.Default;
}
else
{
//非事务时,关闭DataReader则关闭当前连接
cmdBehavior = CommandBehavior.CloseConnection;
}
return GetDataReader(sqlText, cmdType, cmdBehavior, param);
}
/// <summary>
/// 执行sql语句返回DataReader对象
/// </summary>
public virtual DbDataReader GetDataReader(string sqlText, params DbParameter[] param)
{
return GetDataReader(sqlText, CommandType.Text, param);
}
/// <summary>
/// 获得首行首列
/// </summary>
public virtual object GetScalar(string sqlText, CommandType cmdType, params DbParameter[] param)
{
lock (_LockGetScalar)
{
try
{
SetCommandAndOpenConnect(sqlText, cmdType, param);
return DbCommandObj.ExecuteScalar(); }
catch (Exception ex)
{
WriteErrLog(ex, sqlText, param);
throw new DbDataException();
}
finally
{
CloseConnect();
}
}
}
/// <summary>
/// 执行SQL语句,返回首行首列
/// </summary>
public virtual object GetScalar(string sqlText, params DbParameter[] param)
{
return GetScalar(sqlText, CommandType.Text, param);
}
/// <summary>
/// 执行一条SQL语句返回DataSet对象
/// </summary>
public virtual DataSet GetDataSet(string sqlText, CommandType cmdType, params DbParameter[] param)
{
lock (_LockGetDataSet)
{
try
{
SetCommandAndOpenConnect(sqlText, cmdType, param);
DbDataAdapterObj.SelectCommand = DbCommandObj;
DataSet ds = new DataSet();
DbDataAdapterObj.Fill(ds);
return ds;
}
catch (Exception ex)
{
WriteErrLog(ex, sqlText, param);
throw new DbDataException();
}
finally
{
CloseConnect();
}
}
}
/// <summary>
/// 执行一条SQL语句返回DataSet对象
/// </summary>
public virtual DataSet GetDataSet(string sqlText, params DbParameter[] param)
{
return GetDataSet(sqlText, CommandType.Text, param);
}
/// <summary>
/// 执行一条SQL语句返回DataTable对象(调用GetDataSet)
/// </summary>
public virtual DataTable GetDataTable(string sqlText, params DbParameter[] param)
{
return GetDataTable(sqlText, CommandType.Text, param);
}
/// <summary>
/// 执行一条SQL语句返回DataTable对象(调用GetDataSet)
/// </summary>
public virtual DataTable GetDataTable(string sqlText, CommandType cmdType, params DbParameter[] param)
{
return (GetDataSet(sqlText, cmdType, param)).Tables[0];
}
}

  

下面是一个sqlserver的实现

 public class SQLHelper : DbHelperBase
{
public SQLHelper(string connStr)
: base(connStr)
{ } SqlConnection _DBConnectionObj;
SqlCommand _DbCommandObj;
SqlDataAdapter _DbDataAdapterObj; protected override DbConnection DBConnectionObj
{
get
{
//SqlBulkCopy aa = new SqlBulkCopy(new SqlConnection());
if (_DBConnectionObj == null)
{
_DBConnectionObj = new SqlConnection(_ConnStr);
}
return _DBConnectionObj;
}
} protected override DbCommand DbCommandObj
{
get
{
if (_DbCommandObj == null)
{
_DbCommandObj = new SqlCommand();
}
return _DbCommandObj;
}
} protected override DbDataAdapter DbDataAdapterObj
{
get
{
if (_DbDataAdapterObj == null)
{
_DbDataAdapterObj = new SqlDataAdapter();
}
return _DbDataAdapterObj;
}
} }

  

使用示例:

            IDbHelper sql = new SQLHelper("连接字符串");
try
{
sql.TransStart(); //事务开始
sql.ExecNonQuery("执行sql语句1"); //执行(增删改查)一条sql语句
sql.ExecNonQuery("执行sql语句2"); //执行(增删改查)一条sql语句
DataTable dt = sql.GetDataTable("查询sql语句1"); //获取一些数据
sql.TransCommit(); //提交事务
}
catch (Exception ex)
{
sql.TransRollback(); //事务回滚
throw;
}

  

C# 操作数据库就的那点代码的更多相关文章

  1. Spring入门(十五):使用Spring JDBC操作数据库

    在本系列的之前博客中,我们从没有讲解过操作数据库的方法,但是在实际的工作中,几乎所有的系统都离不开数据的持久化,所以掌握操作数据库的使用方法就非常重要. 在Spring中,操作数据库有很多种方法,我们 ...

  2. Global.asax中的操作数据库代码无法执行

    本人最近在做一个基于Access数据库的Web应用程序,为了实现一个定时更新数据库的需求,我在Global.asax中的Application_Start函数里写了个计时器, void Applica ...

  3. jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行?

    jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行? 因为在解析时最新解析的就是JA ...

  4. greenDao:操作数据库的开源框架

    greenDAO: Android ORM for your SQLite database 1. greenDao库获取 英文标题借鉴的是greendrobot官网介绍greenDao时给出的Tit ...

  5. 总结一些关于操作数据库是sql语句还是存储过程问题

    总结一些关于操作数据库是sql语句还是存储过程问题 程序中,你跟数据的交互,需要向数据库拿数据.更改数据库的数据等,这些操作,本身不是程序完成的,而是程序发命令给数据库去做的,不管是通过sql语句方式 ...

  6. greendao操作数据库的使用方法

    第一步:把greendao-1.3.0-beta-1,greendao-generator-1.3.1两个jar包加载到工程的lib的文件夹中,一定要右键点击Add As Library后才能使用. ...

  7. Asp.Net MVC 自定义的MVC框架(非EF操作数据库)

    一些废话:在北京辞职回家不知不觉中已经半年多了,这半年中有过很多的彷徨,困惑,还有些小小难受.半年时间算是我人生以来遇到过的最困苦的时候.理想的工作跟我擦肩而过,驾照也没有考过,年后这一改革...,毕 ...

  8. jdbc操作数据库

    JDBC全称为:Java DataBase Connectivity(java数据库连接). SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC. 学习JD ...

  9. 在MVC3中使用code first生成数据局库并操作数据库

    1.建立Users和UserInfos两个实体类 对应的是数据库中的表 public class User { //类名+Id(User+Id)组成的字符串在数据库表中会设置该字段是主键且是按1的增量 ...

随机推荐

  1. MVC和WebApi 使用get和post 传递参数。

    我们总结一下用js请求服务器的传参方法. Get方式 Get主要是用来查询,一般分为无参,一个参数,多个参数,实体对象参数. 1.无参 //Get没有参数 var get_f1 = function( ...

  2. [Everyday Mathematics]20150225

    设 $f:\bbR\to\bbR$ 二次可微, 适合 $f(0)=0$. 试证: $$\bex \exists\ \xi\in\sex{-\frac{\pi}{2},\frac{\pi}{2}},\s ...

  3. MySQL修改root密码的几种方法

    方法1: 用SET PASSWORD命令 首先登录MySQL. 格式:mysql> set password for 用户名@localhost = password('新密码'); 例子:my ...

  4. When not to automate 什么时候不进行自动化

    The cornerstone of test automation is the premise that the expected application behavior is known. W ...

  5. Cocos2d-android (02) 添加一个精灵对象

    什么是精灵: 1.精灵就是游戏当中的一个元素,通常用于代表画面当前中的一个事物,例如主人公,NPC和背景元素等: 2.一个精灵对象通常都与一张图片关联 3.精灵对象可以通过动作对象(CCAction) ...

  6. Oracle 取两个表中数据的交集并集差异集合

    Oracle 取两个表中数据的交集 关键字: Oracle 取两个表中数据的交集 INTERSECT Oracle 作为一个大型的关系数据库,日常应用中往往需要提取两个表的交集数据 例如现有如下表,要 ...

  7. DOM笔记(五):JavaScript的常见事件和Ajax小结

    一.常见事件类型 1.鼠标事件 事件名称 说明 onclick 鼠标单击时触发 ondbclick 鼠标双击时触发 onmousedown 鼠标左键按下时触发 onmouseup 鼠标释放时触发 on ...

  8. SpringMVC + Spring + MyBatis 学习笔记:提交数据遭遇基础类型和日期类型报400错误解决方法

    系统:WIN8.1 数据库:Oracle 11GR2 开发工具:MyEclipse 8.6 框架:Spring3.2.9.SpringMVC3.2.9.MyBatis3.2.8 使用SpringMVC ...

  9. 实体框架 (EF) 入门 => 五、连接和模型

    public class BloggingContext : DbContext  {  public BloggingContext()          : base("name=Blo ...

  10. [翻译]Behavior-Driven Development (BDD)行为驱动开发(二)

    测试驱动开发体现了开发人员对软件产品各部分运作方式的理解,而行为驱动开发则关注于开发人员对软件产品最终表现的行为的预期. 行为驱动开发 TDD更像是一种范式而不是一个过程.它描述了一种先编写测试,然后 ...