DbHelper数据操作类,达成别的数据库类型的DbHel

本小说为原创内容,如需转发,请评释小编及出处,多谢!

自己在二〇〇六年七月9日写的风流罗曼蒂克篇小说“数据库小工具(C#)”中提到:

 


在编排有关数据库方面包车型客车C#程序时,日常索要精晓数据库的表中各字段的以下消息:
1. 用以OracleParameter(或SqlParameter,...)中的字段和性质的数据库特定的数据类型。

骨子里,微软的集团库中有三个那一个科学的多少操作类了.然而,不菲百货店(起码小编高出的多少个...),对部分"封装"了些什么的事物不太敢用,即使笔者引入过微软的集团库框架了...可是依然要"评估"...大器晚成评正是多少个月...並且,一些铺面部分根本正是裸ado.net开采,恐怕本身包裹的数据库操作类特别别扭,特别不好用.
      这里自个儿给我们分享贰个本身参谋集团库中的数据操作组件编码风格写的数据库操作类,对应用它的程序猿来讲,编码是很舒服滴(起码作者感觉很好撒).以下是代码,很粗大略的,未有做任何多余的卷入,只是改变了ADO.NET的编码步骤,方便了切实可行开拓数据库操作代码的技士.

 

  1. 其相应的.NET数据类型。

图片 1 using System;
图片 2 using System.Data;
图片 3 using System.Data.Common;
图片 4 using System.Configuration;
图片 5
图片 6 public class DbHelper
图片 7图片 8 图片 9{
图片 10 private static string dbProviderName = ConfigurationManager.AppSettings["DbHelperProvider"];
图片 11 private static string dbConnectionString = ConfigurationManager.AppSettings["DbHelperConnectionString"];
图片 12
图片 13 private DbConnection connection;
图片 14 public DbHelper()
图片 15图片 16 图片 17{
图片 18 this.connection = CreateConnection(DbHelper.dbConnectionString);
图片 19        }
图片 20 public DbHelper(string connectionString)
图片 21图片 22 图片 23{
图片 24 this.connection = CreateConnection(connectionString);
图片 25        }
图片 26 public static DbConnection CreateConnection()
图片 27图片 28 图片 29{
图片 30            DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
图片 31            DbConnection dbconn = dbfactory.CreateConnection();
图片 32            dbconn.ConnectionString = DbHelper.dbConnectionString;
图片 33 return dbconn;
图片 34        }
图片 35 public static DbConnection CreateConnection(string connectionString)
图片 36图片 37 图片 38{
图片 39            DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
图片 40            DbConnection dbconn = dbfactory.CreateConnection();
图片 41            dbconn.ConnectionString = connectionString;
图片 42 return dbconn;
图片 43        }
图片 44
图片 45 public DbCommand GetStoredProcCommond(string storedProcedure)
图片 46图片 47 图片 48{
图片 49            DbCommand dbCommand = connection.CreateCommand();
图片 50            dbCommand.CommandText = storedProcedure;
图片 51            dbCommand.CommandType = CommandType.StoredProcedure;
图片 52 return dbCommand;
图片 53        }
图片 54 public DbCommand GetSqlStringCommond(string sqlQuery)
图片 55图片 56 图片 57{
图片 58            DbCommand dbCommand = connection.CreateCommand();
图片 59            dbCommand.CommandText = sqlQuery;
图片 60            dbCommand.CommandType = CommandType.Text;
图片 61 return dbCommand;
图片 62        }
图片 63
图片 64图片 65 扩展参数#region 扩充参数
图片 66 public void AddParameterCollection(DbCommand cmd, DbParameterCollection dbParameterCollection)
图片 67图片 68 图片 69{
图片 70 foreach (DbParameter dbParameter in dbParameterCollection)
图片 71图片 72 图片 73{
图片 74                cmd.Parameters.Add(dbParameter);
图片 75            }
图片 76        }
图片 77 public void AddOutParameter(DbCommand cmd, string parameterName, DbType dbType, int size)
图片 78图片 79 图片 80{
图片 81            DbParameter dbParameter = cmd.CreateParameter();
图片 82            dbParameter.DbType = dbType;
图片 83            dbParameter.ParameterName = parameterName;
图片 84            dbParameter.Size = size;
图片 85            dbParameter.Direction = ParameterDirection.Output;
图片 86            cmd.Parameters.Add(dbParameter);
图片 87        }
图片 88 public void AddInParameter(DbCommand cmd, string parameterName, DbType dbType, object value)
图片 89图片 90 图片 91{
图片 92            DbParameter dbParameter = cmd.CreateParameter();
图片 93            dbParameter.DbType = dbType;
图片 94            dbParameter.ParameterName = parameterName;
图片 95            dbParameter.Value = value;
图片 96            dbParameter.Direction = ParameterDirection.Input;
图片 97            cmd.Parameters.Add(dbParameter);
图片 98        }
图片 99 public void AddReturnParameter(DbCommand cmd, string parameterName, DbType dbType)
图片 100图片 101 图片 102{
图片 103            DbParameter dbParameter = cmd.CreateParameter();
图片 104            dbParameter.DbType = dbType;
图片 105            dbParameter.ParameterName = parameterName;
图片 106            dbParameter.Direction = ParameterDirection.ReturnValue;
图片 107            cmd.Parameters.Add(dbParameter);
图片 108        }
图片 109 public DbParameter GetParameter(DbCommand cmd, string parameterName)
图片 110图片 111 图片 112{
图片 113 return cmd.Parameters[parameterName];
图片 114        }
图片 115
图片 116 #endregion
图片 117
图片 118图片 119 执行#region 执行
图片 120 public DataSet ExecuteDataSet(DbCommand cmd)
图片 121图片 122 图片 123{
图片 124            DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
图片 125            DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter();
图片 126            dbDataAdapter.SelectCommand = cmd;
图片 127            DataSet ds = new DataSet();
图片 128            dbDataAdapter.Fill(ds);
图片 129 return ds;
图片 130        }
图片 131
图片 132 public DataTable ExecuteDataTable(DbCommand cmd)
图片 133图片 134 图片 135{
图片 136            DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
图片 137            DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter();
图片 138            dbDataAdapter.SelectCommand = cmd;
图片 139            DataTable dataTable = new DataTable();
图片 140            dbDataAdapter.Fill(dataTable);
图片 141 return dataTable;
图片 142        }
图片 143
图片 144 public DbDataReader ExecuteReader(DbCommand cmd)
图片 145图片 146 图片 147{
图片 148            cmd.Connection.Open();
图片 149            DbDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);           
图片 150 return reader;
图片 151        }
图片 152 public int ExecuteNonQuery(DbCommand cmd)
图片 153图片 154 图片 155{
图片 156            cmd.Connection.Open();
图片 157 int ret = cmd.ExecuteNonQuery();
图片 158            cmd.Connection.Close();
图片 159 return ret;
图片 160        }
图片 161
图片 162 public object ExecuteScalar(DbCommand cmd)
图片 163图片 164 图片 165{
图片 166            cmd.Connection.Open();
图片 167 object ret = cmd.ExecuteScalar();
图片 168            cmd.Connection.Close();
图片 169 return ret;
图片 170        }
图片 171 #endregion
图片 172
图片 173图片 174 推行专门的学业#region 施行职业
图片 175 public DataSet ExecuteDataSet(DbCommand cmd,Trans t)
图片 176图片 177 图片 178{
图片 179            cmd.Connection = t.DbConnection;
图片 180            cmd.Transaction = t.DbTrans;
图片 181            DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
图片 182            DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter();
图片 183            dbDataAdapter.SelectCommand = cmd;
图片 184            DataSet ds = new DataSet();
图片 185            dbDataAdapter.Fill(ds);
图片 186 return ds;
图片 187        }
图片 188
图片 189 public DataTable ExecuteDataTable(DbCommand cmd, Trans t)
图片 190图片 191 图片 192{
图片 193            cmd.Connection = t.DbConnection;
图片 194            cmd.Transaction = t.DbTrans;
图片 195            DbProviderFactory dbfactory = DbProviderFactories.GetFactory(DbHelper.dbProviderName);
图片 196            DbDataAdapter dbDataAdapter = dbfactory.CreateDataAdapter();
图片 197            dbDataAdapter.SelectCommand = cmd;
图片 198            DataTable dataTable = new DataTable();
图片 199            dbDataAdapter.Fill(dataTable);
图片 200 return dataTable;
图片 201        }
图片 202
图片 203 public DbDataReader ExecuteReader(DbCommand cmd, Trans t)
图片 204图片 205 图片 206{
图片 207            cmd.Connection.Close();
图片 208            cmd.Connection = t.DbConnection;
图片 209            cmd.Transaction = t.DbTrans;           
图片 210            DbDataReader reader = cmd.ExecuteReader();
图片 211            DataTable dt = new DataTable();           
图片 212 return reader;
图片 213        }
图片 214 public int ExecuteNonQuery(DbCommand cmd, Trans t)
图片 215图片 216 图片 217{
图片 218            cmd.Connection.Close();
图片 219            cmd.Connection = t.DbConnection;
图片 220            cmd.Transaction = t.DbTrans; 
图片 221 int ret = cmd.ExecuteNonQuery();           
图片 222 return ret;
图片 223        }
图片 224
图片 225 public object ExecuteScalar(DbCommand cmd, Trans t)
图片 226图片 227 图片 228{
图片 229            cmd.Connection.Close();
图片 230            cmd.Connection = t.DbConnection;
图片 231            cmd.Transaction = t.DbTrans; 
图片 232 object ret = cmd.ExecuteScalar();           
图片 233 return ret;
图片 234        }
图片 235 #endregion
图片 236    }
图片 237
图片 238 public class Trans : IDisposable
图片 239图片 240 图片 241{
图片 242 private DbConnection conn;
图片 243 private DbTransaction dbTrans;
图片 244 public DbConnection DbConnection
图片 245图片 246 图片 247{
图片 248图片 249 get 图片 250{ return this.conn; }
图片 251        }
图片 252 public DbTransaction DbTrans
图片 253图片 254 图片 255{
图片 256图片 257 get 图片 258{ return this.dbTrans; }
图片 259        }
图片 260
图片 261 public Trans()
图片 262图片 263 图片 264{
图片 265            conn = DbHelper.CreateConnection();
图片 266            conn.Open();
图片 267            dbTrans = conn.BeginTransaction();
图片 268        }
图片 269 public Trans(string connectionString)
图片 270图片 271 图片 272{
图片 273            conn = DbHelper.CreateConnection(connectionString);
图片 274            conn.Open();
图片 275            dbTrans = conn.BeginTransaction();
图片 276        }
图片 277 public void Commit()
图片 278图片 279 图片 280{
图片 281            dbTrans.Commit();
图片 282 this.Colse();
图片 283        }
图片 284
图片 285 public void RollBack()
图片 286图片 287 图片 288{
图片 289            dbTrans.Rollback();
图片 290 this.Colse();
图片 291        }
图片 292
图片 293 public void Dispose()
图片 294图片 295 图片 296{
图片 297 this.Colse();
图片 298        }
图片 299
图片 300 public void Colse()
图片 301图片 302 图片 303{
图片 304 if (conn.State == System.Data.ConnectionState.Open)
图片 305图片 306 图片 307{
图片 308                conn.Close();
图片 309            }
图片 310        }
图片 311    }

风度翩翩、在System.Data.Common命名空间下,存在此样的三个类:

及时,对生龙活虎一区别的数据库是各自完成这一个“数据库小工具”的。

那么哪些运用它吗?上面我付出一些核心的施用示例,基本能满足你大多数的数据库操作需求了.
1)直接实践sql语句

    //
    // 摘要:
    //     表示一组方法,这些方法用于创建提供程序对数据源类的实现的实例。
    public abstract class DbProviderFactory
    {
        //
        // 摘要:
        //     初始化 System.Data.Common.DbProviderFactory 类的新实例。
        protected DbProviderFactory();

        //
        // 摘要:
        //     指定特定的 System.Data.Common.DbProviderFactory 是否支持 System.Data.Common.DbDataSourceEnumerator
        //     类。
        //
        // 返回结果:
        //     如果 System.Data.Common.DbProviderFactory 的实例支持 System.Data.Common.DbDataSourceEnumerator
        //     类,则为 true;否则为 false。
        public virtual bool CanCreateDataSourceEnumerator { get; }

        //
        // 摘要:
        //     返回实现 System.Data.Common.DbCommand 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbCommand 的新实例。
        public virtual DbCommand CreateCommand();
        //
        // 摘要:
        //     返回实现 System.Data.Common.DbCommandBuilder 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbCommandBuilder 的新实例。
        public virtual DbCommandBuilder CreateCommandBuilder();
        //
        // 摘要:
        //     返回实现 System.Data.Common.DbConnection 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbConnection 的新实例。
        public virtual DbConnection CreateConnection();
        //
        // 摘要:
        //     返回实现 System.Data.Common.DbConnectionStringBuilder 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbConnectionStringBuilder 的新实例。
        public virtual DbConnectionStringBuilder CreateConnectionStringBuilder();
        //
        // 摘要:
        //     返回实现 System.Data.Common.DbDataAdapter 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbDataAdapter 的新实例。
        public virtual DbDataAdapter CreateDataAdapter();
        //
        // 摘要:
        //     返回实现 System.Data.Common.DbDataSourceEnumerator 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbDataSourceEnumerator 的新实例。
        public virtual DbDataSourceEnumerator CreateDataSourceEnumerator();
        //
        // 摘要:
        //     返回实现 System.Data.Common.DbParameter 类的提供程序的类的一个新实例。
        //
        // 返回结果:
        //     System.Data.Common.DbParameter 的新实例。
        public virtual DbParameter CreateParameter();
        //
        // 摘要:
        //     返回提供程序的类的新实例,该实例可实现提供程序的 System.Security.CodeAccessPermission 类的版本。
        //
        // 参数:
        //   state:
        //     System.Security.Permissions.PermissionState 值之一。
        //
        // 返回结果:
        //     指定 System.Security.Permissions.PermissionState 的 System.Security.CodeAccessPermission
        //     对象。
        public virtual CodeAccessPermission CreatePermission(PermissionState state);
    }

近日,让大家将那一个独立的“小工具”整合在协作啊。

图片 312        DbHelper db = new DbHelper();
图片 313        DbCommand cmd = db.GetSqlStringCommond("insert t1 (id)values('haha')");
图片 314        db.ExecuteNonQuery(cmd);

我们能够看来,在这里类中,有好些个用于创立数据库相关对象的花色,如DbConnection,DbCommand,DbDataAdapter等。

图片 315

2)实行存款和储蓄进程

再者,达成诸如SqlConnection、SqlCommand、SqlData艾达pter(这里用的是SQL Server)的项目,都分别承继自DbConnection,DbCommand,DbDataAdapter,

从上海教室中可以看见 Odbc、奥莱Db、Oracle、SQL Server、SQL Server Mobile Edition、SQL Server Compact Edition、SQLite、MySql 等数据库都早就结合在同三个先后中了。

图片 316        DbHelper db = new DbHelper();
图片 317        DbCommand cmd = db.GetStoredProcCommond("t1_insert");
图片 318        db.AddInParameter(cmd, "@id", DbType.String, "heihei");
图片 319        db.ExecuteNonQuery(cmd);

进而,大家能够利用DbProviderFactory来成立大家想要的、可实现任何数据库的DbHelper。

图片 320

3)返回DataSet

二、完结基本的DbHelper扶持类

上海体育地方彰显实行一条 SQL 语句后的结果。

图片 321        DbHelper db = new DbHelper();
图片 322        DbCommand cmd = db.GetSqlStringCommond("select * from t1");
图片 323        DataSet ds = db.ExecuteDataSet(cmd);

1、大家将DbHelper定义为抽象类,并在类中提供二个空洞可读属性,名为DbProviderFactory,再次来到类型为DbProviderFactory(注:名称与再次来到类型可以为相仿,也可以不相符),

图片 324

4)返回DataTable

2、大家选拔在该抽象类达成的子类中重写DbProviderFactory方法,并在子类的构造函数中为该属性赋值,该值正是曾经落实了实际数据库类型的DbProviderFactory。

上海教室显示出数据库中的表的布局。

图片 325        DbHelper db = new DbHelper();
图片 326        DbCommand cmd = db.GetSqlStringCommond("t1_findall");
图片 327        DataTable dt = db.ExecuteDataTable(cmd);

概念的代码参谋如下:

好了,我们来看源程序吗:

5)输入参数/输出参数/重临值的运用(非常首要哦)

    public abstract class DbHelper
    {
        public abstract DbProviderFactory DbProviderFactory { get; }
    }
using System;
using System.IO;
using System.Data;
using System.Data.Common;
using System.Windows.Forms;

namespace Skyiv.Ben.DbTools
{
  public partial class MainForm : Form
  {
    public MainForm()
    {
      InitializeComponent();
    }

    private void MainForm_Load(object sender, EventArgs e)
    {
      try
      {
        tbxDsn.Text = "Data Source=:memory:";
        tbxSql.Text = "select sqlite_version()";
        var table = DbProviderFactories.GetFactoryClasses();
        lbxDbProvider.ValueMember = "InvariantName";
        lbxDbProvider.DataSource = table;
        dgvMain.DataSource = table;
        lbxDbProvider.SelectedValue = "System.Data.SQLite";
      }
      catch (Exception ex)
      {
        tbxMessage.AppendText(Pub.GetMessage(ex));
      }
    }

    private void btnSubmit_Click(object sender, EventArgs e)
    {
      btnSubmit.Enabled = false;
      try
      {
        tbxMessage.Clear();
        var factory = DbProviderFactories.GetFactory(lbxDbProvider.SelectedValue.ToString());
        using (var conn = factory.CreateConnection())
        {
          conn.ConnectionString = tbxDsn.Text;
          conn.Open();
          tbxMessage.AppendLine("Client Version: [{0}]", Pub.GetClientVersion(Path.GetFileNameWithoutExtension(factory.ToString())));
          tbxMessage.AppendLine("Server Version: [{0}]", conn.ServerVersion);
          var sql = tbxSql.Text.Trim();
          if (sql.Length != 0)
          {
            var comm = conn.CreateCommand();
            comm.CommandText = sql;
            var isQuery = IsQuery(sql);
            var rows = int.MinValue;
            if (!isQuery) rows = comm.ExecuteNonQuery();
            else if (chkStruct.Checked) dgvMain.DataSource = RunQueryTableStruct(comm);
            else dgvMain.DataSource = RunQueryTableData(factory, comm);
            tbxMessage.AppendText("运行 SQL 语句完毕("   (!isQuery ? "非查询" : (chkStruct.Checked ? "表结构" : "查询"))   ")");
            if (rows >= 0) tbxMessage.AppendText(",受影响的行数: "   rows.ToString("N0"));
          }
          else tbxMessage.AppendText("完成");
        }
      }
      catch (Exception ex)
      {
        tbxMessage.AppendText(Pub.GetMessage(ex));
      }
      btnSubmit.Enabled = true;
    }

    DataView RunQueryTableStruct(DbCommand comm)
    {
      using (var r = comm.ExecuteReader(CommandBehavior.KeyInfo))
      {
        return r.GetSchemaTable().DefaultView;
      }
    }

    DataView RunQueryTableData(DbProviderFactory factory, DbCommand comm)
    {
      var da = factory.CreateDataAdapter();
      da.SelectCommand = comm;
      var ds = new DataSet();
      da.Fill(ds);
      return ds.Tables[0].DefaultView;
    }

    bool IsQuery(string sql)
    {
      return sql.ToUpper().StartsWith("SELECT");
    }
  }
}

图片 328        DbHelper db = new DbHelper();
图片 329        DbCommand cmd = db.GetStoredProcCommond("t2_insert");
图片 330        db.AddInParameter(cmd, "@timeticks", DbType.Int64, DateTime.Now.Ticks);
图片 331        db.AddOutParameter(cmd, "@outString", DbType.String, 20);
图片 332        db.AddReturnParameter(cmd, "@returnValue", DbType.Int32);
图片 333
图片 334        db.ExecuteNonQuery(cmd);
图片 335
图片 336 string s = db.GetParameter(cmd, "@outString").Value as string;//out parameter
图片 337 int r = Convert.ToInt32(db.GetParameter(cmd, "@returnValue").Value);//return value
图片 338

3、大家为该抽象类编写二个构造函数,传进去的参数为接连几日来字符串,并将其储存在可读的ConnectionString字段里,代码如下:

以此程序重要利用 System.Data.Common 命名空间中的类来扩充职业 。

6)DataReader使用

    public abstract class DbHelper
    {
        public DbHelper(string connectionString)
        {
            ConnectionString = connectionString;
        }
        public string ConnectionString { get; }
        public abstract DbProviderFactory DbProviderFactory { get; }
    }

在 MainForm_Load 方法(第16到32行)中央银行使 DbProviderFactories 的静态方法 GetFactoryClasses 获得在本机中落到实处 DbProviderFactories 的全体已设置提供程序的消息(第22行),然后再将其绑定到程序主分界面包车型的士 List博克斯(第24行) 和 DataGridView (第25行) 控件上。那样,那三个控件就能联合浮动了。

图片 339      DbHelper db = new DbHelper();
图片 340        DbCommand cmd = db.GetStoredProcCommond("t2_insert");
图片 341        db.AddInParameter(cmd, "@timeticks", DbType.Int64, DateTime.Now.Ticks);
图片 342        db.AddOutParameter(cmd, "@outString", DbType.String, 20);
图片 343        db.AddReturnParameter(cmd, "@returnValue", DbType.Int32);
图片 344
图片 345 using (DbDataReader reader = db.ExecuteReader(cmd))
图片 346图片 347 图片 348{
图片 349            dt.Load(reader);
图片 350        }
图片 351 string s = db.GetParameter(cmd, "@outString").Value as string;//out parameter
图片 352 int r = Convert.ToInt32(db.GetParameter(cmd, "@returnValue").Value);//return value
图片 353

4、在DbHelper编写一些用以落到实处数据库相关操作的办法,这里就用到了DbProviderFactory类中的方法,以下办法仅供参照他事他说加以考查,具体请参照他事他说加以考察其余完整的DbHelp扶持类,

点击“奉行”按键,就能够调用 btnSubmit_Click 方法(第34到68行)。在该办法中:

7)事务的使用.(项目中须要将宗旨的数据库操作组合成二个生龙活虎体化的工作流时,代码级的专业是少不了的啊)

DbHelper完整代码如下:

  • 采取 DbProviderFactories 类的静态方法 GetFactory 获得五个DbProviderFactory (第40行)。
  • 动用 DbProviderFactory 类的 CreateConnection 方法创造三个DbConnection (第41行)。
  • 应用 DbConnection 类的 Open 方法张开数据库连接(第44行)。
  • 行使 DbConnection 类的 CreateCommand 方法创设一个 DbCommand (第50行)。
  • 后生可畏旦要执行的 SQL 语句不是 SELECT 语句,则调用 DbCommand 类的 ExecuteNonQuery 方法实行该 SQL 语句(第54行)。
  • 不然,假设程序主分界面中的“结构”复选框被选中,就调用 RunQueryTableStruct 方法猎取数据库中的表的结构(第55行)。
  • 要不,就调用 RunQueryTableData 方法猎取数据库中的表的数额(第56行)。

图片 354    pubic void DoBusiness()
图片 355图片 356 图片 357{
图片 358 using (Trans t = new Trans())
图片 359图片 360 图片 361{
图片 362 try
图片 363图片 364 图片 365{
图片 366                D1(t);
图片 367 throw new Exception();//假设有不行,会回滚滴
图片 368                D2(t);
图片 369                t.Commit();
图片 370            }
图片 371 catch
图片 372图片 373 图片 374{
图片 375                t.RollBack();
图片 376            }
图片 377        }
图片 378    }
图片 379 public void D1(Trans t)
图片 380图片 381 图片 382{
图片 383        DbHelper db = new DbHelper();
图片 384        DbCommand cmd = db.GetStoredProcCommond("t2_insert");
图片 385        db.AddInParameter(cmd, "@timeticks", DbType.Int64, DateTime.Now.Ticks);
图片 386        db.AddOutParameter(cmd, "@outString", DbType.String, 20);
图片 387        db.AddReturnParameter(cmd, "@returnValue", DbType.Int32);
图片 388
图片 389 if (t == null) db.ExecuteNonQuery(cmd);
图片 390 else db.ExecuteNonQuery(cmd,t);
图片 391
图片 392 string s = db.GetParameter(cmd, "@outString").Value as string;//out parameter
图片 393 int r = Convert.ToInt32(db.GetParameter(cmd, "@returnValue").Value);//return value
图片 394    }
图片 395 public void D2(Trans t)
图片 396图片 397 图片 398{
图片 399        DbHelper db = new DbHelper();
图片 400        DbCommand cmd = db.GetSqlStringCommond("insert t1 (id)values('图片 401..')");       
图片 402 if (t == null) db.ExecuteNonQuery(cmd);
图片 403 else db.ExecuteNonQuery(cmd, t);
图片 404    }

//帮助类的基类(抽象类)
    public abstract class DbHelper
    {
        public DbHelper(string connectionString)
        {
            ConnectionString = connectionString;
        }

        public abstract DbProviderFactory DbProviderFactory {  get; } 

        public string ConnectionString { get; }

        //以下实现的帮助类方法,仅供该例子使用,具体请参照其他完整的DbHelp帮助类
        private void ThrowExceptionIfLengthNotEqual(string[] sqls, params DbParameter[][] parameters)
        {
            if (parameters.GetLength(0) != 0 && sqls.Length != parameters.GetLength(0)) throw new ArgumentException($"一维数组{nameof(sqls)}的长度与二维数组{nameof(parameters)}长度的第一维长度不一致");
        }

        private T[] Execute<T>(string[] sqls, CommandType commandType = CommandType.Text, ExecuteMode executeMode = ExecuteMode.NonQuery, params DbParameter[][] parameters)
        {
            ThrowExceptionIfLengthNotEqual(sqls, parameters);
            if(executeMode == ExecuteMode.NonQuery && typeof(T) != typeof(int)) throw new InvalidCastException("使用NonQuery模式时,必须将类型T指定为int");
            using (DbConnection connection = DbProviderFactory.CreateConnection())
            using (DbCommand command = DbProviderFactory.CreateCommand())
            {
                connection.ConnectionString = ConnectionString;
                connection.Open();
                command.Connection = connection;
                command.CommandType = commandType;
                DbTransaction transaction = connection.BeginTransaction();
                command.Transaction = transaction;
                try
                {
                    List<T> resultList = new List<T>();
                    for (int i = 0; i < sqls.Length; i  )
                    {
                        command.CommandText = sqls[i];
                        if (parameters.GetLength(0) != 0)
                        {
                            command.Parameters.Clear();
                            command.Parameters.AddRange(parameters[i]);
                        }
                        object result = null;
                        switch (executeMode)
                        {
                            case ExecuteMode.NonQuery:
                                result = command.ExecuteNonQuery(); break;
                            case ExecuteMode.Scalar:
                                result = command.ExecuteScalar(); break;
                            default: throw new NotImplementedException();
                        }
                        resultList.Add((T)Convert.ChangeType(result, typeof(T)));
                    }
                    transaction.Commit();
                    return resultList.ToArray();
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }

        public int ExecuteNonQuery(string sql, params DbParameter[] parameter) => ExecuteNonQuery(new string[] { sql }, new DbParameter[][] { parameter })[0];

        public int[] ExecuteNonQuery(string[] sqls, params DbParameter[][] parameters)=> Execute<int>(sqls, CommandType.Text, ExecuteMode.NonQuery,parameters);

        public int ExecuteNonQueryWithProc(string sql, params DbParameter[] parameter) => ExecuteNonQueryWithProc(new string[] { sql },  new DbParameter[][] { parameter })[0];

        public int[] ExecuteNonQueryWithProc(string[] sqls, params DbParameter[][] parameters) => Execute<int>(sqls, CommandType.StoredProcedure, ExecuteMode.NonQuery, parameters);

        public T ExecuteScalar<T>(string sql, params DbParameter[] parameter) => ExecuteNonQuery<T>(new string[] { sql }, new DbParameter[][] { parameter })[0];

        public T[] ExecuteNonQuery<T>(string[] sqls, params DbParameter[][] parameters) => Execute<T>(sqls, CommandType.Text,ExecuteMode.Scalar, parameters);

        public T ExecuteScalarWithProc<T>(string sql, params DbParameter[] parameter) => ExecuteNonQuery<T>(new string[] { sql }, new DbParameter[][] { parameter })[0];

        public T[] ExecuteNonQueryWithProc<T>(string[] sqls, params DbParameter[][] parameters) => Execute<T>(sqls, CommandType.StoredProcedure, ExecuteMode.Scalar, parameters);

        enum ExecuteMode
        {
            NonQuery,Scalar
        }

        private DataTable[] Fill(string[] selectSqls, CommandType commandType = CommandType.Text, params DbParameter[][] parameters)
        {
            ThrowExceptionIfLengthNotEqual(selectSqls, parameters);
            using (DbConnection connection = DbProviderFactory.CreateConnection())
            using (DbDataAdapter adapter = DbProviderFactory.CreateDataAdapter())
            using (DbCommand command = DbProviderFactory.CreateCommand())
            {
                connection.ConnectionString = ConnectionString;
                connection.Open();
                command.Connection = connection;
                command.CommandType = commandType;
                adapter.SelectCommand = command;
                List<DataTable> resultList = new List<DataTable>();
                for (int i = 0; i < selectSqls.Length; i  )
                {
                    command.CommandText = selectSqls[i];
                    if (parameters.GetLength(0) != 0)
                    {
                        command.Parameters.Clear();
                        command.Parameters.AddRange(parameters[i]);
                    }
                    DataTable table = new DataTable();
                    adapter.Fill(table);
                    resultList.Add(table);
                }
                return resultList.ToArray();
            }
        }

        public DataTable Fill(string selectSql, params DbParameter[] parameter) => Fill(new string[] { selectSql }, new DbParameter[][] { parameter })[0];

        public DataTable[] Fill(string[] selectSqls, params DbParameter[][] parameters) => Fill(selectSqls, CommandType.Text, parameters);

        public DataTable FillWithProc(string selectSql, params DbParameter[] parameter) => FillWithProc(new string[] { selectSql }, new DbParameter[][] { parameter })[0];

        public DataTable[] FillWithProc(string[] selectSqls, params DbParameter[][] parameters) => Fill(selectSqls, CommandType.StoredProcedure, parameters);
    }

第70到76行的 RunQueryTableStruct 方法应用 DbCommand 类的 ExecuteReader 方法(使用 CommandBehavior.KeyInfo 参数)得到一个 DbDataReader (第72行),然后调用 DbData里德r 类的 GetSchemaTable 方法来收获数据库中的表的各列的元数据(第74行)。

上述大家好像从没点名数据库连接字符串,我们假使看下DbHelper的代码,就清楚要利用它必需在config中配备四个参数,如下:

三、完毕具体的数据库协助类

第78到85行的 RunQueryTableData 方法应用 DbProviderFactory 类的 CreateData艾达pter 方法创设一个 DbDataAdapter (第80行),然后选取DbDataAdapter 类的 Fill 方法来填充 DataSet (第83行),最终回来该 DataSet 的 Tables 属性中的第1个 DataTabe 的 DefaultView (第84行)。

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

1、完成Sql Server的增加帮衬类,具体方法:只要重写DbHelper类的DbProviderFactory属性并在构造函数为其赋值就能够,其余的数据库支持类亦是那般,

该程序中的静态类 Pub 类提供部分协理的静态方法:

实质上,DbHelper必要的单独是八个字符串,你可以团结校勘,作成加密什么的...
好了,就那样,DbHelper的代码是特别轻巧和透亮的,只是在ado.net上做了某个小包装,改换了一下利用它的程序员的编码方式,去除掉一些相比较" 物理级"的编程概念,如connection的open和close之类的,使工程师更专一于事情逻辑代码的编撰,少死掉点脑部细胞,其余,统一了数量操作层的数码操作代码的风格和格式,维护起来很实惠的撒~~~
另:以上代码大家能够随意行使, 不需求给本人版权费的呀,嘿嘿.假使大家发现成什么样BUG,只怕有越来越好的多寡操作类的兑现情势,请联系小编哦.

代码如下:

using System;
using System.Text;
using System.Windows.Forms;
using System.Reflection;

namespace Skyiv.Ben.DbTools
{
  static class Pub
  {
    public static string GetMessage(Exception ex)
    {
      var sb = new StringBuilder();
      for (sb.Append("错误: "); ex != null; ex = ex.InnerException)
      {
        sb.AppendFormat("[{0}]: ", ex.GetType());
        sb.AppendLine(ex.Message);
      }
      return sb.ToString();
    }

    public static void AppendLine(this TextBoxBase tbx, string fmt, params object[] args)
    {
      tbx.AppendText(string.Format(fmt, args)   Environment.NewLine);
    }

    public static Version GetClientVersion(string name)
    {
      foreach (var a in AppDomain.CurrentDomain.GetAssemblies()) if (name == a.GetName().Name) return a.GetName().Version;
      return null;
    }
  }
}
    //用于Sql Server的帮助类
    public class SqlClientHelper : DbHelper
    {
        public SqlClientHelper(string connectionString) : base(connectionString)
        {
            this.DbProviderFactory = SqlClientFactory.Instance;
        }
        public override DbProviderFactory DbProviderFactory { get; }
    }

最终,完整的源程序可以到 页面下载。

2、参照以上,落成SQLite扶助类如下:

也得以应用 hg clone 命令下载。

    //用于SQLite的帮助类
    public class SQLiteHelper : DbHelper
    {
        public SQLiteHelper(string connectionString) : base(connectionString)
        {
            DbProviderFactory = SQLiteFactory.Instance;
        }
        public override DbProviderFactory DbProviderFactory  { get; }
    }

关于 hg ,请参阅 Mercurial 备忘录。

3、其余数据库的提携类,正如以上所说的,只要重写DbHelper类的DbProviderFactory属性并在构造函数为其赋值就能够。

四、示例演示

选用前,必须援用了System.Data.SQLite,具体请参见一下篇章:

使用C#创办SQLite调控台应用程序

编写制定的顾客端代码,如下:

    class Program
    {
        //客户端调用
        static void Main(string[] args)
        {
            string fileName = "Test.db";
            if (File.Exists(fileName)) File.Delete(fileName);
            SQLiteConnection.CreateFile(fileName);
            SQLiteHelper helper = new SQLiteHelper($"Data Source = {fileName}");
            helper.ExecuteNonQuery("CREATE TABLE IF NOT EXISTS Info(ID integer PRIMARY KEY AUTOINCREMENT, Guid text)");
            List<string> sqlList = new List<string>();
            for (int i = 0; i < 1000; i  )
            {
                sqlList.Add($"INSERT INTO Info VALUES(null,'{Guid.NewGuid()}')");
            }
            helper.ExecuteNonQuery(sqlList.ToArray());
            DataTable table = helper.Fill("SELECT * FROM Info");
            table.Rows.Cast<DataRow>().ToList().ForEach(x => Console.WriteLine($"{x[0]}t{x[1]}"));
            Console.ReadKey();
        }
    }

出口的结果如下:

图片 409

五、完整代码如下:

图片 410图片 411

using System;
using System.Linq;
using System.Collections.Generic;
using System.Data;
using System.Data.Common;
using System.Data.SqlClient;
using System.Data.SQLite;
using System.IO;

namespace ConsoleApp
{
    class Program
    {
        //客户端调用
        static void Main(string[] args)
        {
            string fileName = "Test.db";
            if (File.Exists(fileName)) File.Delete(fileName);
            SQLiteConnection.CreateFile(fileName);
            SQLiteHelper helper = new SQLiteHelper($"Data Source = {fileName}");
            helper.ExecuteNonQuery("CREATE TABLE IF NOT EXISTS Info(ID integer PRIMARY KEY AUTOINCREMENT, Guid text)");
            List<string> sqlList = new List<string>();
            for (int i = 0; i < 1000; i  )
            {
                sqlList.Add($"INSERT INTO Info VALUES(null,'{Guid.NewGuid()}')");
            }
            helper.ExecuteNonQuery(sqlList.ToArray());
            DataTable table = helper.Fill("SELECT * FROM Info");
            table.Rows.Cast<DataRow>().ToList().ForEach(x => Console.WriteLine($"{x[0]}t{x[1]}"));
            Console.ReadKey();
        }
    }

    //用于Sql Server的帮助类
    public class SqlClientHelper : DbHelper
    {
        public SqlClientHelper(string connectionString) : base(connectionString)
        {
            this.DbProviderFactory = SqlClientFactory.Instance;
        }
        public override DbProviderFactory DbProviderFactory { get; }
    }

    //用于SQLite的帮助类
    public class SQLiteHelper : DbHelper
    {
        public SQLiteHelper(string connectionString) : base(connectionString)
        {
            DbProviderFactory = SQLiteFactory.Instance;
        }
        public override DbProviderFactory DbProviderFactory  { get; }
    }

    //--------------------------------------------------------------------------------
    //其他数据库的帮助类,只要重写DbHelper类的DbProviderFactory属性并在构造函数为其赋值即可
    //--------------------------------------------------------------------------------

    //帮助类的基类(抽象类)
    public abstract class DbHelper
    {
        public DbHelper(string connectionString)
        {
            ConnectionString = connectionString;
        }

        public abstract DbProviderFactory DbProviderFactory {  get; } 

        public string ConnectionString { get; }

        //以下实现的帮助类方法,仅供该例子使用,具体请参照其他完整的DbHelp帮助类
        private void ThrowExceptionIfLengthNotEqual(string[] sqls, params DbParameter[][] parameters)
        {
            if (parameters.GetLength(0) != 0 && sqls.Length != parameters.GetLength(0)) throw new ArgumentException($"一维数组{nameof(sqls)}的长度与二维数组{nameof(parameters)}长度的第一维长度不一致");
        }

        private T[] Execute<T>(string[] sqls, CommandType commandType = CommandType.Text, ExecuteMode executeMode = ExecuteMode.NonQuery, params DbParameter[][] parameters)
        {
            ThrowExceptionIfLengthNotEqual(sqls, parameters);
            if(executeMode == ExecuteMode.NonQuery && typeof(T) != typeof(int)) throw new InvalidCastException("使用NonQuery模式时,必须将类型T指定为int");
            using (DbConnection connection = DbProviderFactory.CreateConnection())
            using (DbCommand command = DbProviderFactory.CreateCommand())
            {
                connection.ConnectionString = ConnectionString;
                connection.Open();
                command.Connection = connection;
                command.CommandType = commandType;
                DbTransaction transaction = connection.BeginTransaction();
                command.Transaction = transaction;
                try
                {
                    List<T> resultList = new List<T>();
                    for (int i = 0; i < sqls.Length; i  )
                    {
                        command.CommandText = sqls[i];
                        if (parameters.GetLength(0) != 0)
                        {
                            command.Parameters.Clear();
                            command.Parameters.AddRange(parameters[i]);
                        }
                        object result = null;
                        switch (executeMode)
                        {
                            case ExecuteMode.NonQuery:
                                result = command.ExecuteNonQuery(); break;
                            case ExecuteMode.Scalar:
                                result = command.ExecuteScalar(); break;
                            default: throw new NotImplementedException();
                        }
                        resultList.Add((T)Convert.ChangeType(result, typeof(T)));
                    }
                    transaction.Commit();
                    return resultList.ToArray();
                }
                catch
                {
                    transaction.Rollback();
                    throw;
                }
            }
        }

        public int ExecuteNonQuery(string sql, params DbParameter[] parameter) => ExecuteNonQuery(new string[] { sql }, new DbParameter[][] { parameter })[0];

        public int[] ExecuteNonQuery(string[] sqls, params DbParameter[][] parameters)=> Execute<int>(sqls, CommandType.Text, ExecuteMode.NonQuery,parameters);

        public int ExecuteNonQueryWithProc(string sql, params DbParameter[] parameter) => ExecuteNonQueryWithProc(new string[] { sql },  new DbParameter[][] { parameter })[0];

        public int[] ExecuteNonQueryWithProc(string[] sqls, params DbParameter[][] parameters) => Execute<int>(sqls, CommandType.StoredProcedure, ExecuteMode.NonQuery, parameters);

        public T ExecuteScalar<T>(string sql, params DbParameter[] parameter) => ExecuteNonQuery<T>(new string[] { sql }, new DbParameter[][] { parameter })[0];

        public T[] ExecuteNonQuery<T>(string[] sqls, params DbParameter[][] parameters) => Execute<T>(sqls, CommandType.Text,ExecuteMode.Scalar, parameters);

        public T ExecuteScalarWithProc<T>(string sql, params DbParameter[] parameter) => ExecuteNonQuery<T>(new string[] { sql }, new DbParameter[][] { parameter })[0];

        public T[] ExecuteNonQueryWithProc<T>(string[] sqls, params DbParameter[][] parameters) => Execute<T>(sqls, CommandType.StoredProcedure, ExecuteMode.Scalar, parameters);

        enum ExecuteMode
        {
            NonQuery,Scalar
        }

        private DataTable[] Fill(string[] selectSqls, CommandType commandType = CommandType.Text, params DbParameter[][] parameters)
        {
            ThrowExceptionIfLengthNotEqual(selectSqls, parameters);
            using (DbConnection connection = DbProviderFactory.CreateConnection())
            using (DbDataAdapter adapter = DbProviderFactory.CreateDataAdapter())
            using (DbCommand command = DbProviderFactory.CreateCommand())
            {
                connection.ConnectionString = ConnectionString;
                connection.Open();
                command.Connection = connection;
                command.CommandType = commandType;
                adapter.SelectCommand = command;
                List<DataTable> resultList = new List<DataTable>();
                for (int i = 0; i < selectSqls.Length; i  )
                {
                    command.CommandText = selectSqls[i];
                    if (parameters.GetLength(0) != 0)
                    {
                        command.Parameters.Clear();
                        command.Parameters.AddRange(parameters[i]);
                    }
                    DataTable table = new DataTable();
                    adapter.Fill(table);
                    resultList.Add(table);
                }
                return resultList.ToArray();
            }
        }

        public DataTable Fill(string selectSql, params DbParameter[] parameter) => Fill(new string[] { selectSql }, new DbParameter[][] { parameter })[0];

        public DataTable[] Fill(string[] selectSqls, params DbParameter[][] parameters) => Fill(selectSqls, CommandType.Text, parameters);

        public DataTable FillWithProc(string selectSql, params DbParameter[] parameter) => FillWithProc(new string[] { selectSql }, new DbParameter[][] { parameter })[0];

        public DataTable[] FillWithProc(string[] selectSqls, params DbParameter[][] parameters) => Fill(selectSqls, CommandType.StoredProcedure, parameters);
    }
}

View Code

 

本文由星彩网app下载发布于计算机编程,转载请注明出处:DbHelper数据操作类,达成别的数据库类型的DbHel

TAG标签: 星彩网app下载
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。