数据访问层-- 对DataSet的扩展

原创 2004年06月24日 16:43:00
很多时候我们不仅仅是对数据库中的一个表进行操作,而是同时对多个表进行同时操作,而且还要有事务,以便出错的时候能够保证数据的完整和正确。

对于这种情况,DataSet是一个很好的选择,在效率上可能会有些影响,只要数据量不是海量,我想在效率上不是什么大问题。通过扩展DataSet,我们可以往DataSet中添加几个表,对数据进行修改之后,一次上传到数据库


例如:扩展的DataSet为:CustomDataSet

DS = new CustomDataSet("table1","");

DS.AddDataTable("table2","");

DataRow dr = DS.GetNewRow("table1",true);

dr[1] = "ha";

dr = DS.GetNewRow("table2",true);

dr[1] = "ha";

DS.UpData();

扩展的DataSet如下:

///
 /// 自定义DataSet,封装对数据库的操作
 ///
 public class CustomDataSet:DataSet
 {
  private SQLServer sqlServer;
  private ArrayList tableNames;
  private ArrayList sqlDataAdapters;  

  public CustomDataSet()
  {
   Init();
  }
  
  ///
  /// 对象实例化
  ///
  /// 表名
  /// 条件
  public CustomDataSet(string TableName,string Condition)
  {
   Init();
   AddDataTable(TableName,Condition);  
  }

  private void Init()
  {
   tableNames = new ArrayList();
   sqlDataAdapters = new ArrayList();
   sqlServer = SQLServer.Instance();
  }

  ///
  /// 添加一个数据表
  ///
  /// 表名
  /// 条件
  public void AddDataTable(string TableName,string Condition)
  {   
   string SQLString = "SELECT * FROM " + TableName ;
   if(Condition != null && Condition != "" && Condition.Trim() != "")
    SQLString += " WHERE " + Condition;
   SqlDataAdapter sqlDataAdapter = new SqlDataAdapter(SQLString,sqlServer.Connection);
   
   SqlCommandBuilder custCB = new SqlCommandBuilder(sqlDataAdapter);

   sqlServer.Connection.Open();
   try
   {
    sqlDataAdapter.FillSchema(this,SchemaType.Source,TableName);
    sqlDataAdapter.Fill(this,TableName);
   }
   finally
   {
    sqlServer.Connection.Close();
   }

   tableNames.Add(TableName);
   sqlDataAdapters.Add(sqlDataAdapter);
  }

  ///
  /// 提交
  ///
  public void UpData()
  {
   UpDataToDataBase(false);
  }
  ///
  /// 提交
  ///
  public void UpData(bool FlagOrder)
  {     
   UpDataToDataBase(FlagOrder);
  }

  private void UpDataToDataBase(bool FlagOrder)
  {
   try
   {
    sqlServer.Connection.Open();
    sqlServer.BeginTransaction();
    if(FlagOrder)
    {
     for(int i = tableNames.Count-1;i>=0;i--)
     {
      SqlDataAdapter sqlDataAdapter = (SqlDataAdapter)sqlDataAdapters[i];
      sqlDataAdapter.SelectCommand.Transaction = sqlServer.SqlTran;
      sqlDataAdapter.Update(this.Tables[i]);
     }
    }
    else
    {
     for(int i = 0;i     {
      SqlDataAdapter sqlDataAdapter = (SqlDataAdapter)sqlDataAdapters[i];
      sqlDataAdapter.SelectCommand.Transaction = sqlServer.SqlTran;
      sqlDataAdapter.Update(this.Tables[i]);
     } 
    }
    sqlServer.CommitTransaction();
   }
   catch
   {
    sqlServer.RollbackTransaction();
    throw;
   }
   finally
   {
    sqlServer.Connection.Close();
   }
  }

  ///
  /// 获取新行
  ///
  /// 表名
  /// 标志位,True表示新行加入到表中,False反之
  /// 新行的引用
  public DataRow GetNewRow(string TableName,bool FlagAdd)
  {
   DataRow dr = this.Tables[TableName].NewRow();
   if(FlagAdd)   
    this.Tables[TableName].Rows.Add(dr);
   return dr;
  }  

  ///
  /// 获取新行
  ///
  /// 表索引
  /// 标志位,True表示新行加入到表中,False反之
  /// 新行的引用
  public DataRow GetNewRow(int Index,bool FlagAdd)
  {
   DataRow dr = this.Tables[Index].NewRow();
   if(FlagAdd)   
    this.Tables[Index].Rows.Add(dr);
   return dr;
  }

  ///
  /// 添加新行
  ///
  /// 表名
  /// 新行
  public void AddNewRow(string TableName,DataRow dr)
  {
   this.Tables[TableName].Rows.Add(dr);
  }
  ///
  /// 添加新行
  ///
  /// 表索引
  /// 新行
  public void AddNewRow(int Index,DataRow dr)
  {
   this.Tables[Index].Rows.Add(dr);
  }

  ///
  /// 获取一行
  ///
  /// 表名
  /// 索引
  /// 行的引用
  public DataRow GetRow(string TableName,int Index)
  {
   return this.Tables[TableName].Rows[Index];
  }

  ///
  /// 获取一行
  ///
  /// 表索引
  /// 行索引
  /// 行的引用
  public DataRow GetRow(int TIndex,int RIndex)
  {
   return this.Tables[TIndex].Rows[RIndex];
  }

  ///
  /// 获取行集
  ///
  /// 表名
  /// 条件
  /// 行集
  public DataRow[] GetRows(string TableName,string Condition)
  {
   return this.Tables[TableName].Select(Condition,null,DataViewRowState.CurrentRows);
  }

  ///
  /// 获取行集
  ///
  /// 表索引
  /// 条件
  /// 行集
  public DataRow[] GetRows(int Index,string Condition)
  {
   return this.Tables[Index].Select(Condition,null,DataViewRowState.CurrentRows);
  }

  ///
  /// 删除一行
  ///
  /// 表名
  /// 索引
  public void DeleteRow(string TableName,int Index)
  {
   this.Tables[TableName].Rows[Index].Delete();
  }
  ///
  /// 删除一行
  ///
  /// 表索引
  /// 行索引
  public void DeleteRow(int TIndex,int RIndex)
  {
   this.Tables[TIndex].Rows[RIndex].Delete();
  }

  ///
  /// 删除行集
  ///
  /// 表名
  /// 条件
  public void DeleteRows(string TableName,string Condition)
  {
   foreach(DataRow dr in GetRows(TableName,Condition))
    dr.Delete();
  }
  ///
  /// 删除行集
  ///
  /// 表索引
  /// 条件
  public void DeleteRows(int Index,string Condition)
  {
   foreach(DataRow dr in GetRows(Index,Condition))
    dr.Delete();
  }
  ///
  /// 删除表中所有记录
  ///
  /// 表名
  public void DeleteDataTable(string TableName)
  {
   foreach(DataRow dr in this.Tables[TableName].Select(null,null,DataViewRowState.CurrentRows))
    dr.Delete();
  }

  ///
  /// 删除表中所有记录
  ///
  /// 表索引
  public void DeleteDataTable(int Index)
  {
   foreach(DataRow dr in this.Tables[Index].Select(null,null,DataViewRowState.CurrentRows))
    dr.Delete();
  }

  ///
  /// 删除所有表
  ///
  public void DeleteAll()
  {
   for(int i=0;i   {
    foreach(DataRow dr in this.Tables[i].Select(null,null,DataViewRowState.CurrentRows))
     dr.Delete();
   }
  }
  
  ///
  /// 设置主键
  ///
  /// 表名
  /// 键
  public void SetPrimaryKey(string TableName,params string[] Keys)
  {
   DataColumn [] dc = new DataColumn[Keys.Length];
   for(int i=0;i   {
    dc[i] = this.Tables[TableName].Columns[Keys[i]];
   }
   this.Tables[TableName].PrimaryKey = dc;
  }

  ///
  /// 设置主键
  ///
  /// 表索引
  /// 键
  public void SetPrimaryKey(int Index,params string[] Keys)
  {
   DataColumn [] dc = new DataColumn[Keys.Length];
   for(int i=0;i   {
    dc[i] = this.Tables[Index].Columns[Keys[i]];
   }
   this.Tables[Index].PrimaryKey = dc;
  }
 }

 

数据访问层的设计(一)——功能与接口定义

数据访问层的设计我研究了很长时间,关于接口的定义,好几次都推翻重来。 园子看到过很多easyui+MVC+EF的文章,在早期,我的设计也类似。 但是后来为了增强它,想加点功能通用的功能进去,就耗费...
  • dyllove98
  • dyllove98
  • 2013年07月19日 19:19
  • 7940

数据访问层的设计和实现(分布式系统七)

(1)如何对外提供数据访问层的功能 数据访问层就是方便应用进行数据读写访问的抽象层,在该层上解决各个应用通用的访问数据库的问题。 上图显示了三种方式,第一种是为用户提供专有API,不过不推...
  • u011393781
  • u011393781
  • 2016年10月08日 17:41
  • 1479

三层架构:表示层-业务逻辑层-数据访问层

三层架构和MVC是两个东西。 非要相关的话: 三层架构中"表现层"的aspx页面对应MVC中的View(继承的类不一样) 三层架构中"表现层"的aspx.cs页面(类)对应MVC中的Co...
  • ruiguang21
  • ruiguang21
  • 2016年12月25日 11:29
  • 2076

.net中的数据访问层的封装

当年.net项目中自己封装的数据访问层,个人感觉使用非常方便
  • kevin_xf
  • kevin_xf
  • 2016年12月05日 15:53
  • 764

分布式数据访问层(DAL)

概述分布式(Distributed)数据访问层(Data Access Layer),简称DAL,是利用MySQL Proxy、Memcached、集群等技术优点而构建的一个架构系统。主要目的是为了解...
  • xcbeyond
  • xcbeyond
  • 2017年02月11日 00:46
  • 1340

数据访问层MyBatis解析

一、背景         最近在研究Java的框架,刚刚接触到java对于数据访问层封装的框架之一,MyBatis,不得不说使用起来很是方便,跟写sql语句的感觉一样一样的;顺便读了少部分官方文档,...
  • u012704843
  • u012704843
  • 2017年04月06日 17:46
  • 864

三层架构:表示层-业务逻辑层-数据访问层

三层架构和MVC是两个东西。 非要相关的话: 三层架构中"表现层"的aspx页面对应MVC中的View(继承的类不一样) 三层架构中"表现层"的aspx.cs页面(类)对应MVC中的Co...
  • m0_37033566
  • m0_37033566
  • 2016年12月21日 16:50
  • 9865

黑马程序员:数据访问层,DAO模式

---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ---------------------- DAO模式好处,组成 1.软件开...
  • u011004873
  • u011004873
  • 2013年10月13日 17:09
  • 1106

中间件-数据访问层

单机情况下数据库在不同语言,不同平台都有各自数据库访问组件,各种类似odbc、jdbc的封装以及orm的处理都已经相当成熟。 数据库压力越来越大,处理方法是优化应用,减少压力。二是对数据库进行读写分...
  • qq_28299831
  • qq_28299831
  • 2015年11月13日 17:01
  • 623

Asp.net mvc 数据访问层

理解了一些概念,本节开始尝试创建属于自己的数据访问层,说道数据访问层那必须有数据库咯(数据集合也算,此处以数据库为例),没有数据库就没有数据访问层。 1、先创建属于自己的数据库       打开已...
  • u013108485
  • u013108485
  • 2016年04月14日 16:19
  • 4869
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据访问层-- 对DataSet的扩展
举报原因:
原因补充:

(最多只允许输入30个字)