C# 操作数据库就的那点代码
2015-02-02 14:46
260 查看
操作数据库的那点代码,别在费劲每个数据库都写一遍SQLHelper,SQLiteHelper,OleDbHelper,了,这里都有了.
接口不发了,自己抽取定义就行了.
下面是一个sqlserver的实现
使用示例:
接口不发了,自己抽取定义就行了.
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; }
相关文章推荐
- 转 操作 SQL Server Mobile 2005 数据库的常用 C# 代码
- 操作 SQL Server Mobile 2005 数据库的常用 C# 代码
- 操作 SQL Server Mobile 2005 数据库的常用 C# 代码
- C# 操作PostgreSQL 数据库的示例代码
- 看不到代码 C#操作数据库的问题
- (SQL SERVER) (ORACLE) (ACCESS)(POSTGRE SQL)四种数据库操作C#代码
- ADO.NET操作数据库代码诠释(C#)
- c#简单数据库插入操作代码
- 操作 SQL Server Mobile 2005 数据库的常用 C# 代码
- 代码开源(1)——数据库部分操作封装C#实现
- c#对数据库的操作代码(MySql.Data.dll包)
- 操作 SQL Server Mobile 2005 数据库的常用 C# 代码
- C# 操作 access 数据库的实例代码
- 操作 SQL Server Mobile 2005 数据库的常用 C# 代码
- 操作SQL Server Mobile 2005数据库的常用C#代码
- 操作 SQL Server Mobile 2005 数据库的常用 C# 代码
- c#简单数据库操作代码
- 操作 SQL Server Mobile 2005 数据库的常用 C# 代码 (转自黎波)
- (SQL SERVER) (ORACLE) (ACCESS)(POSTGRE SQL)四种数据库操作C#代码
- 投票系统[单/复选,投票数量/项随意][C#/SQL/文件包括数据库代码全部在]