天天看點

DataSet與DataTable簡介



DataSet類表示記憶體中的資料集合,可以将它看成是一個簡單的記憶體資料庫,一個DataSet可以包含多個DataTable,并且可以包含DataTable之間的關系、限制等資訊

DataSet中所有的資料表都可以通過它的Tables屬性通路,DataSet中的資料的存儲實際是通過DataTable來實作。

DataTable類是一個資料表在記憶體中的表示,它包括資料表的列定義,DataColumnCollection屬性表示資料表中的列的定義,通過資料提供程式可以自動從資料庫伺服器擷取該資訊,也可以通過代碼的形式建立該資訊

當以代碼的方式建立DataTable時,先建立必須的DataColumn對象,然後将它們添加到DataColumnCollection中。隻有獲得了DataTable的列定義後才能添加它的資料記錄

DataRow表示DataTable中的一條記錄,通過DataTable的NewRow()方法可以獲得一個滿足DataTable列定義的DataRow對象,然後再設定新的DataRow的資料

DataTable類表示一個資料表,可以通過兩種方式建立:

(1)通過資料庫操作從資料庫擷取

(2)直接通過DataTable的構造函數建立

編碼建立DataTable的步驟:

建立DataTable對象

建構和設定DataColumn

将DataColumn添加到表

建構DataRow

将DataRow添加到表

接着可以循環周遊DataSet,輸出每張table的每個元素。

代碼示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace CreateDataTable
{
    class Program
    {
        static void Main(string[] args)
        {
            //DataTable dt = BuildDataTable();
            DataSet myDS = BuildDataSet();
            
            //方法1  循環周遊輸出dt
            for (int t = 0; t < myDS.Tables.Count; ++t)//周遊DataTable
            {
                //foreach (DataRow r in myDS.Tables[t].Rows)//周遊每個表的 行
                for (int r = 0; r < myDS.Tables[t].Rows.Count; ++r) //周遊每個表的 行
                {
                    for (int i = 0; i < myDS.Tables[t].Columns.Count; ++i)
                    {
                        Console.Write(myDS.Tables[t].Rows[r][i] + "\t"); //周遊輸出每一行的,每一列
                        //Console.WriteLine(myDS.Tables[t].Rows[r]["EmployeeName"]);   //這樣寫可以指定輸出“EmployeeName列”
                    }
                    Console.WriteLine();
                }
            }
            Console.WriteLine();

            //方法2 循環周遊輸出dt
            foreach (DataTable dt in myDS.Tables)//周遊DataTable
                foreach (DataRow row in dt.Rows)//周遊每個表的 行
                    foreach (DataColumn col in dt.Columns)
                        Console.WriteLine("表名:{0}\t 列名:{1}\t 内容:{2}", dt.TableName, col.ColumnName, row[col]);//周遊輸出每一行的,每一列
         
            //方法n:對以上可以結合實際情況靈活修改(靈活搭配使用for和foreach,以及單元格的内容)
            //單元格的内容有:myDS.Tables[t].Rows[r]["EmployeeName"],myDS.Tables[t].Rows[r][i], row[col]等形式。

            Console.ReadKey();
        }

        static DataSet BuildDataSet()
        {
            DataSet ds = new DataSet("員工資料集");
            DataTable dt = BuildDataTable();
            ds.Tables.Add(dt);

            DataTable dt1 = BuildDataTable();
            ds.Tables.Add(dt1);

            return ds;
        }

        static DataTable BuildDataTable()
        {
	        DataTable table=new DataTable();
	        //建立列,員工表:編号,姓名,出生日期,工資,部門編号
	        //編号列
	        DataColumn idColumn=new DataColumn();
	        idColumn.ColumnName="EmployeeID";
	        idColumn.DataType=typeof(string);
	        idColumn.AllowDBNull=false;
	        table.Columns.Add(idColumn);

	        //姓名列
	        DataColumn nameColumn=new DataColumn();	
	        nameColumn.ColumnName="EmployeeName";
	        nameColumn.DataType=typeof(string);
	        nameColumn.AllowDBNull=false;
	        table.Columns.Add(nameColumn);

	        //出生日期列
	        DataColumn dateColumn=new DataColumn();
            dateColumn.ColumnName = "DateOfBirth";
            dateColumn.DataType = typeof(DateTime);
            dateColumn.AllowDBNull = true;//本句可省,預設可以為空
            table.Columns.Add(dateColumn);

	        //工資列
	        DataColumn salaryColumn=new DataColumn();
	        salaryColumn.ColumnName="Salary";
	        salaryColumn.DataType=typeof(double);
	                                        //預設可以為空
	        table.Columns.Add(salaryColumn);

	        //部門編号
	        DataColumn departmentColumn=new DataColumn();
	        departmentColumn.ColumnName="DepartmentID";
	        departmentColumn.DataType=typeof(int);
	                                        //預設可以為空
	        table.Columns.Add(departmentColumn);

            //在此設定主鍵
            table.PrimaryKey = new DataColumn[] { idColumn };//這裡可以設定多個主鍵,放在idColumn後面即可

            //事件
            table.RowChanging += new DataRowChangeEventHandler(table_RowChanging);
            table.RowChanged += new DataRowChangeEventHandler(table_RowChanged);
            table.RowDeleting += new DataRowChangeEventHandler(table_RowDeleting);
            table.RowDeleted += new DataRowChangeEventHandler(table_RowDeleted);


	        DataRow row=table.NewRow();
	        row["EmployeeID"]="E0001";
            row["EmployeeName"] = "李娜";
	        row["DateOfBirth"]=DateTime.Now.AddYears(-30);
	        row["Salary"]=6000;
	        row["DepartmentID"]=1;
            Console.WriteLine("将要添加一行資料");
	        table.Rows.Add(row);
            Console.WriteLine("已經添加了一行資料");

            Console.WriteLine("将要删除一行資料");
            table.Rows.RemoveAt(0);//删除第一行資料
            Console.WriteLine("已經删除一行資料");

	        row=table.NewRow();
	        row["EmployeeID"]="E0002";
	        row["EmployeeName"]="Jum";
	        row["DateOfBirth"]=DateTime.Now.AddYears(-20);
	        row["Salary"]=60000;
	        row["DepartmentID"]=3;
	        table.Rows.Add(row);

	        row=table.NewRow();
	        row["EmployeeID"]="E0006";
	        row["EmployeeName"]="SP";
	        row["DateOfBirth"]=DateTime.Now.AddYears(-21);
	        row["Salary"]=7000;
	        row["DepartmentID"]=6;
	        table.Rows.Add(row);
            Console.WriteLine();
	        return table;

        }

        static void table_RowDeleted(object sender, DataRowChangeEventArgs e)
        {
            Console.WriteLine("RowDeleted事件");
        }

        static void table_RowDeleting(object sender, DataRowChangeEventArgs e)
        {
            Console.WriteLine("RowDeleting事件");
        }

        static void table_RowChanged(object sender, DataRowChangeEventArgs e)
        {
            Console.WriteLine("RowChanged事件");
        }

        static void table_RowChanging(object sender, DataRowChangeEventArgs e)
        {
            Console.WriteLine("RowChanging事件");
        }
    }
}
           

效果:

DataSet與DataTable簡介

其中,可以添加斷點,并将光标放在myDS上,會出現一個放大鏡的圖示,點選可以以可視化工具檢視,如下兩圖:

DataSet與DataTable簡介
DataSet與DataTable簡介

完!