Most popular

วันศุกร์ที่ 22 กรกฎาคม พ.ศ. 2554

การ Filter ข้อมูลในระดับ DataTable

การ Filter หรือการกรองข้อมูล ส่วนใหญ่แล้วจะสามารถทำได้ง่ายๆภายใน BindingSource แต่ในบางครั้งก็ต้องการใช้งาน Filter ในระดับที่เป็น DataTable เพื่อลดภาระของ Server และเพิ่มความเร็วในการใช้งานข้อมูล รวมถึงอาจนำไปประยุคใช้กับการแสดงรายงาน (Report) ได้อีกด้วย

ผู้เขียนจะแสดงตัวอย่างการเรียกข้อมูลพนักงานขึ้นมาแสดง โดยให้มีการกรองข้อมูลในระดับของ DataTable เลย

สร้าง Project เป็น Windows Forms Application และในฟอร์มวาง Control DataGridView เพื่อใช้แสดงข้อมูล

DataGridView บนฟอร์ม
คำสั่งในการดึงข้อมูลขึ้นมาแสดง ผู้เขียนใส่ไว้ใน Constructor ของฟอร์ม


public partial class Form1 : Form
    {
        //ประกาศ DataSet เป็น member ของคลาส
        private DataSet empDS;


        public Form1()
        {
            InitializeComponent();


            //ดึงข้อมูล EMPLOYEE ผ่าน SqlConnection 
            using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.ICORD2ConnectionString.ToString()))
            {
                this.empDS=new DataSet();
                SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM EMPLOYEE", conn);
                conn.Open();
                adap.Fill(this.empDS, "EMPLOYEE");


               //แสดงข้อมูลทั้งหมดผ่าน DataGridView
               this.dataGridView1.DataSource = new BindingSource(this.empDS, "EMPLOYEE");
            }
        }
    }


ข้อมูลที่ได้คือข้อมูลทั้งหมดของพนักงาน

ภายใน DataGridView แสดงข้อมูลทั้งหมด
ผู้เขียนปรับปรุงเพิ่มเติม คำสั่งให้สามารถกรองข้อมูลได้โดย DataTable


public partial class Form1 : Form
    {
        //ประกาศ DataSet เป็น member ของคลาส
        private DataSet empDS;


        public Form1()
        {
            InitializeComponent();


            //ดึงข้อมูล EMPLOYEE ผ่าน SqlConnection 
            using (SqlConnection conn = new SqlConnection(Properties.Settings.Default.ICORD2ConnectionString.ToString()))
            {
                this.empDS=new DataSet();
                SqlDataAdapter adap = new SqlDataAdapter("SELECT * FROM EMPLOYEE", conn);
                conn.Open();
                adap.Fill(this.empDS, "EMPLOYEE");


                //ตรวจสอบว่า DataSet มีค่าหรือไม่
                if (this.empDS != null)
                {
                    //ดึง DataTable ออกมาใช้งาน
                    DataTable tb = this.empDS.Tables["EMPLOYEE"];
                    //ใช้ method Select ของ DataTable เพื่อกรองข้อมูลเฉพาะรหัสพนักงาน 1447
                    //จะได้ค่ากลับมาเป็นชุดของ DataRow Array
                    DataRow[] dr = tb.Select("(EMP_COD = '1447')");


                    //ทำการล้าง DataTable ของ DataSet เดิมออก
                    this.empDS.Tables.Clear();


                    //ประกาศ DataTable ขึ้นมาใช้งานใหม่ โดยให้ลอกโครงสร้างจาก DataTable EMPLOYEE เดิม
                    DataTable tb2 = tb.Clone();
                    //ลูปใส่ DaraRow ทั้งหมดที่กรองได้
                    foreach (DataRow row in dr)
                    {
                        tb2.ImportRow(row);
                    }


                    //เพิ่ม DataTable ใหม่ที่กรองข้อมูลแล้ว เข้าไปที่ DataSet ตัวเดิม
                    this.empDS.Tables.Add(tb2);


                    //แสดงข้อมูลทั้งหมดผ่าน DataGridView
                    this.dataGridView1.DataSource = new BindingSource(this.empDS, "EMPLOYEE");
                }
            }
        }
    }


ผลของข้อมูลที่ได้จะเป็นข้อมูลที่ถูกกรองแล้ว

กรองข้อมูลรหัส 1447 พบเพียง Row เดียว
ประโยชน์จากการกรองข้อมูลของ DataTable คือ ในบางกรณีเราอาจจะต้องการกลุ่มข้อมูลของ DataTable หลายๆกลุ่มเพื่อนำไปใช้งานในแต่ละที่ จะทำให้ไม่ต้องเรียกดึงข้อมูลมาใหม่ ทำให้การทำงานของโปรแกรมฝั่ง Client รวดเร็วขึ้น ในขณะเดียวกันก็ไม่ต้องมีภาระการเรียกข้อมูลเดิมซ้ำๆ ไปที่ Server ด้วย

ไม่มีความคิดเห็น:

แสดงความคิดเห็น