24/05/2018, 19:30

Đối tượng Dataset và DataTable-1

Là thành phần chính của kiến trúc không kết nối cơ sở dữ liệu, được dùng để nắm giữ dữ liệu của mọi cơ sở dữ liệu và cho phép thay đổi dữ liệu bên trong đối tượng này để sau đó cập nhật trở lại cơ sở dữ liệu nguồn bằng phương thức Update của đối tượng ...

Là thành phần chính của kiến trúc không kết nối cơ sở dữ liệu, được dùng để nắm giữ dữ liệu của mọi  cơ sở dữ liệu và cho phép thay đổi dữ liệu bên trong đối tượng này để sau đó cập nhật trở lại cơ sở dữ liệu nguồn bằng phương thức Update của đối tượng DataAdapter

Khởi tạo

DataSet dataset = new DataSet();

            DataSet dataset = new DataSet("Mydataset");

Thuộc tính Tables, dataset được dùng để chứa danh sách các đối tượng DataTable

Ví dụ:

  private void button1_Click(object sender, EventArgs e)

        {

            string strQuery = "select * from tblEmployees";

            DataSet dataSet = new DataSet("Employees");

            try

            {

                SqlDataAdapter sqlDataAdapter = new

                    SqlDataAdapter(strQuery, Connection.sqlConnection);

                sqlDataAdapter.Fill(dataSet);

               

                sqlDataAdapter.Dispose();

            }

            catch (Exception ex)

            {

                MessageBox.Show("Error: " + ex.Message);

            }

            this.dataGridView1.DataSource = dataSet.Tables[0];

 

            //lay ve ten cua doi tuong dataset

            label1.Text ="DataSetName: " + dataSet.DataSetName ;

        }

        private void button2_Click(object sender, EventArgs e)

        {

 

//khai bao phat bieu sql 1

            string strQuery = "select * from tblEmployees";

            DataSet dataSet = new DataSet("Employees");

            try

            {

                SqlDataAdapter sqlDataAdapter = new

                    SqlDataAdapter(strQuery, Connection.sqlConnection);

                sqlDataAdapter.Fill(dataSet);

 

//khai bao phat bieu sql 2

                strQuery = "select * from tblContracts";

                sqlDataAdapter = new

                    SqlDataAdapter(strQuery, Connection.sqlConnection);

                DataTable dataTable = new DataTable();

                sqlDataAdapter.Fill(dataTable);

                dataSet.Tables.Add(dataTable);              

 

                sqlDataAdapter.Dispose();

                string dataTableName="";

                foreach(DataTable dt in dataSet.Tables)

                {

                    dataTableName += dt.TableName + " ";

                }

                label1.Text = "Number of tables: " + dataTableName ;

            }

            catch (Exception ex)

            {

                MessageBox.Show("Error: " + ex.Message);

            }

           

            this.dataGridView1.DataSource = dataSet.Tables[1] ;

            

        }

Phuong thuc Add, Remove

DataSet dataset=new DataSet();

DataTable datatable=new DataTable(“datatablename”);

dataset.Tables.Add(datatable);

dataset.Tables.Remove(datatable);

xoa voi datatable duoc dat tên

dataset.Tables.Remove(datatablename);

dataset.Tables.RemoveAt(0);

phương thức Clear loại bỏ tất cả các đối tượng trong DataTable

dataset.Tables.Clear();

 

De dem so dong du lieu trong bang ta co the thuc hien

int sodong=dataset.Tables[0].Rows.Count;

 

2. Đối tượng DataTable

  private void button1_Click(object sender, EventArgs e)

        {

            string strQuery = "select top 10 * from tblEmployees";

//khoi tao doi tuong DataTable

            dataTable = new DataTable("Employees");

            try

            {

                SqlDataAdapter sqlDataAdapter = new

                    SqlDataAdapter(strQuery, Connection.sqlConnection);

//dien du lieu vao datatable

                sqlDataAdapter.Fill(dataTable);

               

 

                sqlDataAdapter.Dispose();

            }

            catch (Exception ex)

            {

                MessageBox.Show("Error: " + ex.Message);

            }

//gan du lieu va dataGrid voi thuoc tinh DataSource

            this.dataGridView1.DataSource = dataTable;

            label1.Text= dataTable.TableName ;

        }

 

 

// thuoc tinh DataRow tra ve cac mau tin dang chua trong doi tuong DataTable

        private void button2_Click(object sender, EventArgs e)

        {

            if (dataTable != null)

            {

                string name = "";

                foreach (DataRow dataRow in dataTable.Rows)

                {

                    name += Convert.ToString(dataRow[1]) + " ";

                }

                label1.Text = name;

            }

        }

 

//thuoc tinh Columns tra ve tap doi tuong DataColumn bao gom danh sach cot du lieu cua bang chua trong doi tuong DataTable

        private void button3_Click(object sender, EventArgs e)

        {

            if (dataTable != null)

            {

                string name = "";

                foreach (DataColumn dataColumn in dataTable.Columns)

                {

                    name += Convert.ToString(dataColumn.ColumnName) + " ";

                }

                label1.Text = name;

            }

        }

 Ví dụ chúng ta sẽ ứng dụng 3 dối tượng trên vào việc, cập nhật và hiển thị dữ liệu cho bảng sản phẩm

Bước 1: tạo bảng cơ sở dữ liệu

Ví dụ chúng ta có một bảng dữ liệu tblIntrodure gồm các trường:

pkIntrodureID              (int)

sTitle                           (nvarchar(300)

sSummary                    (nText)

iContent                      (nText)

iPosition                      (int)

Bước 2: tạo thủ tục StoreProcedure

ta tạo ra 3 thủ tục sql cho bảng giới thiệu của ta như sau

spIntrodure_insert  - Thủ tục thêm mới dữ liệu

Create PROCEDURE spIntrodure_insert

      @sTitle nvarchar(100),

      @sSummary ntext,

      @sContent ntext,

      @iPosition int

AS

      insert into tblIntrodure(sTitle, sSummary, sContent, iPosition)

            values(@sTitle, @sSummary, @sContent, @iPosition)    

      GO

spIntrodure_edit  - Thủ tục sửa dữ liệu

Create PROCEDURE spIntrodure_edit

      @pkIntrodureID int,

      @sTitle nvarchar(100),

      @sSummary ntext,

      @sContent ntext,

      @iPosition int

AS

      update tblIntrodure set

            sTitle=@sTitle, sSummary=@sSummary, sContent=@sContent, iPosition=@iPosition

      where pkIntrodureID=@pkIntrodureID

      GO

spIntrodure_deletebyID - Thủ tục xoá dữ liệu

Create PROCEDURE spIntrodure_deletebyID

      @pkIntrodureID int

AS

      delete from tblIntrodure where pkIntrodureID=@pkIntrodureID

      GO

Chú ý: trên là cách tạo 3 thủ tục theo cú pháp của MSSQL nếu bạn tạo thủ tục SQL trong VS thì từ khoá Create sẽ chuyển thành Alter và GO chuyển thành Return

 

Bước 3: Tạo các lớp(nằm trong thư mục App_Code)

IntrodureInfo.cs

using System;

 

namespace iTechPro.Modules.Introdure

{

    public class IntrodureInfo

    {

 

        int _pkIntrodureID;

        public int pkIntrodureID

        {

            get { return _pkIntrodureID; }

            set { _pkIntrodureID = value; }

        }

 

        string _sTitle;

        public string sTitle

        {

            get { return _sTitle; }

            set { _sTitle = value; }

        }

 

        string _sImage;

        public string sImage

        {

            get { return _sImage; }

            set { _sImage = value; }

        }

 

        string _sSumary;

        public string sSumary

        {

            get { return _sSumary; }

            set { _sSumary = value; }

        }

 

        string _sComment;

        public string sComment

        {

            get { return _sComment; }

            set { _sComment = value; }

        }

 

        int _iPosition;

        public int iPosition

        {

            get { return _iPosition; }

            set { _iPosition = value; }

        }

    }

}

 

IntrodureDB.cs (chứa tất cả phương thức xử lý và lấy dữ liệu cho bảng tblIntrodure)

using System;

using System.Data;

using System.Data.SqlClient;

 

using Website.Library;

 

namespace Website.Modules.Introdure

{

    public class IntrodureDB : ExcuteDataHelper

    {

        

        public IntrodureDB()

        {

            //

            // TODO: Add constructor logic here

            //

        }

 

        public static void Delete(string _pkIntrodureID)

        {

            string[] parameters = new string[] { "@pkIntrodureID"};

            string[] values = new string[] { _pkIntrodureID};

            executeData("spIntrodure_deletebyID", parameters, values);

 

        }

 

        public static void Insert(IntrodureInfo _introdure)

        {

            string[] parameters = new string[7] { "@sTitle", "@sImage", "@sSumary", "@sComment", "@sPage", "@sLang", "@iPosition" };

            string[] values = new string[7] { _introdure.sTitle, _introdure.sImage, _introdure.sSumary, _introdure.sComment, _introdure.sPage, _introdure.sLang, _introdure.iPosition.ToString() };

            executeData("spIntrodure_insert", parameters, values);

        }

 

        public static void Update(IntrodureInfo _introdure)

        {

            string[] parameters = new string[7] { "@pkIntrodureID" ,"@sTitle", "@sImage", "@sSumary", "@sComment", "@sPage", "@iPosition" };

            string[] values = new string[7] { _introdure.pkIntrodureID.ToString(), _introdure.sTitle, _introdure.sImage, _introdure.sSumary, _introdure.sComment, _introdure.sPage, _introdure.iPosition.ToString() };

            executeData("spIntrodure_edit", parameters, values);

        }

 

        public static void UpdateIndex(string _pkIntrodureID, string _giatri)

        {

            string ssql = "update tblIntrodure set iPosition=" + _giatri + " where pkIntrodureID=" + _pkIntrodureID;

            executeData(ssql);

        }

 

        public static IntrodureInfo Getinfo(string _pkIntrodureID)

        {

            DataTable mydata = iTechProData.FillDatatable("spIntrodure_selectbyID", "@pkIntrodureID", _pkIntrodureID);

            IntrodureInfo _introdure = new IntrodureInfo(); ;

            _introdure.sTitle = mydata.Rows[0]["sTitle"].ToString();

            _introdure.sImage = mydata.Rows[0]["sImage"].ToString();

            _introdure.sSumary = mydata.Rows[0]["sSumary"].ToString();

            _introdure.sComment = mydata.Rows[0]["sComment"].ToString();

            _introdure.sPage = mydata.Rows[0]["sPage"].ToString();

            _introdure.sLang = mydata.Rows[0]["sLang"].ToString();

            _introdure.iPosition = int.Parse(mydata.Rows[0]["iPosition"].ToString());

            return _introdure;

        }

    }

}

Tại lớp IntrodureDB này chúng ta sẽ kế thừa các phương thức thực thi dữ liệu từ lớp ExcuteDataHelper.cs

Lớp ExcuteDataHelper.cs

using System;

using System.Data;

using System.Data.SqlClient;

 

 

namespace Website.Library

{

    public class ExcuteDataHelper : iTechProData

    {

        //phuong thuc thuc thi du lieu(them moi, chinh sua, xoa) khi dua vao mot tham so sql

        #region executeData(string sql)"Thực thi dữ liệu"

        public static void executeData(string sql)

        {

            opendata();

            sqlcom = new SqlCommand(sql, sqlconn);

            try

            {

                sqlcom.ExecuteNonQuery();

                closedata();

            }

            catch (Exception exp)

            {

                closedata();

                HttpContext.Current.Response.Write(sql + "<br/>");

                HttpContext.Current.Response.Write("Có lỗi trong quá trình thực thi " + exp.ToString());

            }

        }

        #endregion

 

        //phuong thuc thuc thi du lieu voi tham so dua vao

        #region executeData(string store, string[] Parameter, string[] Values)

        public static void executeData(string store, string[] Parameter, string[] Values)

        {

            opendata();

            sqlcom = new SqlCommand();

            sqlcom.CommandText = store;

            sqlcom.Connection = sqlconn;

            sqlcom.CommandType = CommandType.StoredProcedure;

            for (int i = 0; i < Parameter.Length; i++)

            {

                sqlcom.Parameters.AddWithValue(Parameter[i], Values[i]);

            }

            try

            {

                sqlcom.ExecuteNonQuery();

                closedata();

            }

            catch (DataException exp)

            {

                sqlconn.Close();

                HttpContext.Current.Response.Write(exp.ToString());

            }

        }

        #endregion

    }

}

Trong lớp này chúng ta có 2 phương thức thực thi dữ liệu có thể là thêm mới, chỉnh sửa hay xoá dữ liệu void executeData(string sql) cho phép bạn thực thi dữ liệu với một chuỗi sql đưa vào còn executeData(string store, string[] Parameter, string[] Values)  sẽ thực thi dữ liệu với hàm thủ tục từ SQL truyền vào với hai mảng giá trị và tham số và lơp này này thừa kế từ lớp dẫn xuất iTechProData.cs

Lớp iTechProData.cs

using System;

using System.Data;

using System.Configuration;

using System.Data.SqlClient;

 

 

namespace Website.Library

{

    public class WebsiteData

    {

        #region khai bao bien

 

        protected string ssql;

        protected static SqlConnection sqlconn;

        protected static SqlCommand sqlcom;

        protected static SqlDataAdapter sqladapter;

        protected static DataSet mydata;

        protected static SqlDataReader sqlreader;

 

        #endregion

 

        //phuong thuc mo du lieu

        #region opendata() "Mở dữ liệu"

        public static void opendata()

        {

            //đọc chuỗi kết nối từ trong file web.config

            System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();

            string driver = (string)settingsReader.GetValue("hcubiudata", typeof(String));

 

            try

            {

                sqlconn = new SqlConnection(driver);

                if (sqlconn.State != ConnectionState.Open)

                {

                    sqlconn.Open();

                }

            }

            catch (Exception exp)

            {

                HttpContext.Current.Response.Write("Lỗi mở dữ liệu" + exp.ToString());

            }

        }

        #endregion

 

        //phuong thuc dong du lieu

        #region closedata() "Đóng dữ liệu"

        public static void closedata()

        {

            if (sqlconn.State != ConnectionState.Closed)

            {

                sqlconn.Close();

                sqlconn.Dispose();

            }

        }

        #endregion

     

        // điền dữ liệu vào DataTable từ một thủ tục trong Database

  public static DataTable FillDatatable(string store,string _thamso, string _giatri)

        {

            opendata();

            DataTable datatable = new DataTable();

            sqlcom = new SqlCommand();

            sqlcom.CommandText = store;

            sqlcom.Connection = sqlconn;

            sqlcom.Parameters.AddWithValue(_thamso, _giatri);

            sqlcom.CommandType = CommandType.StoredProcedure;

            try

            {

                sqladapter = new SqlDataAdapter(sqlcom);

                sqladapter.Fill(datatable);

                sqladapter.Dispose();

            }

            finally

            {

                closedata();

            }

            return datatable;

        }

    }

 }

Trong lớp trên bạn thấy có 2 đối tượng data mới đó là DataAdapter và DataTable chúng ta sẽ học kỹ hơn trong phần sau trong ví dụ này các bạn chỉ cần hiểu qua là DataAdapter là bộ đọc dữ liệu từ nguồn dữ liệu, và DataTable là đối tượng lưu trữ dữ liệu không kết nối, nó như một bảng tạm để chứa dữ liệu và nó ko cần biết dữ liệu đó từ nguồn nào.

0