操作数据库的那点代码,别在费劲每个数据库都写一遍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. POJ 1844 Sum

    题意:给一个整数n,求当n由1到k的连续整数加或减组成时的最小的k. 解法:一开始觉得dp……后来觉得复杂度太大了……GG……百度了一下是个数学题orz. 如果n全部由加法组成,那么k可以组成k(k+ ...

  2. 继承View绘制正方形且360旋转

    import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; impor ...

  3. Delphi 关闭MDI子窗口

    需要在子窗口的onClose事件中吧Action = caFree; 就可以了. procedure Tfrm_aa.FormClose(Sender: TObject; var Action: TC ...

  4. 用python3破解wingIDE

    值得注意的是,python2的整除/在python3中变成了//,sha方法细化成了sha1和sha256,所以破解文件需要更改加密方式和整除部分的编码方式,经过修改后,这个文件可以完美演算出破解码, ...

  5. js 判断页面是否加载完成

    javascript代码如下: document.onreadystatechange = subSomething; //当页面加载状态改变的时候执行这个方法 function subSomethi ...

  6. Page 16 Exercises 1.2.3 -------Introduction to Software Testing (Paul Ammann and Jeff Offutt)

    Below are four faulty programs. Each includes a test case that results in failure. Answer the follow ...

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

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

  8. Fedora20 编译安装qemu-system

    安装简介: 1.1. 本次编译安装所有的操作都在Fedora 20 x86-64上,内核版本为: 3.14.4-200.fc20.x86_64.如果在其他系统编译安装,请看其他文章. 2.安装准备: ...

  9. 【解决】SAE部署Django1.6+MySQL

    终于可以舒口气了,今天大部分时间都在搞这个,很是蛋疼,网上资料良莠不齐,我不信这个之前没人做过,但是他们确实分享的不够好. 废话不多说,还是记录一下今天的工作吧. 1,装SVN 这个没什么好说的,去官 ...

  10. Dreamweaver SSH Tunneling