C# 操作数据库就的那点代码
操作数据库的那点代码,别在费劲每个数据库都写一遍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# 操作数据库就的那点代码的更多相关文章
- Spring入门(十五):使用Spring JDBC操作数据库
在本系列的之前博客中,我们从没有讲解过操作数据库的方法,但是在实际的工作中,几乎所有的系统都离不开数据的持久化,所以掌握操作数据库的使用方法就非常重要. 在Spring中,操作数据库有很多种方法,我们 ...
- Global.asax中的操作数据库代码无法执行
本人最近在做一个基于Access数据库的Web应用程序,为了实现一个定时更新数据库的需求,我在Global.asax中的Application_Start函数里写了个计时器, void Applica ...
- jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行?
jsp页面:js方法里嵌套java代码(是操作数据库的),如果这个js 方法没被调用,当jsp页面被解析的时候,不管这个js方法有没有被调用这段java代码都会被执行? 因为在解析时最新解析的就是JA ...
- greenDao:操作数据库的开源框架
greenDAO: Android ORM for your SQLite database 1. greenDao库获取 英文标题借鉴的是greendrobot官网介绍greenDao时给出的Tit ...
- 总结一些关于操作数据库是sql语句还是存储过程问题
总结一些关于操作数据库是sql语句还是存储过程问题 程序中,你跟数据的交互,需要向数据库拿数据.更改数据库的数据等,这些操作,本身不是程序完成的,而是程序发命令给数据库去做的,不管是通过sql语句方式 ...
- greendao操作数据库的使用方法
第一步:把greendao-1.3.0-beta-1,greendao-generator-1.3.1两个jar包加载到工程的lib的文件夹中,一定要右键点击Add As Library后才能使用. ...
- Asp.Net MVC 自定义的MVC框架(非EF操作数据库)
一些废话:在北京辞职回家不知不觉中已经半年多了,这半年中有过很多的彷徨,困惑,还有些小小难受.半年时间算是我人生以来遇到过的最困苦的时候.理想的工作跟我擦肩而过,驾照也没有考过,年后这一改革...,毕 ...
- jdbc操作数据库
JDBC全称为:Java DataBase Connectivity(java数据库连接). SUN公司为了简化.统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC. 学习JD ...
- 在MVC3中使用code first生成数据局库并操作数据库
1.建立Users和UserInfos两个实体类 对应的是数据库中的表 public class User { //类名+Id(User+Id)组成的字符串在数据库表中会设置该字段是主键且是按1的增量 ...
随机推荐
- Delphi 7使用自定义图标关联文件类型
Delphi 7使用自定义图标关联文件类型 5.2 Delphi编程(40) 版权声明:本文为博主原创文章,未经博主允许不得转载. 在开发过程中,我们经常需要属于自己的文件类型,自定义的后缀名不仅可 ...
- JS操作文件
) ; ; fso ); f1.Close(); // 读取文件的内容. // Response.Write("Reading file <br>") ...
- bzoj1833 digit
这道题其实挺水,只是写的时候需要想清楚.我的方法是: 1.将[a,b]转化为[0,b+1)-[0,a) 2.预处理出非0的v在区间[0,10^p)出现次数以及0在区间[0,10^p)出现数 3.将一个 ...
- C#单元测试
简单来说,单元测试就是局部测试,即是对项目中的某个静态类测试.静态方法测试.类的实例化测试以及类的方法测试.当您有一个具体的项目时您可以通过运行查看结果的方式进行测试,但当您只有一个类而没有完整的项目 ...
- 通知(Toast+Notification)
Toast简要说明:(前面已经用过好多次了) Toast是一种非持久的(在屏幕上面留一会儿就消失了),提供给用户简洁提示信息的视图. 它不阻断用户的操作,一般用于显示一些不重要的信息.(比方说设置音量 ...
- N皇后问题--回溯法
1.引子 中国有一句古话,叫做“不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每 ...
- 使用iphone5修剪视频的方法
iphone5有很高的视频拍摄质量,这人很多业余爱好者也加入了视频短片的拍摄当中.在拍摄视频的过程中,为了能够捕捉到精彩瞬间,常常会提前拍摄,并延迟结束拍摄,这样就给视频增加了很多无意义的片段.这时, ...
- [转]https方式使用git保存密码的方式
https方式每次都要输入密码,按照如下设置即可输入一次就不用再手输入密码的困扰而且又享受https带来的极速 设置记住密码(默认15分钟): git config --global credenti ...
- SCAU 10678 神奇的异或
10678 神奇的异或 时间限制:1000MS 内存限制:65535K 题型: 编程题 语言: 无限制 Description 在现在这个信息时代,数据是很重要的东西哦~ 很多时候,一条关键的数 ...
- dom 筛选器
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...