1. 程式人生 > >dataTable 、dataView、Dataset 區別的經典回答

dataTable 、dataView、Dataset 區別的經典回答

1、DataView是DataTable的表示,DataTable表裡的記錄是沒有順序的,但顯示可以有不同順序(DataVIew),

但還是同一張表,所以一個DataTable可以有多個DataView,預設訪問DataTable,其實是訪問他的

DefaultView。DataSet則是DataTable的集合,也可以有不止一個DataTable

2、DataView   是一張DataTable的虛擬檢視   ,主要用來顯示資料的   ,其實資料的更改都是發生在DataTable中。

如果以資料庫來打比方,DataSet就是一個功能簡單的資料庫,是多個表(DataTable)的集合,DataTable就是對應數

據庫中的表,而DataView則對應資料庫中的檢視(View)。

ADO.NET中有一層物件,用來建立任意資料來源的抽象模型。其中包括DataSet,DataTable,DataRow,DataView,DataRelation等等。

所有這些物件都定義在System.Data名字空間。它們形成一個抽象模型,使得無論針對Windows Form,Web Form還是Web Service進行程式設計,都可以使用相同的程式設計介面。
在實際應用中,這些物件大多會對諸如SQL Server一類的關係型資料庫中的資料進行操作。但是,它們可以處理各種資料,而不管它的物理儲存媒介。
你可以使用DataSet物件來打包和關聯各表中的資料,用DataTable類來處理表格型別的資料,而DataRow物件可以處理表中某一行的資料。
這三個物件都是對資料進行打包,但有不同的邏輯聚合層次。DataSet是DataTable和其他的組合。而DataTable是DataRow和其他的組合。DataRow是欄位和其他的組合。但是這些物件中都沒有內建過濾和排序的功能。
ADO.NET提供了一些類來處理這個資料庫應用程式中的重要方面。在.Net Beta2中,這方面最重要的兩個物件就是DataView和DataViewManager。
注意:DataViewManager是Beta2中特有的。在Beta1中,相應的功能由DataSetView完成。

定製資料檢視
DataView類用來表示定製的DataTable的檢視。DataTable和DataView的關係是遵循著名的設計模式--文件/檢視模式,其中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.NET的DataView物件用來表示給定資料表的定製的檢視,但你可以像處理單獨的物件一樣處理它。DataView物件保留了對錶的一個引用並允許對它進行更新。


圖二 在ADO.NET中對同一資料表的不同檢視進行操作
功能上而言,使用ADO Recordset克隆與使用特殊的檢視物件完成的是同樣的功能,都是讓你實現過濾,對所選的資料行進行操作,並同時處理多個檢視。

深入DataView物件
DataView物件繼承了MarshalByValueComponent並實現了一組介面使之在資料繫結控制元件中可用。Public Class DataView
Inherits MarshalByValueComponent
Implements IBindingList, IList, ICollection,IEnumerable, _
ITypedList, ISupportInitialize

由MarshalByValueComponent派生的類是.NET遠端元件,可以通過值來列集--即序列化物件到目標應用程式域。(詳見以下關於.NET元件的更多細節)
DataView中的內容可以通過許多程式設計介面進行操作,包括集合,列表和列舉器。IBindingList介面確保了該類提供所有用來支援複雜的和簡單的資料繫結的必要特徵。
總的來說,DataView物件可以用來達到兩個目的。第一,檢視對於關聯DataTable物件和資料繫結控制元件中的DataSource域是很重要的。第二,它也對連線的DataTable提供了一層包裝,讓你能夠進行過濾,排序,編輯和瀏覽。
DataView並不是唯一的可以通過傳值進行遠端操作的資料驅動類。DataSet和DataTable也具有同樣的能力,特別是在互操作的場景下。

建立DataViewpublic 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是一個可讀寫的屬性,用來讀取和設定表過濾的表示式。
public virtual string RowFilter {get; set;}

你可以用列名,邏輯和數字運算子和常量的任意合法組合組成表示式。以下是一些例子:dv.RowFilter = "Country = 'USA'";
dv.RowFilter = "EmployeeID >5 AND Birthdate < #1/31/82#"
dv.RowFilter = "Description LIKE '*product*'"

讓我們來看一下過濾器的基本規則和運算子。
過濾字串是表示式的邏輯連線。可以用AND,OR,NOT來連線成一個較短的表示式,也可以使用圓括號來組成子句,指定優先的運算。
通常包含列名的子句同字母、數字、日期或另一個列名進行比較。這裡,可以使用關係運算符和算術運算子,如>=, <, >, +, *, % (取模)等等。
如果要選取的行並不能方便地通過算術或邏輯運算子表達,你可以使用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表示式的最後,讓我們討論三個很便利的函式:Len,IIF和Substring。
正如其名,Len()返回特定表示式的長度。該表示式可以是一個列名,也可以是其他合法的表示式。
Substring()返回指定的表示式自特定位置開始,特定長度的字元子串。 
我最喜歡用的是IIF(),它按照邏輯表示式的值有一到兩個值。IIF是IF-THEN-ELSE語句的緊湊表達。語法如下:
IIF(expression, if_true, if_false)

通 過該函式,可以建立非常複雜的過濾字串。例如,假定你從SQL Server的Northwind資料庫中取得Employees表,下列表達式可以選出那些employeeID小於6且lastname為偶數個字元 和employeeID大於6且lastname為奇數個字元的員工。
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之外的另一個控制元件,應該怎麼辦呢?又如果你不想使用自動資料繫結呢?應該怎樣預排檢視中所選的資料行呢?

http://www.cnblogs.com/zhchongyao/archive/2009/12/22/1629733.html

相關推薦

dataTable dataViewDataset 區別經典回答

1、DataView是DataTable的表示,DataTable表裡的記錄是沒有順序的,但顯示可以有不同順序(DataVIew), 但還是同一張表,所以一個DataTable可以有多個DataView,預設訪問DataTable,其實是訪問他的 DefaultView。DataSet則是DataTable

ArrayListHashtableDataTableDataViewDataReader和DataSet,DataGrid等的區別和各自的優缺點

ArrayList是可變陣列,只能通過索引來查詢資料。通過Add()方法新增資料..        Hashtable是雜湊表..存的是鍵值對...一個鍵對應一個值.優點就是可以通過關鍵字來找到對應的資料.     如:Hashtable   ht   =   new  

關於DataSetDataViewDataTableDataRow時間格式轉換的一些用法

1、DataTable 繫結至檢視 DataView  :   DataView dataView= dataTable.DefaultView;  這樣做的目的是 可以方便的用一些檢視資料檢索功能 例如RowFilter 2、DataView 轉換成一個新的DataTab

DataSetDataTable區別,ConnectionCommandDataReaderDataAdapterDataSet

etc swd sin cursor tex add mman 性能 ado DataSet和DataTable區別 da.Fill(ds, "alias_1"); //使用DataAdapter的Fill方

XML格式與DataTableDataSetDataView格式的轉換

        /**//// <summary>        /// 將DataSet物件資料儲存為XML檔案        /// </summary>        /// <param name="dt">DataSet</param>       

【ADO.NET基礎知識】SqlConnectioncommandDataSet DataTabledataAdapter

mysq change ado.net 使用 屬於 再次 結構 mman 索引 1.使用Connection連接數據庫的步驟:   (1).添加命名空間 System.Data.SqlClient(註意:初學者經常會忘記)   (2)定義連接字符串。連接SQL Server

ListSetMap集合最常用六個子類及它們之間的區別詳解(含經典面試題)

集合: 在程式設計中,我們需要管理很多物件集,比如某班全部的同學資訊,某個公司的人員資料等等。JAVA集合就是提供某種資料結構的支援,即存放物件,並讓這些物件按照某種資料結構存放。 集合與陣列的區別: 1. 陣列存放的元素個數是在定義陣列時固定的。

Spark RDDDataFrame和DataSet區別

RDD 優點: 編譯時型別安全 編譯時就能檢查出型別錯誤 面向物件的程式設計風格 直接通過類名點的方式來操作資料 缺點: 序列化和反序列化的效能開銷 無論是叢集間的通訊, 還是IO操作都需要對物件的結構和資料進行序列化和反序列化. G

我的C#之路-datasetdatatable的繫結清空新增刪除等操作

一、dataset和datatable 先說說dataset和datatable,dataset是datatable的一個集合,也就是說一個dataset中可以包含多個datatable,可以用ds.tables[0] ds.tables[1]... 來表示,所以我的習慣一

Spark RDDDataFrameDataSet區別和聯絡

左側的RDD[Person]雖然以Person為型別引數,但Spark框架本身不瞭解Person類的內部結構。而右側的DataFrame卻提供了詳細的結構資訊,使得Spark SQL可以清楚地知道該資料集中包含哪些列,每列的名稱和型別各是什麼。DataFrame多了資料的結構資訊,即schema。RDD是分散

談談RDDDataFrameDataset區別和各自的優勢

在spark中,RDD、DataFrame、Dataset是最常用的資料型別,本博文給出筆者在使用的過程中體會到的區別和各自的優勢共性:1、RDD、DataFrame、Dataset全都是spark平臺下的分散式彈性資料集,為處理超大型資料提供便利2、三者都有惰性機制,在進行

RDDDataFrame和Dataset區別

RDD、DataFrame和Dataset是容易產生混淆的概念,必須對其相互之間對比,才可以知道其中異同。 RDD和DataFrame RDD-DataFrame 上圖直觀地體現了DataFrame和RDD的區別。左側的RDD[Person]雖然以Person為型別

ADO.NET DataSetDataView 和 DataViewManager 物件指南

本文提供學習和掌握 ADO.NET DataSet、DataView 和 DataViewManager 物件的指南。指南文章提供指向有用資訊的連結,這些資訊包括聯機文件、Microsoft 知識庫文章和 Microsoft 白皮書,目的在於幫助您瞭解 Microsoft 產品或技術。Microsoft 知識

malloccallocrealloc和alloca各種的區別

calloc 一次 單元 不支持 new span 初始化 har 堆棧 需要先包含頭文件 #include"malloc.h" malloc是標準的在堆中開辟新的空間 比如 char *pt=(char *)malloc(10*sizeof(char)); 需要free(

getContextPathgetServletPathgetRequestURI的區別

request 執行 result web print 名稱 ati 輸入 pri 假定你的web application名稱為example,你在瀏覽器中輸入請求路徑: https://localhost:8080/example/main/edit.jsp 則執行

(轉載)display:inlineblockinline-block的區別

order label doc class 先後 padding str 如何實現 col display:block就是將元素顯示為塊級元素.   block元素的特點是:  總是在新行上開始;  高度,行高以及頂和底邊距都可控制;  寬度缺省是它的容器的100

call() apply() bind()方法的作用和區別

調用 權威指南 () 使用 func 開始 把他 對象 bsp 從一開始,我是在書上看到關於bind()、call() 和 apply(), 不過長久以來,在工作中與網上接觸到了很多關於這三個方法的使用場景,對這三個方法也算是比較熟悉了。所以把他們的作用和區別簡單闡述一下!

JS中constvar和let區別

方法 pre 命令 con 使用 它的 comm 作用 影響 在JavaScript中有三種聲明變量的方式:var、let、const。 1.const 聲明創建一個只讀的常量。這不意味著常量指向的值不可變,而是變量標識符的值只能賦值一次,必須初始化。 const b

jQuery 的 width()height()innerWidth()innerHeight()outWidth()outHeight() 的區別

order head ges alt mar inner 顯示 round out jQuery width() 和 height() 方法 width() 方法設置或返回元素的寬度(不包括內邊距、邊框或外邊距)。 height() 方法設置或返回元素的高度(不包括內邊距、

WCFWebAPIWCFRESTWebService之間的區別

pipes asmx 平板電腦 bind template windows服務 創建 通過 soa 在.net平臺下,有大量的技術讓你創建一個HTTP服務,像Web Service,WCF,現在又出了Web API。在.net平臺下,你有很多的選擇來構建一個HTTP Ser