博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ADO.NET中的视图和过滤器(转)

Posted on 2008-09-03 01:28  Ran  阅读(574)  评论(0)    收藏  举报

 定制数据视图
  DataView
用来表示定制的DataTable视图DataTableDataView系是遵循著名的设计模式--文档/视图模式,其中DataTable是文档,而Dataview视图

  
在任何候,你都可以有多个基于相同数据的不同的视图。更重要的是,你可以对每一个具有自己一套属性、方法、事件的视图独立的理。也代表了相ADO一个巨大的飞跃
  ADO Recordset
可以定义过滤字符串。一旦你建立了字符,只有匹配特定准的数据才能够进写。Filter属性的工作原理同动态WHERE子句很相似。它只是简单的在同一recordset视图藏了某些记录

  
ADO中,你从没有一个独立的视图对象。一个过滤过recordset是同一个象,只不过显出的记录比它实际数量少一些而已。

  
如果你不需要同时处理一些不同的视图,上述问题并不要程接口予了recordset既可以是表也可以是视图的功能。但是在不能同时发生。在某一特定刻,recordset只能是没有过滤字符串的表或者是激活了过滤字符串的视图

  Recordset
的克隆提供了好解决构限制的方法。正如Clonation and the Case of Table Dolly, Part 1中所的,克隆recordset对开销较少,因它不制数据,只是recordset的基本构造。要理同一数据两个或两个以上的视图,你可以利用两个或两个以上克隆,各自有一套相过滤字符串。 
   
  
 
   
  
ADO理同一recordset不同的视图 
  
ADO.NET中,你可以使用新型象模型所提供的DataView象。ADO.NETDataView象用来表示定数据表的定制的视图,但你可以像独的象一样处理它。DataView象保留了表的一个引用并允许对行更新。 
   
  
 
   
  
ADO.NET同一数据表的不同视图进行操作
  
功能上而言,使用ADO Recordset克隆与使用特殊的视图对象完成的是同的功能,都是实现过滤的数据行行操作,并同时处理多个视图

 

DataView中的内容可以通过许程接口行操作,包括集合,列表和枚器。
IBindingList
接口确保了该类提供所有用来支持复杂的和简单的数据定的必要特征。 
  的来DataView象可以用来达到两个目的。第一,视图对关联DataTable象和数据定控件中的DataSource域是很重要的。第二,它也对连接的DataTable提供了一包装,你能够进过滤,排序,编辑浏览 

  DataView
并不是唯一的可以通过传值进程操作的数据驱动类DataSetDataTable也具有同的能力,特是在互操作的景下

 DataView public DataView();
  public DataView(DataTable);

 

DataView只有同已存在的、很可能是非空的DataTable接后才可用。通常,接在构造就指定了。
DataView dv;
dv = new DataView(theDataSet.Tables["Employees"]);
  
  
但是,你也可以先建一个新的视图,然后再用Table属性同表相关联
  DataView dv = new DataView();
  dv.Table = theDataSet.Tables["Employees"];
  DataView
构造函数使你由DataTable中得到一个DataView象。如果需要,反之亦可。事上,DataTable象的DefaultView属性返回一个表的DataView象。
  
DataView dv = dt.DefaultView;

 

一旦你有了DataView象, 你可以利用它的属性来建立你希望用户见到的数据行集。一般,你可以使用下列属性:
  
  RowFilter
  Sort
 
前者可以定制视图中可数据匹配的规则。而后者通表达式来行排序。当然你可以使用两者的任意

过滤 RowFilter是一个可写的属性,用来取和置表过滤的表达式

 

你可以用列名,逻辑和数字运算符和常量的任意合法成表达式。以下是一些例子:

 dv.RowFilter = "Country = 'USA'";
  dv.RowFilter = "EmployeeID >5 AND Birthdate < #1/31/82#"
  dv.RowFilter = "Description LIKE '*product*'"

 

来看一下过滤器的基本规则和运算符。
  
过滤字符串是表达式的逻辑连接。可以用ANDORNOT接成一个短的表达式,也可以使用括号来成子句,指定先的运算

 

通常包含列名的子句同字母、数字、日期或另一个列名行比里,可以使用系运算符和算运算符,如>=, <, >, +, *, % (取模)等等。
  
如果要取的行并不能方便地通逻辑运算符表达,你可以使用IN操作符。以下代码显示如何取一个随机行:
  dv.RowFilter = "employeeID IN (2,4,5)"

 

你也可以使用通配符*%,它LIKE运算符一起使用时显得更有用。它都表示任意数量的字符,可以相互替代使用。

  
注意,如果在LIKE子句中已有了*%字符,你必用方括号将其括起,以免歧。如果很不幸,字符串中方括号本身也存在了,那它也必用将本身括起。这样,匹配句会如下所示:
  dv.RowFilter = "Description LIKE '[[]*[]]product[[]*[]]"
  
  
通配符只允过滤字符串的开头使用,而不能在字符串中。例如,下列句会生运行时错误
  dv.RowFilter = "Description LIKE 'prod*ct"
  
  
字符串必引号括起,而日期型必#符号括起。字符型可以使用小数点和科学数法。
  RowFilter
也支持聚合函数,如SUM, COUNT, MIN,MAX, and AVG。如果表中没有数据行,那函数将返回NULL

  
在介RowFilter表达式的最后,们讨论三个很便利的函数:LenIIFSubstring
  
正如其名,Len()返回特定表达式的度。表达式可以是一个列名,也可以是其他合法的表达式。

  Substring()
返回指定的表达式自特定位置始,特定的字符子串。

 

我最喜用的是IIF(),它按照逻辑表达式的有一到两个IIFIF-THEN-ELSE句的凑表达。法如下:
  IIF(expression, if_true, if_false)
  
  
过该函数,可以建立非常复杂过滤字符串。例如,假定你从SQL ServerNorthwind数据中取得Employees表,下列表达式可以出那些employeeID小于6lastname偶数个字符和employeeID大于6lastname奇数个字符的工。

  IIF(employeeID<6, Len(lastname) %2 =0, Len(lastname) %2 >0)
  
  
图显示了果(用程序会在稍后讨论
  
  

  
  
Northwind中的表过滤
  
例子程序是一个Windows® Form用程序,其中使用了两个datagrid
  
控件来实现master/detail构。一个grid生成,即在SQL
  Server data adapter
完成数据取工作之后。注意,data
  adapter
Beta 2中引入的,在Beta 1中相的是SQLDataSetCommand
  
  
  
视图
  
在上面的例中,datagrid须负责预视图中的数据行,以便刷新用界面。个自机制是.NET
  
数据定的物。Datagrid是通DataSource属性来取数据的数据定控件。DataView是一个可数据定的,可构建DataSource属性的内容。
  
  
如果你想使用datagrid之外的另一个控件,应该么办呢?又如果你不想使用自数据定呢?应该样预视图中所的数据行呢?
  
  DataView
Table属性指向相的数据表,但DataTable并不保存过滤信息。所以,排表中的数据注定是不可行的。DataTableDataView密相的,但它各自保持独立,并行独立的功能。
  
  
以下Visual Basic .NET示了如何遍历视图中所有的数据行,并加入到listbox中。
  Dim dv As New DataView()
  dv = ds.Tables("Employees").DefaultView
  dv.RowFilter = "employeeid >5"
  
  ListBox1.Items.Clear()
  Dim buf As String
  Dim dr As DataRowView
  For Each dr In dv
  buf = ""
  buf &= dr("lastname").ToString()& ", " & dr("firstName").ToString()
  ListBox1.Items.Add(buf)
  Next
  
  
正如前面提到的,DataView是可枚,因此你可以安全的将它传给For..Each句。Count属性存视图中数据行数,以便在For..Next中使用。

  
访问视图中某一行,可以使用DataRowViewDataRowView可表示DataRow视图,就像DataView表达DataTable定制的视图

  
的来DataRow最多有四defaultoriginalcurrentproposed些状DataRowVersion举类置,由RowVersion属性表达。
  DataRow
视图只能是其中某一

  
数据行的默(default)版本只有当其列在构造时设定了默认值时才有。而初始(original)版本是指在最后一次用表的AcceptChanges后,从数源中得到数据行或快照。当前(Current)版本是指当前的数据行,包括所有当时发生的更新。Proposed只存在于BeginEditEndEdit编辑过程中。

  
可以通过访问DataRow相同的访问DataRowView里最重要的属性叫Item
  
  
排序和其他便捷的特性
  DataView
支持Sort属性,可以用来对视图中的内容排序。Sort由用逗号分隔的列名表达式行排序。通在任何列名后加ASC或者DESC限定,可以使得字段按照上升或者下降的序排列。如果没有方向限定,默认顺ASC
  DataView
是内存中的象,所以排序在本地行,无需用数据器。
  RowStateFilter是DataView另一有趣的属性。它可以用任何准来过滤DataTable中的内容。下表中是DataViewRowState举类型的所有取 CurrentRows 包括所有未更新的、新的和修改的数据行
  Deleted 所有自上次AcceptChanges
除的数据行
  ModifiedCurrent 所有自上次AcceptChanges后修改
的数据行
  ModifiedOriginal 所有自上次AcceptChangesoriginal
版本的数据行
  New 所有自上次AcceptChanges
后新添加的行
  OriginalRows 返回初始数据行,包含unchangeddeleted

  Unchanged
所有未更新的数据行
  
  如果要操作非接的数据,所有更新都在DataTableAcceptChanges后生效。对单一行的更新在DataRowAcceptChanges后生效。似的,些更新可以通过调DataTableDataRow象的RejectChanges来取消。
  DataView
有一些属性,如AllowEditAllowDeleteAllowNew,用来得到或定是否允更新的
的默认值设为True,允任何种类的更新。如果在设为False,你想要完成相的更新操作,会有一个运行时错误发生。
  
  DataViewManager

  DataTable
象的DefaultView属性用来返回一个DataView象,作数据表中内容的默认视图。它按照自然取数据并示表中所有的行,而不使用任何过滤
  theMasterGrid.DataSource = m_ds.Tables("Employees").DefaultView
  
  
如果需要数据特定的视图,你可以行排序并/DefaultView象直接过滤
  m_ds.Tables("Employees").DefaultView.Sort = "lastname"
  theMasterGrid.DataSource = m_ds.Tables("Employees").DefaultView
  DataViewManager
是用来存DataSet中所有表的视图设置。
  
可以通过传递一个合法的非空的DataSet给类的构造函数来DataViewManager
  Dim dvm As DataViewManager
  dvm = New DataViewManager(m_ds)
  
  
也可以通DataSet象的DefaultViewManager属性直接得到:
  Dim dvm As DataViewManager = m_ds.DefaultViewManager
  
  
重要的是DataViewManager是同一个DataSet关联的。下面是另一可行的方法:
  Dim dvm As New DataViewManager()
  dvm.DataSet = m_ds
  
  DataViewManager
最重要的属性是DataViewSettings,一个DataViewSetting象的集合。
  
  Dim dvs As DataViewSetting
  dvs = dvm.DataViewSettings("Employees")
  dvs.Sort = "lastname"
  
  DataViewSetting
象包含了表视图的参数信息。当将数据定到数据敏感的控件,使用DataViewManager而不是DataSetDataTable可以保留你的视图设置(过滤和排序字段)
  
  theMasterGrid.DataSource = dvm
  theMasterGrid.DataMember = "Employees"
  
  
里,视图按照DataViewSettingEmployees表指定的自动进行排序和过滤而言之,DataViewSetting特定表的视图的一种缓存。
  
  
下一
  
上述例子程序用filter实现master/detail构。如果使用.NET中特有的数据定控件(如datagrid),能更好的达到个目的。在以后的专栏中,我将述内存中的数据系,以及它是如何影响master/detail构的设计的。
  
对话:你是否需要控件或?
  
  
.NET中有很多术语经常可以替代使用。里特指出的是:件,象和控件。在此,我提供了一表,来表述术语的恰当的含。我们经常将它当成同义词
  
  
需要牢在心的是整个.NET架构是由类组成的。所以你从中得到的任何西,首先,是一个。在.NET境中,控件和件不是同一种类。至于象,可以认为是运行着的.NET例。
  
件是一个特殊的,它实现Icomponent接口或派生于实现Icomponent接口的
  
控件是提供了用界面功能件。在.NET架构中,可以找到两控件:客端的Windows Forms 控件和ASP.NET server 控件。

  Icomponent
接口包含在Idisposable接口中,并提供了一确定的方法清除源。
  Public Interface IComponent
  Inherits IDisposable
  
  
这种释源的方法和准的.NET垃圾收集器可以二者一。通过实现Idisposable,你定了一个Dispose方法。这样过编程,你可以式的象而无等待垃圾收集器来理。
  .NET
件知道怎用程序域(application domain)中如何串有两方法:通引用或通过值,基本功能分内建于MarshalByRefComponetMarshalByValueComponent中。.NET component,事上,实现Idisposable,但直接或承了上述两个中的一个。
  
用程序域是一种轻级进程。通引用来列集象意味着proxy/stub会被建并用。而通过值则意味着该对象的序列化的拷贝传递域的界。

  
控件是更特殊化的象,它提供了用界面元素。当然,一个控件是一个component,但反之不一定成立。