操作数据库的那点代码,别在费劲每个数据库都写一遍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. top命令 Linux查看CPU和内存使用情况

    一.top命令 top命令是一个功能十分强大的监控系统的工具,对于系统管理员而言尤其重要.但是,它的缺点是会消耗很多系统资源. 在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分 ...

  2. MySql通用分页存储过程

    MySql通用分页存储过程 1MySql通用分页存储过程 2 3过程参数 4p_cloumns varchar(500),p_tables varchar(100),p_where varchar(4 ...

  3. 在VMware虚拟机中安装CentOS 7

    [声明] 欢迎转载,但请保留文章原始出处 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/3917 ...

  4. Worm

    Description 自从见识了平安夜苹果的涨价后,Lele就在他家门口水平种了一排苹果树,共有N棵. 突然Lele发现在左起第P棵树上(从1开始计数)有一条毛毛虫.为了看到毛毛虫变蝴蝶的过程,Le ...

  5. erase() 返回的是删除此元素之后的下一个元素的迭代器 .xml

    pre{ line-height:1; color:#f0caa6; background-color:#2d161d; font-size:16px;}.sysFunc{color:#e54ae9; ...

  6. linux下安装filezilla客户端遇到的问题

    访问filezilla ./filezilla 出现error while loading shared libraries : libpng12.so.o 缺少libpng12.so.o这个文件 解 ...

  7. 【Android】使用persist属性来调用脚本文件

    Android系统中有许多属性,属性由两个部分组成:name & value,可以使用这些属性来记录系统设置或进程之间的信息交换.Android系统在启动过程时会按序从以下几个文件中加载系统属 ...

  8. make subversion时出现neon报错 及 svn其他问题汇总(3ge )

    在make subvision时,出现以下错误提示: /usr/local/src/neon-0.29.6/src/ne_auth.c:781: undefined reference to`ne__ ...

  9. Azure Cloud中的Log4Net设置

    这里的Cloud包含Worker Role和Web Role,Role是运行在云主机中的,这里的主机和VM有所不同,Windows Azure Role Architecture.我们并没有和本地服务 ...

  10. 第三百三十七天 how can I 坚持

    看了两集<太阳的后裔>,你眼中的你自己,真实的你自己,他眼中的你,你眼中的他,他眼中的他自己,真实的他自己.好乱. 何须让别人懂你,何须让自己懂自己,将就着一天天过吧. 睡觉.