概述
DataTable 是一個臨時保存數據的格線虛擬表(表示記憶體中數據的一個表)。DataTable是ADO dot net 庫中的核心對象。它可以被套用在 VB 和 ASP 上。它無須代碼就可以簡單的綁定資料庫。它具有微軟風格的用戶界面。
其他使用DataTable的對象包括DataSet和DataView。
注意事項
當訪問DataTable對象時,請注意它們是按條件區分大小寫的。例如,如果一個DataTable被命名為“mydatatable”,另一個被命名為“Mydatatable”,則用於搜尋其中一個表的字元串被認為是區分大小寫的。但是,如果“mydatatable”存在而“Mydatatable”不存在,則認為該搜尋字元串不區分大小寫。一個DataSet可以包含數個DataTable對象,它們具有相同的TableName屬性值和不同的Namespace屬性值。有關使用DataTable對象的更多信息。
用法介紹
創建 DataTable
DataTable 表示一個記憶體內關係數據的表,可以獨立創建和使用,也可以由其他 .NET Framework 對象使用,最常見的情況是作為 DataSet 的成員使用。
可以使用相應的 DataTable 構造函式創建 DataTable 對象。 可以通過使用 Add 方法將其添加到 DataTable 對象的 Tables 集合中,將其添加到 DataSet 中。
也可以通過以下方法創建 DataTable 對象:使用 DataAdapter 對象的 Fill 方法或 FillSchema 方法在 DataSet 中創建,或者使用 DataSet 的 ReadXml、 ReadXmlSchema 或 InferXmlSchema 方法從預定義的或推斷的 XML 架構中創建。 請注意,將一個 DataTable 作為成員添加到一個 DataSet 的 Tables 集合中後,不能再將其添加到任何其他 DataSet 的表集合中。
初次創建 DataTable 時,是沒有架構(即結構)的。 要定義表的架構,必須創建 DataColumn 對象並將其添加到表的 Columns 集合中。 您也可以為表定義主鍵列,並且可以創建 Constraint 對象並將其添加到表的 Constraints 集合中。 在為 DataTable 定義了架構之後,可通過將 DataRow 對象添加到表的 Rows 集合中來將數據行添加到表中。
創建 DataTable 時,不需要為 TableName 屬性提供值,您可以在其他時間指定該屬性,或者將其保留為空。 但是,在將一個沒有 TableName 值的表添加到 DataSet 中時,該表會得到一個從“Table”(表示 Table0)開始遞增的默認名稱 Table n。
DataTable 架構定義
表的架構(即結構)由列和約束表示。 使用 DataColumn 對象以及 ForeignKeyConstraint 和 UniqueConstraint 對象定義 DataTable 的架構。 表中的列可以映射到數據源中的列、包含從表達式計算所得的值、自動遞增它們的值,或包含主鍵值。
按名稱引用表中的列、關係和約束是區分大小寫的。 因此,一個表中可以存在兩個或兩個以上名稱相同(但大小寫不同)的列、關係或約束。 例如,您可以有 Col1 和 col1。 在這種情況下,按名稱引用某一列就必須完全符合該列名的大小寫,否則會引發異常。 例如,如果表 myTable 包含列 Col1 和列 col1,就要以 myTable.Columns["Col1"] 的形式來按名稱引用 Col1,而以 myTable.Columns["col1"] 的形式按名稱引用 col1。 嘗試以 myTable.Columns["COL1"] 的形式來引用其中某列就會產生異常。
如果某個特定名稱只存在一個列、關係或約束,則不套用區分大小寫規則。 也就是說,如果表中沒有其他的列、關係或約束對象與該特定列、關係或約束對象的名稱匹配,您就可以使用任意的大小寫來按名稱引用該對象,並且不會引發異常。 例如,如果表中只有 Col1,您就可以使用 my.Columns["COL1"] 來引用。
在 DataTable 中處理數據
在 DataSet 中創建 DataTable 之後,您執行的活動可以與使用資料庫中的表時執行的活動相同。 您可以添加、查看、編輯和刪除表中的數據;可以監視錯誤和事件;並且可以查詢表中的數據。 在修改 DataTable 中的數據時,您也可以驗證更改是否正確,並決定是否以編程方式接受更改或拒絕更改。
向數據表中添加數據
說明如何創建新行並將它們添加到表中。
查看數據表中的數據
說明如何訪問行中的數據,包括數據的原始版本和當前版本。
Load 方法
說明如何通過 Load 方法使用行填充 DataTable。
DataTable 編輯
說明如何修改行中的數據,包括掛起對行的更改,直至驗證並接受了建議的更改。
行狀態與行版本
提供有關行的不同狀態的信息。
DataRow 刪除
說明如何從表中移除行。
行錯誤信息
說明如何插入每行的錯誤信息,幫助解決應用程式中的數據問題。
AcceptChanges 和 RejectChanges
說明如何接受或拒絕對行的更改。
構造函式
初始化 DataTable 類的新實例。
重載此成員。有關此成員的完整信息(包括語法、用法和示例),請單擊重載列表中的相應名稱。
名稱 | 說明 | |
DataTable() | 不帶參數初始化 DataTable 類的新實例。 | |
DataTable(String) | 用指定的表名初始化 DataTable 類的新實例。 | |
DataTable(SerializationInfo, StreamingContext) | 使用 SerializationInfo 和 StreamingContext 初始化 DataTable 類的新實例。 | |
DataTable(String, String) | 用指定的表名和命名空間初始化 DataTable 類的新實例。 |
屬性
名稱 | 說明 | |
CaseSensitive | 指示表中的字元串比較是否區分大小寫。 | |
ChildRelations | 獲取此 DataTable 的子關係的集合。 | |
Columns | 獲取屬於該表的列的集合。 | |
Constraints | 獲取由該表維護的約束的集合。 | |
Container | 獲取組件的容器。 (繼承自 MarshalByValueComponent。) | |
DataSet | 獲取此表所屬的 DataSet。 | |
DefaultView | 獲取可能包括篩選視圖或游標位置的表的自定義視圖。 | |
DesignMode | 獲取指示組件當前是否處於設計模式的值。 (繼承自 MarshalByValueComponent。) | |
DisplayExpression | 獲取或設定一個表達式,該表達式返回的值用於表示用戶界面中的此表。 DisplayExpression 屬性用於在用戶界面中顯示此表的名稱。 | |
Events | 獲取附加到該組件的事件處理程式的列表。 (繼承自 MarshalByValueComponent。) | |
ExtendedProperties | 獲取自定義用戶信息的集合。 | |
HasErrors | 獲取一個值,該值指示該表所屬的 DataSet 的任何表的任何行中是否有錯誤。 | |
IsInitialized | 獲取一個值,該值指示是否已初始化 DataTable。 | |
Locale | 獲取或設定用於比較表中字元串的區域設定信息。 | |
MinimumCapacity | 獲取或設定該表最初的起始大小。 | |
Namespace | 獲取或設定 DataTable 中所存儲數據的 XML 表示形式的命名空間。 | |
ParentRelations | 獲取該 DataTable 的父關係的集合。 | |
Prefix | 獲取或設定 DataTable 中所存儲數據的 XML 表示形式的命名空間。 | |
PrimaryKey | 獲取或設定充當數據表主鍵的列的數組。 | |
RemotingFormat | 獲取或設定序列化格式。 | |
Rows | 獲取屬於該表的行的集合。 | |
Site | 獲取或設定 DataTable 的 System.ComponentModel.ISite。 (重寫 MarshalByValueComponent.Site。) | |
TableName | 獲取或設定 DataTable 的名稱。 |
顯式接口實現
名稱 | 說明 | |
IListSource.GetList | 有關此成員的說明,請參見 IListSource.GetList。 | |
IXmlSerializable.GetSchema | 有關此成員的說明,請參見 IXmlSerializable.GetSchema。 | |
IXmlSerializable.ReadXml | 有關此成員的說明,請參見 IXmlSerializable.ReadXml。 | |
IXmlSerializable.WriteXml | 有關此成員的說明,請參見 IXmlSerializable.WriteXml。 |
方法
名稱 | 說明 | |
AcceptChanges | 提交自上次調用 AcceptChanges 以來對該表進行的所有更改。 | |
BeginInit | 開始初始化在窗體上使用或由另一個組件使用的 DataTable。 初始化發生在運行時。 | |
BeginLoadData | 在載入數據時關閉通知、索引維護和約束。 | |
Clear | 清除所有數據的 DataTable。 | |
Clone | 克隆 DataTable 的結構,包括所有 DataTable 架構和約束。 | |
Compute | 計算用來傳遞篩選條件的當前行上的給定表達式。 | |
Copy | 複製該 DataTable 的結構和數據。 | |
CreateDataReader | 返回與此 DataTable 中的數據相對應的 DataTableReader。 | |
CreateInstance | 基礎結構。創建 DataTable 的一個新實例。 | |
Dispose() | 釋放由 MarshalByValueComponent 使用的所有資源。 (繼承自 MarshalByValueComponent。) | |
Dispose(Boolean) | 釋放由 MarshalByValueComponent 占用的非託管資源,還可以另外再釋放託管資源。 (繼承自 MarshalByValueComponent。) | |
EndInit | 結束在窗體上使用或由另一個組件使用的 DataTable 的初始化。 初始化發生在運行時。 | |
EndLoadData | 在載入數據後打開通知、索引維護和約束。 | |
Equals(Object) | 確定指定的對象是否等於當前對象。 (繼承自 Object。) | |
Finalize | 允許對象在“垃圾回收”回收之前嘗試釋放資源並執行其他清理操作。 (繼承自 MarshalByValueComponent。) | |
GetChanges() | 獲取 DataTable 的副本,該副本包含自載入以來或自上次調用 AcceptChanges 以來對該數據集進行的所有更改。 | |
GetChanges(DataRowState) | 獲取由 DataRowState 篩選的 DataTable 的副本,該副本包含上次載入以來或調用 AcceptChanges 以來對該數據集進行的所有更改。 | |
GetDataTableSchema | 該方法返回一個包含 Web 服務描述語言 (WSDL) 的 XmlSchemaSet 實例,該語言描述了用作 Web 服務的 DataTable。 | |
GetErrors | 獲取包含錯誤的 DataRow 對象的數組。 | |
GetHashCode | 作為默認哈希函式。 (繼承自 Object。) | |
GetObjectData | 用序列化 DataTable 所需的數據填充序列化信息對象。 | |
GetRowType | 基礎結構。獲取行類型。 | |
GetSchema | 基礎結構。有關此成員的說明,請參見 IXmlSerializable.GetSchema。 | |
GetService | 獲取 IServiceProvider 的實施者。 (繼承自 MarshalByValueComponent。) | |
GetType | 獲取當前實例的 Type。 (繼承自 Object。) | |
ImportRow | 將 DataRow 複製到 DataTable 中,保留任何屬性設定以及初始值和當前值。 | |
Load(IDataReader) | 通過所提供的 IDataReader,用某個數據源的值填充 DataTable。 如果 DataTable 已經包含行,則從數據源傳入的數據將與現有的行合併。 | |
Load(IDataReader, LoadOption) | 通過所提供的 IDataReader,用某個數據源的值填充 DataTable。 如果 DataTable 已包含行,則從數據源傳入的數據將根據loadOption 參數的值與現有的行合併。 | |
Load(IDataReader, LoadOption, FillErrorEventHandler) | 通過所提供的使用錯誤處理委託的 IDataReader 用某個數據源中的值填充 DataTable。 | |
LoadDataRow(Object[], Boolean) | 查找和更新特定行。 如果找不到任何匹配行,則使用給定值創建新行。 | |
LoadDataRow(Object[], LoadOption) | 查找和更新特定行。 如果找不到任何匹配行,則使用給定值創建新行。 | |
MemberwiseClone | 創建當前 Object 的淺表副本。 (繼承自 Object。) | |
Merge(DataTable) | 將指定的 DataTable 與當前的 DataTable 合併。 | |
Merge(DataTable, Boolean) | 將指定的 DataTable 與當前的 DataTable 合併,指示是否在當前的 DataTable 中保留更改。 | |
Merge(DataTable, Boolean, MissingSchemaAction) | 將指定的 DataTable 與當前的 DataTable 合併,指示是否在當前的 DataTable 中保留更改以及如何處理缺失的架構。 | |
NewRow | 創建與該表具有相同架構的新 DataRow。 | |
NewRowArray | 基礎結構。返回 DataRow 的數組。 | |
NewRowFromBuilder | 從現有的行創建新行。 | |
OnColumnChanged | 引發 ColumnChanged 事件。 | |
OnColumnChanging | 引發 ColumnChanging 事件。 | |
OnPropertyChanging | 引發 PropertyChanged 事件。 | |
OnRemoveColumn | 通知 DataTable:DataColumn 正在被移除。 | |
OnRowChanged | 引發 RowChanged 事件。 | |
OnRowChanging | 引發 RowChanging 事件。 | |
OnRowDeleted | 引發 RowDeleted 事件。 | |
OnRowDeleting | 引發 RowDeleting 事件。 | |
OnTableCleared | 引發 TableCleared 事件。 | |
OnTableClearing | 引發 TableClearing 事件。 | |
OnTableNewRow | 引發 TableNewRow 事件。 | |
ReadXml(Stream) | 使用指定的 Stream 將 XML 架構和數據讀入 DataTable。 | |
ReadXml(String) | 將指定檔案中的 XML 架構和數據讀入 DataTable 中。 | |
ReadXml(TextReader) | 使用指定的 TextReader 將 XML 架構和數據讀入 DataTable。 | |
ReadXml(XmlReader) | 使用指定的 XmlReader 將 XML 架構和數據讀入 DataTable。 | |
ReadXmlSchema(Stream) | 使用指定流將 XML 架構讀入 DataTable 中。 | |
ReadXmlSchema(String) | 將指定檔案中的 XML 架構讀入 DataTable 中。 | |
ReadXmlSchema(TextReader) | 使用指定的 TextReader 將 XML 架構讀入 DataTable 中。 | |
ReadXmlSchema(XmlReader) | 使用指定的 XmlReader 將 XML 架構讀入 DataTable 中。 | |
ReadXmlSerializable | 基礎結構。從 XML 流中讀取。 | |
RejectChanges | 回滾自該表載入以來或上次調用 AcceptChanges 以來對該表進行的所有更改。 | |
Reset | 將 DataTable 重置為其初始狀態。 重置將移除表的所有數據、索引、關係和列。 如果數據集包含一個數據表,則在重置該表之後,它將仍是數據集的一部分。 | |
Select() | 獲取所有 DataRow 對象的數組。 | |
Select(String) | 獲取按與篩選條件相匹配的所有 DataRow 對象的數組。 | |
Select(String, String) | 獲取按照指定的排序順序且與篩選條件相匹配的所有 DataRow 對象的數組。 | |
Select(String, String, DataViewRowState) | 獲取與排序順序中的篩選器以及指定的狀態相匹配的所有 DataRow 對象的數組。 | |
ToString | 獲取 TableName 和 DisplayExpression(如果有一個用作連線字元串)。 (重寫 MarshalByValueComponent.ToString()。) | |
WriteXml(Stream) | 使用指定的 Stream 以 XML 格式寫入 DataTable 的當前內容。 | |
WriteXml(String) | 使用指定的檔案以 XML 格式寫入 DataTable 的當前內容。 | |
WriteXml(TextWriter) | 使用指定的 TextWriter 以 XML 格式寫入 DataTable 的當前內容。 | |
WriteXml(XmlWriter) | 使用指定的 XmlWriter 以 XML 格式寫入 DataTable 的當前內容。 | |
WriteXml(Stream, Boolean) | 使用指定的 Stream 以 XML 格式寫入 DataTable 的當前內容。 若要保存該表及其所有子代的數據,請將 writeHierarchy 參數設定為 true。 | |
WriteXml(Stream, XmlWriteMode) | 使用指定的 XmlWriteMode 將 DataTable 的當前數據寫入指定的檔案,還可以選擇將架構寫入指定的檔案。 若要寫架構,請將mode 參數的值設定為 WriteSchema。 | |
WriteXml(String, Boolean) | 使用指定的檔案以 XML 格式寫入 DataTable 的當前內容。 若要保存該表及其所有子代的數據,請將 writeHierarchy 參數設定為true。 | |
WriteXml(String, XmlWriteMode) | 使用指定的檔案和 XmlWriteMode,寫入 DataTable 的當前數據(還可以選擇寫入架構)。 若要寫架構,請將 mode 參數的值設定為 WriteSchema。 | |
WriteXml(TextWriter, Boolean) | 使用指定的 TextWriter 以 XML 格式寫入 DataTable 的當前內容。 若要保存該表及其所有子代的數據,請將 writeHierarchy 參數設定為 true。 | |
WriteXml(TextWriter, XmlWriteMode) | 使用指定的 TextWriter 和 XmlWriteMode 寫入 DataTable 的當前數據,還可以選擇寫入架構。 若要寫架構,請將 mode 參數的值設定為 WriteSchema。 | |
WriteXml(XmlWriter, Boolean) | 使用指定的 XmlWriter 以 XML 格式寫入 DataTable 的當前內容。 | |
WriteXml(XmlWriter, XmlWriteMode) | 使用指定的 XmlWriter 和 XmlWriteMode 寫入 DataTable 的當前數據,還可以選擇寫入架構。 若要寫架構,請將 mode 參數的值設定為 WriteSchema。 | |
WriteXml(Stream, XmlWriteMode, Boolean) | 使用指定的 XmlWriteMode 將 DataTable 的當前數據寫入指定的檔案,還可以選擇將架構寫入指定的檔案。 若要寫架構,請將mode 參數的值設定為 WriteSchema。 若要保存該表及其所有子代的數據,請將 writeHierarchy 參數設定為 true。 | |
WriteXml(String, XmlWriteMode, Boolean) | 使用指定的檔案和 XmlWriteMode,寫入 DataTable 的當前數據(還可以選擇寫入架構)。 若要寫架構,請將 mode 參數的值設定為 WriteSchema。 若要保存該表及其所有子代的數據,請將 writeHierarchy 參數設定為 true。 | |
WriteXml(TextWriter, XmlWriteMode, Boolean) | 使用指定的 TextWriter 和 XmlWriteMode 寫入 DataTable 的當前數據,還可以選擇寫入架構。 若要寫架構,請將 mode 參數的值設定為 WriteSchema。 若要保存該表及其所有子代的數據,請將 writeHierarchy 參數設定為 true。 | |
WriteXml(XmlWriter, XmlWriteMode, Boolean) | 使用指定的 XmlWriter 和 XmlWriteMode 寫入 DataTable 的當前數據,還可以選擇寫入架構。 若要寫架構,請將 mode 參數的值設定為 WriteSchema。 若要保存該表及其所有子代的數據,請將 writeHierarchy 參數設定為 true。 | |
WriteXmlSchema(Stream) | 將 DataTable 的當前數據結構以 XML 架構形式寫入指定的流。 | |
WriteXmlSchema(String) | 將 DataTable 的當前數據結構以 XML 架構形式寫入指定的檔案。 | |
WriteXmlSchema(TextWriter) | 使用指定的 TextWriter 將 DataTable 的當前數據結構編寫為 XML 架構。 | |
WriteXmlSchema(XmlWriter) | 使用指定的 XmlWriter 將 DataTable 的當前數據結構以 XML 架構形式寫入。 | |
WriteXmlSchema(Stream, Boolean) | 將 DataTable 的當前數據結構以 XML 架構形式寫入指定的流。 若要保存該表及其所有子代的架構,請將 writeHierarchy 參數設定為 true。 | |
WriteXmlSchema(String, Boolean) | 將 DataTable 的當前數據結構以 XML 架構形式寫入指定的檔案。 若要保存該表及其所有子代的架構,請將 writeHierarchy 參數設定為 true。 | |
WriteXmlSchema(TextWriter, Boolean) | 使用指定的 TextWriter 將 DataTable 的當前數據結構編寫為 XML 架構。 若要保存該表及其所有子代的架構,請將 writeHierarchy參數設定為 true。 | |
WriteXmlSchema(XmlWriter, Boolean) | 使用指定的 XmlWriter 將 DataTable 的當前數據結構以 XML 架構形式寫入。 若要保存該表及其所有子代的架構,請將writeHierarchy 參數設定為 true。 |
擴展方法
名稱 | 說明 | |
AsDataView | 創建並返回支持 LINQ 的 DataView 對象。 (由 DataTableExtensions 定義。) | |
AsEnumerable | 返回一個 IEnumerable<T> 對象,其泛型參數 T 為 DataRow。 此對象可用在 LINQ 表達式或方法查詢中。 (由 DataTableExtensions 定義。) |
DataTable 事件
名稱 | 說明 | |
ColumnChanged | 在 DataRow 中指定的 DataColumn 的值被更改後發生。 | |
ColumnChanging | 在 DataRow 中指定的 DataColumn 的值發生更改時發生。 | |
Disposed | 添加事件處理程式以偵聽組件上的 Disposed 事件。 (繼承自 MarshalByValueComponent。) | |
Initialized | 初始化 DataTable 後發生。 | |
RowChanged | 在成功更改 DataRow 之後發生。 | |
RowChanging | 在 DataRow 正在更改時發生。 | |
RowDeleted | 在表中的行已被刪除後發生。 | |
RowDeleting | 在表中的行要被刪除之前發生。 | |
TableCleared | 清除 DataTable 後發生。 | |
TableClearing | 清除 DataTable 後發生。 | |
TableNewRow | 插入新 DataRow 時發生。 |
實例化添加列
DataTable dt = new DataTable();
dt.Columns.Add("ID");
dt.Columns.Add("Name");
DataRow dr = dt.NewRow();
object[] objs = { 1, "Name" };
dr.ItemArray = objs;
dt.Rows.Add(dr);
this.dataGridView1.DataSource = dt;
使用技巧
數據複製
把datatable的結構全部數據或部分數據複製到一個新的datatable
datatable複製表結構:我們可以使用.clone()方法;
DataTable oldDT = GetDataTable();
DataTable newDT = oldDT.Clone();
把datatable中的所有信息複製到一個新的datatable,包括結構和數據:
DataTable oldDT = GetDataTable();
DataTable newDT = oldDT.Copy();
複製datatable中的某一行:我們可以使用.ImportRow()方法;
DataTable oldDT = GetDataTable();
DataTable newDT = new DataTable();
newDT.ImportRow(oldDT.Rows[1]);把原來datatable中的第二行數據複製到新的datatable中。