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的增量 ...
随机推荐
- Oracle自定义数据类型 1
原文 oracle 自定义类型 type / create type 一 Oracle中的类型 类型有很多种,主要可以分为以下几类: 1.字符串类型.如:char.nchar.varchar2.nva ...
- lookupedit清空选择 z
lookupedit绑定数据,选择以后.怎么点击按钮使lookupedit回到初始位置,即nulltext的值.注意,是点击按钮,不是按默认的CTRL+DELETE. txtKHXX.EditValu ...
- Win10正式版激活方法有哪些?如何激活Win10?
很多用户都想将系统升级到Win10,但是却不知道怎么激活Win10正式版的方法,其实不同版本激活正式版Win10的方法秘钥不同,下面99安卓网小编就分享一些激活Win10正式版的方法和秘钥,供大家参考 ...
- linux 学习网站
study-Area:http://www.study-area.org 鸟哥的私房菜:http://linux.vbird.org 鸟哥的私房菜课后答案:http://wapwenku.baidu. ...
- python程序中自启动appium服务
普通启动Appium服务方法: 打开cmd,运行命令: #>appium -a 127.0.0.1 -p 4723 当程序输出如上图信息的时候,表示appium启动成功,此时便可以运行 ...
- PHPSTORM 与 Xdebug 配合调试
基本的配置可以参考网上的文档, 浏览器中装插件(xdebug)或直接在请求中加上如下的参数也可启动调试 ?XDEBUG_SESSION_START=PHPSTORM
- [转]【eoeAndroid索引】史上最牛最全android开发知识汇总
一.开发环境搭建 (已完成) 负责人:kris 状态:已完成 所整理标签为:搭建 SDK JDK NDK Eclipse ADT 模拟器 AVD 调试器(DEBUG) DDMS 测试 日志 Logca ...
- 【boost】使用装饰者模式改造boost::thread_group
在项目中使用boost::thread_group的时候遇到几个问题: 1.thread_group不提供删除全部thread列表的方法,一直使用create会是其内部列表不断增加. 2.thread ...
- LeetCode(3) - Longest Substring Without Repeating Characters
这题的题意大概就是给你一个字符串"abcdecde",找到最长的子字符串长度,里面所有的子母都不重复.本例子中最长的满足条件的子字符串就是"abcde",所以应 ...
- 第一百九十四天 how can I坚持
该挺妈妈话的,不该买可乐,该熬点粥喝,肚子疼,救我. 好像每天都一样,每天都在重复.. 哎.. 对了,买了点花种子,铜钱草,牡丹.玫瑰.还买了棵小多肉. 还有,老妈把咸菜给邮过来了,有点期待啊. 连续 ...