DbHelper数据操作类,DbProviderFactories

简介:

 

微软的企业库中有一个非常不错的数据操作类了.但是,不少公司(起码我遇到的几个...),对一些"封装"了些什么的东西不太敢用,虽然我推荐过微软的企业库框架了...但是还是要"评估"...一评就是几个月...而且,一些公司有的根本就是裸ado.net开发,或者自己封装的数据库操作类非常别扭,很不好用.
      这里我给大家共享一个我参照企业库中的数据操作组件编码风格写的数据库操作类,对使用它的程序员来说,编码是很舒服滴(起码我觉得很好撒).以下是代码,很简单的,没有做任何多余的封装,只是改变了ADO.NET的编码步骤,方便了具体开发数据库操作代码的程序员.

 


using System;
    
using System.Data;
    
using System.Data.Common;
    
using System.Configuration;

    
public class DbHelper
    {
        
private static string dbProviderName = ConfigurationManager.AppSettings["DbHelperProvider"];
        
private static string dbConnectionString = ConfigurationManager.AppSettings["DbHelperConnectionString"];

        
private DbConnection connection;
        
public DbHelper()
        {
            
this.connection = CreateConnection(DbHelper.dbConnectionString);
        }
        
public DbHelper(string connectionString)
        {
            
this.connection = CreateConnection(connectionString);
        }
        
public static DbConnection CreateConnection()
        {
            DbProviderFactory dbfactory 
= DbProviderFactories.GetFactory(DbHelper.dbProviderName);
            DbConnection dbconn 
= dbfactory.CreateConnection();
            dbconn.ConnectionString 
= DbHelper.dbConnectionString;
            
return dbconn;
        }
        
public static DbConnection CreateConnection(string connectionString)
        {
            DbProviderFactory dbfactory 
= DbProviderFactories.GetFactory(DbHelper.dbProviderName);
            DbConnection dbconn 
= dbfactory.CreateConnection();
            dbconn.ConnectionString 
= connectionString;
            
return dbconn;
        }

        
public DbCommand GetStoredProcCommond(string storedProcedure)
        {
            DbCommand dbCommand 
= connection.CreateCommand();
            dbCommand.CommandText 
= storedProcedure;
            dbCommand.CommandType 
= CommandType.StoredProcedure;
            
return dbCommand;
        }
        
public DbCommand GetSqlStringCommond(string sqlQuery)
        {
            DbCommand dbCommand 
= connection.CreateCommand();
            dbCommand.CommandText 
= sqlQuery;
            dbCommand.CommandType 
= CommandType.Text;
            
return dbCommand;
        }

        增加参数
#region 增加参数
        
public void AddParameterCollection(DbCommand cmd, DbParameterCollection dbParameterCollection)
        {
            
foreach (DbParameter dbParameter in dbParameterCollection)
            {
                cmd.Parameters.Add(dbParameter);
            }
        }
        
public void AddOutParameter(DbCommand cmd, string parameterName, DbType dbType, int size)
        {
            DbParameter dbParameter 
= cmd.CreateParameter();
            dbParameter.DbType 
= dbType;
            dbParameter.ParameterName 
= parameterName;
            dbParameter.Size 
= size;
            dbParameter.Direction 
= ParameterDirection.Output;
            cmd.Parameters.Add(dbParameter);
        }
        
public void AddInParameter(DbCommand cmd, string parameterName, DbType dbType, object value)
        {
            DbParameter dbParameter 
= cmd.CreateParameter();
            dbParameter.DbType 
= dbType;
            dbParameter.ParameterName 
= parameterName;
            dbParameter.Value 
= value;
            dbParameter.Direction 
= ParameterDirection.Input;
            cmd.Parameters.Add(dbParameter);
        }
        
public void AddReturnParameter(DbCommand cmd, string parameterName, DbType dbType)
        {
            DbParameter dbParameter 
= cmd.CreateParameter();
            dbParameter.DbType 
= dbType;
            dbParameter.ParameterName 
= parameterName;
            dbParameter.Direction 
= ParameterDirection.ReturnValue;
            cmd.Parameters.Add(dbParameter);
        }
        
public DbParameter GetParameter(DbCommand cmd, string parameterName)
        {
            
return cmd.Parameters[parameterName];
        }

        
#endregion

        执行
#region 执行
        
public DataSet ExecuteDataSet(DbCommand cmd)
        {
            DbProviderFactory dbfactory 
= DbProviderFactories.GetFactory(DbHelper.dbProviderName);
            DbDataAdapter dbDataAdapter 
= dbfactory.CreateDataAdapter();
            dbDataAdapter.SelectCommand 
= cmd;
            DataSet ds 
= new DataSet();
            dbDataAdapter.Fill(ds);
            
return ds;
        }

        
public DataTable ExecuteDataTable(DbCommand cmd)
        {
            DbProviderFactory dbfactory 
= DbProviderFactories.GetFactory(DbHelper.dbProviderName);
            DbDataAdapter dbDataAdapter 
= dbfactory.CreateDataAdapter();
            dbDataAdapter.SelectCommand 
= cmd;
            DataTable dataTable 
= new DataTable();
            dbDataAdapter.Fill(dataTable);
            
return dataTable;
        }

        
public DbDataReader ExecuteReader(DbCommand cmd)
        {
            cmd.Connection.Open();
            DbDataReader reader 
= cmd.ExecuteReader(CommandBehavior.CloseConnection);            
            
return reader;
        }
        
public int ExecuteNonQuery(DbCommand cmd)
        {
            cmd.Connection.Open();
            
int ret = cmd.ExecuteNonQuery();
            cmd.Connection.Close();
            
return ret;
        }

        
public object ExecuteScalar(DbCommand cmd)
        {
            cmd.Connection.Open();
            
object ret = cmd.ExecuteScalar();
            cmd.Connection.Close();
            
return ret;
        }
        
#endregion        

        执行事务
#region 执行事务
        
public DataSet ExecuteDataSet(DbCommand cmd,Trans t)
        {
            cmd.Connection 
= t.DbConnection;
            cmd.Transaction 
= t.DbTrans;
            DbProviderFactory dbfactory 
= DbProviderFactories.GetFactory(DbHelper.dbProviderName);
            DbDataAdapter dbDataAdapter 
= dbfactory.CreateDataAdapter();
            dbDataAdapter.SelectCommand 
= cmd;
            DataSet ds 
= new DataSet();
            dbDataAdapter.Fill(ds);
            
return ds;
        }

        
public DataTable ExecuteDataTable(DbCommand cmd, Trans t)
        {
            cmd.Connection 
= t.DbConnection;
            cmd.Transaction 
= t.DbTrans;
            DbProviderFactory dbfactory 
= DbProviderFactories.GetFactory(DbHelper.dbProviderName);
            DbDataAdapter dbDataAdapter 
= dbfactory.CreateDataAdapter();
            dbDataAdapter.SelectCommand 
= cmd;
            DataTable dataTable 
= new DataTable();
            dbDataAdapter.Fill(dataTable);
            
return dataTable;
        }

        
public DbDataReader ExecuteReader(DbCommand cmd, Trans t)
        {
            cmd.Connection.Close();
            cmd.Connection 
= t.DbConnection;
            cmd.Transaction 
= t.DbTrans;            
            DbDataReader reader 
= cmd.ExecuteReader();
            DataTable dt 
= new DataTable();            
            
return reader;
        }
        
public int ExecuteNonQuery(DbCommand cmd, Trans t)
        {
            cmd.Connection.Close();
            cmd.Connection 
= t.DbConnection;
            cmd.Transaction 
= t.DbTrans;  
            
int ret = cmd.ExecuteNonQuery();            
            
return ret;
        }

        
public object ExecuteScalar(DbCommand cmd, Trans t)
        {
            cmd.Connection.Close();
            cmd.Connection 
= t.DbConnection;
            cmd.Transaction 
= t.DbTrans;  
            
object ret = cmd.ExecuteScalar();            
            
return ret;
        }
        
#endregion
    }

    
public class Trans : IDisposable
    {
        
private DbConnection conn;
        
private DbTransaction dbTrans;
        
public DbConnection DbConnection
        {
            
get { return this.conn; }
        }
        
public DbTransaction DbTrans
        {
            
get { return this.dbTrans; }
        }

        
public Trans()
        {
            conn 
= DbHelper.CreateConnection();
            conn.Open();
            dbTrans 
= conn.BeginTransaction();
        }
        
public Trans(string connectionString)
        {
            conn 
= DbHelper.CreateConnection(connectionString);
            conn.Open();
            dbTrans 
= conn.BeginTransaction();
        }
        
public void Commit()
        {
            dbTrans.Commit();
            
this.Colse();
        }

        
public void RollBack()
        {
            dbTrans.Rollback();
            
this.Colse();
        }

        
public void Dispose()
        {
            
this.Colse();
        }

        
public void Colse()
        {
            
if (conn.State == System.Data.ConnectionState.Open)
            {
                conn.Close();
            }
        }
    }

那么如何使用它呢?下面我给出一些基本的使用示例,基本能满足你大部分的数据库操作需要了.
1)直接执行sql语句

        DbHelper db  =   new  DbHelper();
        DbCommand cmd 
=  db.GetSqlStringCommond( " insert t1 (id)values('haha') " );
        db.ExecuteNonQuery(cmd);

2)执行存储过程

        DbHelper db  =   new  DbHelper();
        DbCommand cmd 
=  db.GetStoredProcCommond( " t1_insert " );
        db.AddInParameter(cmd, 
" @id " , DbType.String,  " heihei " );
        db.ExecuteNonQuery(cmd);

3)返回DataSet

        DbHelper db  =   new  DbHelper();
        DbCommand cmd 
=  db.GetSqlStringCommond( " select * from t1 " );
        DataSet ds 
=  db.ExecuteDataSet(cmd);

4)返回DataTable

        DbHelper db  =   new  DbHelper();
        DbCommand cmd 
=  db.GetSqlStringCommond( " t1_findall " );
        DataTable dt 
=  db.ExecuteDataTable(cmd);

5)输入参数/输出参数/返回值的使用(比较重要哦)

        DbHelper db  =   new  DbHelper();
        DbCommand cmd 
=  db.GetStoredProcCommond( " t2_insert " );
        db.AddInParameter(cmd, 
" @timeticks " , DbType.Int64, DateTime.Now.Ticks);
        db.AddOutParameter(cmd, 
" @outString " , DbType.String,  20 );
        db.AddReturnParameter(cmd, 
" @returnValue " , DbType.Int32);

        db.ExecuteNonQuery(cmd);

        
string  s  =  db.GetParameter(cmd,  " @outString " ).Value  as   string ; // out parameter
         int  r  =  Convert.ToInt32(db.GetParameter(cmd,  " @returnValue " ).Value); // return value

6)DataReader使用

      DbHelper db  =   new  DbHelper();
        DbCommand cmd 
=  db.GetStoredProcCommond( " t2_insert " );
        db.AddInParameter(cmd, 
" @timeticks " , DbType.Int64, DateTime.Now.Ticks);
        db.AddOutParameter(cmd, 
" @outString " , DbType.String,  20 );
        db.AddReturnParameter(cmd, 
" @returnValue " , DbType.Int32);

        
using  (DbDataReader reader  =  db.ExecuteReader(cmd))
        
{
            dt.Load(reader);
        }
        
        
string  s  =  db.GetParameter(cmd,  " @outString " ).Value  as   string ; // out parameter
         int  r  =  Convert.ToInt32(db.GetParameter(cmd,  " @returnValue " ).Value); // return value


7)事务的使用.(项目中需要将基本的数据库操作组合成一个完整的业务流时,代码级的事务是必不可少的哦)

以上我们好像没有指定数据库连接字符串,大家如果看下DbHelper的代码,就知道要使用它必须在config中配置两个参数,如下:

    pubic  void  DoBusiness()
    
{
        
using (Trans t = new Trans())
        
{
            
try
            
{
                D1(t);
                
throw new Exception();//如果有异常,会回滚滴
                D2(t);
                t.Commit();
            }

            
catch
            
{
                t.RollBack();
            }

        }

    }

    
public   void  D1(Trans t)
    
{
        DbHelper db 
= new DbHelper();
        DbCommand cmd 
= db.GetStoredProcCommond("t2_insert");
        db.AddInParameter(cmd, 
"@timeticks", DbType.Int64, DateTime.Now.Ticks);
        db.AddOutParameter(cmd, 
"@outString", DbType.String, 20);
        db.AddReturnParameter(cmd, 
"@returnValue", DbType.Int32);

        
if (t == null) db.ExecuteNonQuery(cmd);
        
else db.ExecuteNonQuery(cmd,t);

        
string s = db.GetParameter(cmd, "@outString").Value as string;//out parameter
        int r = Convert.ToInt32(db.GetParameter(cmd, "@returnValue").Value);//return value
    }

    
public   void  D2(Trans t)
    
{
        DbHelper db 
= new DbHelper();
        DbCommand cmd 
= db.GetSqlStringCommond("insert t1 (id)values('..')");        
        
if (t == null) db.ExecuteNonQuery(cmd);
        
else db.ExecuteNonQuery(cmd, t);
    }

 

     < appSettings >
        
< add key = " DbHelperProvider "  value = " System.Data.SqlClient " />
        
< add key = " DbHelperConnectionString "  value = " Data Source=(local);Initial Catalog=DbHelperTest;Persist Security Info=True;User ID=sa;Password=sa " />
    
appSettings>

其实,DbHelper需要的仅仅是两个字符串,你可以自己修改,作成加密什么的...

好了,就这样,DbHelper的代码是非常简单和透明的,只是在ado.net上做了一点小包装,改变了一下使用它的程序员的编码方式,去除掉一些比较"物理级"的编程概念,如connection的open和close之类的,使程序员更专注于业务逻辑代码的编写,少死掉点脑细胞,另外,统一了数据操作层的数据操作代码的风格和格式,维护起来很方便!

 

目录
相关文章
|
传感器 物联网 数据处理
认识IoT的基本概念和架构
物联网(Internet of Things, IoT)是现代信息技术的重要组成部分,通过将物理设备连接到互联网,实现设备之间的互联和数据交换。随着传感技术、通信技术和数据处理能力的不断提升,物联网在各个领域展现出巨大的潜力和应用前景。本文将介绍物联网的基本概念、架构、关键技术及其应用场景,并探讨其未来的发展趋势。
2229 3
|
监控 安全 Unix
进程回收的实现方式与注意事项:Linux C/C中的回收机制
进程回收的实现方式与注意事项:Linux C/C中的回收机制
781 1
|
机器学习/深度学习 SQL 数据可视化
阿里云ACP大数据考试内容是什么?考试费用是多少?
作为目前市场占比最大的云计算厂商,阿里云旗下的认证在业界内部相当受欢迎的,并且具有很大的含金量,很多人通过学习阿里云的证书知识,提升自己的专业能力,并且在通过考试后拿到相关证书,以此获得进入阿里云以及其合作企业的机会。
|
Web App开发 安全 iOS开发
TrollStore巨魔商店永久安装APP 可实现IOS应用双开 安装任意APP
TrollStore 是一个永久签名的监禁应用程序,可以永久安装您在其中打开的任何 IPA。
14021 0
|
存储 分布式计算 Hadoop
impala入门(一篇就够了)
impala入门(一篇就够了)
554 0
|
8月前
|
存储 人工智能 NoSQL
通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制
MongoDB Atlas 的向量搜索功能为语义搜索和 RAG 提供了一个高效的数据库管理平台。在这个全新的应用场景下,Atlas 的向量检索能力支持开发者实现高效的知识检索和增强型生成应用,使其在智能客服、知识问答、个性化推荐等场景中大放异彩。结合生成式模型的 RAG 应用,MongoDB Atlas 提供了从数据存储到智能生成的完整解决方案,展现出其在现代应用中的巨大潜力。希望本文能够帮助大家更好地理解 MongoDB Atlas 的语义搜索功能和 RAG 的实际应用。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点
通过MongoDB Atlas 实现语义搜索与 RAG——迈向AI的搜索机制
|
4月前
|
JSON API PHP
10多万语录随机一言API接口详解及调用示例
随机一言API可输出心灵鸡汤、至理名言等内容,适用于评论系统、签名生成等场景。完全免费,支持GET/POST请求。需注册获取专属ID和KEY,返回JSON格式数据,并提供PHP、Python调用示例。注意密钥安全与频率限制,内容版权归接口盒子所有。应用于每日推送、心情日记等多种场景。
|
5月前
|
人工智能 自然语言处理 数据挖掘
智能体(AI Agent)开发实战之【LangChain】(三)结合大模型基于RAG实现本地知识库问答优化
智能体(AI Agent)开发实战之【LangChain】(三)结合大模型基于RAG实现本地知识库问答优化
|
人工智能
三战VS2019编译VTK7.1+Qt5.15.2
本文记录了作者在VS2019环境下编译VTK 7.1与Qt 5.15.2的历程,包括正确配置方法、遇到的编译错误以及解决过程。
267 5
ly~
|
并行计算 算法 API
SDL 图形库优化对硬件要求有何变化
SDL(Simple DirectMedia Layer)图形库是一个跨平台的多媒体库,适用于多种操作系统和设备。优化后的SDL 2.0对硬件的要求有所提升,特别是显卡性能。优化包括提高渲染效率、利用硬件加速功能、支持高效解码算法等,以增强图形处理能力和流畅度。同时,优化后的SDL对输入设备的交互体验要求更高,需确保键盘、鼠标、触摸屏等设备的顺畅操作。尽管如此,SDL仍保持良好的兼容性,能在较低配置的硬件上运行,只是性能表现会有所差异。
ly~
783 4