怎樣在Visual C# .NET中實現一個DataSet的不同記錄的選取
來源:互聯網
上載者:User
visual 怎樣在Visual C# .NET中實現一個DataSet的不同記錄的選取
來自:Microsoft Knowledge Base Article – 326176,地址: http://support.microsoft.com/default.aspx?scid=kb;EN-US;326176
摘要:
這是一篇基礎性由淺入深的文章,這篇舉例說明了怎樣實現並怎樣使用一個DataSetHelper類,該類使用簡潔代碼來建立一個新的使某個DataTable對象指定的某列的的值具有唯一性的DataTable對象。
????? 為了實現這個目的,你可以使用SelectDistinct這個公開方法,也可以使用一個私人的通過比較可能包含NULL值(DBNull.Value)的欄位的輔助方法。
?????? DataSetHelper類包含一個DataSet成員變數,你可以隨意的指定現有的一個DataSet對象作為這個DataSet成員的變數。如果這個成員變數是一個有效DataSet,任一一個SelectDistinct方法建立的DataTable對象都能被填充到這個DataSet裡。那樣,這個方法就請求返回涉及的DataTable對象。
要求:
下列清單列出的是推薦的硬體、軟體、網路基礎設施和必須的補丁包:
(1)、Microsoft Windows XP, Windows 2000, or Windows NT 4.0 Service Pack 6a
(2)、Microsoft Visual Studio .NET
這篇文章假設你已熟悉下面的主題:
(1)、Visual C# .NET的文法
(2)、ADO.NET基本原理和文法
DataSetHelper 構造類:
(1)、開始Microsoft Visual Studio .NET。
(2)、在檔案(File)菜單,點建立(New),和然後點擊項目(Project)。
(3)、在建立項目(New Project)對話方塊, 點擊Visual C#項目(Visual C# Projects)下的項目類型(Project Types),然後點擊類庫(Class Library)下的模板(Templates)。
(4)、在名稱欄裡填上DataSetHelper。
(5)、用以下代碼替換類代碼:
public class DataSetHelper
{
???????? public DataSet ds;
???????? public DataSetHelper(ref DataSet DataSet)
???????? {
???????? ??????? ds = DataSet;
???????? }
???????? public DataSetHelper()
???????? {
???????? ??????? ds = null;
???????? }
}
你可以用2次重載的建構函式來建立一個帶或不帶一個有效DataSet的執行個體類。因為類是涉及一個有效DataSet,那麼這個方法返回的DataTable對象這就自動的填充到這個DataSet裡。
注: 增加下面代碼在代碼視窗的頂部:
using System.Data;
?
SelectDistinct 方法:
這個部分包含代碼為公開的SelectDistinct方法和私人的ColumnEqual輔助方法。
(1)、在類定義裡增加下面的私人方法,該方法同樣被用在其他的DataSetHelper 文章裡,它被用做來比較欄位的值(包括NULL值) 。
private bool ColumnEqual(object A, object B)
{
???????? ?? // Compares two values to see if they are equal. Also compares DBNULL.Value.
??????? // Note: If your DataTable contains object fields, then you must extend this
??????? // function to handle them in a meaningful way if you intend to group on them.
???????????????????????????
??????? if ( A == DBNull.Value && B == DBNull.Value ) //? both are DBNull.Value
??????????? return true;
??????? if ( A == DBNull.Value || B == DBNull.Value ) //? only one is DBNull.Value
??????????? return false;
??????? return ( A.Equals(B) );? // value type standard comparison
}
(2)、在類定義裡增加下面的公開方法。這個方法複製你選定的欄位的互異值到一個新的DataTable裡。如果這個欄位包含NULL值,在目標列裡的一條記錄裡也會包含NULL值。
public DataTable SelectDistinct(string TableName, DataTable SourceTable, string FieldName)
{??????
??????? DataTable dt = new DataTable(TableName);
??????? dt.Columns.Add(FieldName, SourceTable.Columns[FieldName].DataType);
???????????????????????????
??????? object LastValue = null;
??????? foreach (DataRow dr in SourceTable.Select("", FieldName))
??????? {
??????????? if (? LastValue == null || !(ColumnEqual(LastValue, dr[FieldName])) )
??????????? {
??????????????? LastValue = dr[FieldName];
??????????????? dt.Rows.Add(new object[]{LastValue});
??????????? }
??????? }
??????? if (ds != null)
??????????? ds.Tables.Add(dt);
??????? return dt;
}
測試應用
(1)、儲存並編譯你先前建立的這部分的DataSetHelper類,然後關閉解決方案。
(2)、在下面的步驟裡在Visual Studio .NET裡建立一個新的Visual C# Windows Form程式:
A、啟動 Visual Studio .NET;
B、在檔案(File)菜單,點建立(New),和然後點擊項目(Project)。
C、在建立項目(New Project)對話方塊, 點擊Visual C#項目(Visual C# Projects)下的項目類型(Project Types),然後點擊Windows應用程式(Windows Application)下的模板(Templates)。
(3)、在方案總管裡右擊解決方案,然後點擊添加現有項目,加入DataSetHelper這個項目。
(4)、在項目菜單裡,點擊項目依賴項(Add Reference)。
(5)、在項目依賴項對話方塊裡,選中依賴項(Projects)標籤,然後增加這個DataSetHelper項目和這個Windows Form程式的關係。
(6)、在視窗設計介面裡,從工具箱裡拖拉一個Button控制項和一個DataGrid控制項到表單上,指定這個按鈕名為btnSelectDistinct,繼續保持DataGrid控制項的預設名字(DataGrid1)。
(7)、表單代碼介面裡,在代碼視窗頂部增加下面的引用聲明:
using System.Data;
(8)、在表單的定義增加下面的變數聲明:
DataSet ds;
DataSetHelper.DataSetHelper dsHelper;
(9)、增加下面的構造代碼(在the InitializeComponent();的下面):
ds = new DataSet();
dsHelper = new DataSetHelper.DataSetHelper(ref ds);
?
// Create source table
DataTable dt = new DataTable("Orders");
dt.Columns.Add("EmployeeID", Type.GetType("System.String"));
dt.Columns.Add("OrderID", Type.GetType("System.Int32"));
dt.Columns.Add("Amount", Type.GetType("System.Decimal"));
???????????????????????????
dt.Rows.Add(new object[] {"Sam", 5, 25.00});
dt.Rows.Add(new object[] {"Tom", 7, 50.00});
dt.Rows.Add(new object[] {"Sue", 9, 11.00});
dt.Rows.Add(new Object[] {"Tom", 12, 7.00});
dt.Rows.Add(new Object[] {"Sam", 14, 512.00});
dt.Rows.Add(new Object[] {"Sue", 15, 17.00});
dt.Rows.Add(new Object[] {"Sue", 22, 2.50});
dt.Rows.Add(new object[] {"Tom", 24, 3.00});
dt.Rows.Add(new object[] {"Tom", 33, 78.75});
?
ds.Tables.Add(dt);
(10)、增加下面的代碼在btnSelectDistinct.Click的事件裡:
dsHelper.SelectDistinct("DistinctEmployees", ds.Tables["Orders"], "EmployeeID");
dataGrid1.SetDataBinding(ds, "DistinctEmployees");
(11)、運行這個程式,點擊按鈕一次,觀察DataGrid綁定上從代碼產生的表和資料。
注意:你只能點擊btnSelectDistinct一次。如果你點擊這個按鈕超過一次的話,你將收到一條錯誤資訊——你2次都在嘗試添加同一個表。
進一步的想法:
你用這個功能只能篩選一個欄位為互異,可是你可以類似性的擴充到多個欄位。做為另一種選擇,你可以調用CreateGroupByTable、InsertGroupByInto, 和 SelectGroupByInto 方法,通過使用GROUP BY-type的函數得到同樣的結果。
?