Đăng ký vps giá rẻ, tên miềndomain. Việc kiểm tra và mua tên miền giá rẻ, domain giá rẻ, hosting giá rẻ, máy chủ ảo giá rẻserver giá rẻ chỉ với 2 bước đơn giản. Giúp bạn tiên phong trong kinh doanh Online

Asp.net
 9ecva.com - 9e Chu Van An Forever : Asp.net
Tiêu đề Chủ đề: Quan hệ C# và Database :: SqlDataReader & Dataset Trả lời bài viếtGửi bài viết mới
Tác giả
Nội dung << Chủ đề trước | Chủ đề kế tiếp >>
DUCVINH83
Administrator
Administrator
Avatar
Không ngừng học hỏi !

Ngày gia nhập: 01/11/2005
Giới tính:
Đến từ: Vietnam
Trạng thái:
Bài viết: 365
Tiền: 738$
Địa chỉ e-mail: Gửi mail
Yahoo! IM: Yahoo! IM
Sinh nhật: 17/02/1983
Cảnh cáo: (0%)
Minus 1 warningCurrent warnlevel: 0%Add 1 warning
Ngày gửi: 29/05/2012 lúc 4:55 chiều | Đã khóa IP Trích dẫn DUCVINH83

Qua hai bài viết trước của loạt bài về quan hệ giữa C# và Database đã giới thiệu về cách kết nối C# với SQL server và SqlCommand. Trong bài tiếp theo này sẽ tập trung trình bày về DataReaders và Dataset, ưu và khuyết điềm của chúng.

1.Data Readers

Khi bạn kết nối tới cơ sở dữ liệu và thi hành các query, dữ liệu thu nhận được cần phải có một ai đó xử lý, chứ không lẽ kết nối đến SQL thêm, xóa, sửa.. xong rồi lại không biết được kết quả đúng hay sai, có thực hiện được hay không, ít ra chúng ta phải xuất kết quả ra để theo dõi đúng không. Như vậy cần phải có một đối tượng thu nhận các thông tin, đó chính là DataReaders

Trong bài trước mình có trình bày 1 ví dụ về có liên quan đến DataReaders nội dung ví dụ như sau: 

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

public partial class Database : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string strHTML = "";
        strHTML+="<table border=\"0\" width=\"550\" cellspacing=\"1\" cellpadding=\"0\" bgcolor=\"#999966\" id=\"table2\">";
        strHTML+="	<tr>";
        strHTML += "		<td bgcolor=\"#CC3300\" align=\"center\"><font color=\"#FFFFFF\">CustomerID</font></td>";
        strHTML += "		<td bgcolor=\"#CC3300\" align=\"center\"><font color=\"#FFFFFF\">CompanyName</font></td>";
        strHTML += "		<td bgcolor=\"#CC3300\" align=\"center\"><font color=\"#FFFFFF\">ContactName</font></td>";
        strHTML += "		<td bgcolor=\"#CC3300\" align=\"center\"><font color=\"#FFFFFF\">Country</font></td>";
        strHTML+="	</tr>";
        // Khai báo chuỗi kết nối
        string connectString = @"Server =.\SQL2005;Initial Catalog=Northwind;User ID=sa;Password=******";
        // Khai báo câu truy vấn
        string sql = @"SELECT TOP 10 CustomerID, CompanyName, ContactName, Country FROM Customers ";
        // Tạo một connection tới máy chủ
        SqlConnection conn = new SqlConnection(connectString);
        try
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand(sql, conn);
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                strHTML += "	<tr>";
                strHTML += "		<td bgcolor=\"#FFFFFF\">" + reader[0]+ "</td>";
                strHTML += "		<td bgcolor=\"#FFFFFF\">" + reader[1] + "</td>";
                strHTML += "		<td bgcolor=\"#FFFFFF\">" + reader[2] + "</td>";
                strHTML += "		<td bgcolor=\"#FFFFFF\">" + reader[3] + "</td>";
                strHTML += "	</tr>";
            }
            reader.Close();//Đóng SqlDataReader
        }

        catch (SqlException ex)
        {
            Console.WriteLine("Error: " + ex);
        }
        finally
        {
            conn.Close();
        }
        strHTML += "</table>";
        Literal1.Text = strHTML;
    }
}

Kết quả thu được là các thông tin của trong câu lệnh 
 SELECT TOP 10 CustomerID, CompanyName, ContactName, Country FROM Customers  
 Với câu lệnh truy vấn trên nó sẽ trả về 10 bản ghi trong bảng Customers bạn có thể thấy muốn lấy dữ liệu là cột  CustomerID bạn dùng reader[0];  0 ở đây là vị trí Index theo thứ tự (Index được bắt đầu từ 0) trong thứ tự các cột của câu truy vấn, Trong ví dụ của bài trước bạn thấy muốn lấy dữ liệu của cột CustomerID  Mình dùng reader[0].GetValue(0) Ngoài cách dùng index để hiển thị dữ liệu bạn cũng có thể dùng trực tiếp tên cột như sau: reader["CustomerID"]. Tới đây chắc các bạn cũng đã nắm được vị trí index trong reader rồi nhỉ. Bạn sẽ thấy rằng hai cách hiển thị sẽ cho kết qua như nhau nhưng theo mình bạn nên dùng trực tiếp tên cột vì đôi khi trong lập trình bạn thay đổi thứ tự hiển thị trong câu truy vấn SQL.

 Lưu ý:
- Thông thường data reader mà phải xử lý thông qua phương thức ‘ExecuteReader’ của một đối tượng command.
- Một DataReader có thể gọi là một stream đã kết nối tới cơ sở dữ liệu đọc dữ liệu hiệu quả, theo một chiều và thu nhận dữ liệu theo từng dòng (row). Quy tắc chung khi sử dụng data reader dơn giản là chỉ thu nhận và trình bày kết quả thu được. Đây là điểm khác biệt lớn nhất giữa dataReader và DataSet.

2.DataSet và DataAdapter


2.1.Dataset

Có thể so sánh DataSet như một file Excel bao gồm nhiều bảng tính (Worksheet), trong mỗi bảng tính này có nhiều hàng, nhiều cột, Với DataSet nó bao gồm nhiều DataTable, trong mỗi DataTable này có nhiều hàng (DataRow), nhiều cột (DataColumn)

Trong lúc làm việc ta không thể nào kết nối liên tục đến DataSource việc làm này rất tốn tài nguyên của máy, chính vì lẽ đó mà .Net cung cấp cho bạn DataSet mục đích là lưu trữ dữ liệu và chỉnh sửa cục bộ. Tức là toàn bộ thông tin từ DataSource vẫn còn được lưu trữ trên DataSet khi ta đã ngắt kết nối. Bạn hoàn toàn có thể thao tác trên DataSet như xem, chỉnh sửa sau đó update dữ liệu lại cho DataSource. Nếu khi bạn không update thì việc thao tác trên Dataset sẽ không ảnh hưởng gì đến DataSource cả!
DataSet được lưu trữ dưới dạng tập hợp các Tables và bạn cần xử lý thông qua các lớp của Tables là DataRow, DataColumn.
Có nhiều cách xử lý DataSet nhưng nổi bậc hơn hẳn là 2 cách sử dụng:
- Sử dụng DataAdapter
- Sử dụng XML (cái này sẽ được trình bày trong bài viết sau)

2.2. DataAdapter:

DataAdapter được hiểu nôm na, như là cầu nối và  truyền tải dữ liệu giữa dataSet và dataSource. Mối quan hệ này được biểu diễn như sau: DataSource ~ DataAdapter ~ DataSet

Bạn xem ví dụ sau:
Trong trang aspx bạn cần tạo 1 gridview để hiển thị dữ liệu: 

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="DataSetDemo.aspx.cs" Inherits="DataSetDemo" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> ;
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
     <title>hmweb.com.vn</title>
</head>
< body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="GridView1" runat="server" BackColor="White" BorderColor="#CCCCCC"
            BorderStyle="None" BorderWidth="1px" CellPadding="3">
            <RowStyle ForeColor="#000066" />
            <FooterStyle BackColor="White" ForeColor="#000066" />
            <PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" />
            <SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" />
            <HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" />
        </asp:GridView>
    
    </div>
    </form>
</body>
</html>

Trong CodeFile (Code behind) bạn viết như sau: 

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class DataSetDemo : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dtb = new DataTable();
        dtb = DemoDataSet();
        GridView1.DataSource = dtb;
        GridView1.DataBind();
    }
    private DataTable DemoDataSet()
    {
        DataTable dtbTmp = new DataTable();
        // Tạo connection string
        string connString = @"Server =.\SQL2005;Initial Catalog=Northwind;User ID=sa;Password=******";
        // Tạo SQL query
        string sql = @"SELECT TOP 8 CustomerID, CompanyName, ContactName, Country FROM Customers ";
        // Tạo connection
        SqlConnection conn = new SqlConnection(connString);
        try
        {
            // Mở kết nối
            conn.Open();
            // Tạo một Adapter
            SqlDataAdapter da = new SqlDataAdapter(sql, conn);
            // Tạo DataSet
            DataSet ds = new DataSet();
            // Đổ dữ liệu DataSet
            da.Fill(ds, "Customers");
            // Tạo DataTable từ dataSet
            dtbTmp = ds.Tables[0];
        }
        catch (Exception e)
        {
            // Bắt lỗi
            Console.WriteLine(e.Message);
        }
        finally
        {
            // Đóng kết nối
            conn.Close();
        }
        return dtbTmp;
    }
}

Trong ví dụ trên mình dùng chỉ số index (ds.Tables[0]) để bạn hiểu rằng DataSet là một tập hợp nhiều DataTable. Khi bạn dùng da.Fill(ds, "Customers") Như vậy ngoài cách sử dụng index bạn cũng có thể sử dụng tên đã khai báo như sau: dtbTmp = ds.Tables["Customers"];

(Bạn có thể nhấn
vào đây để down mã nguồn ví dụ trên để tham khảo)

Như vậy kết quả không khác mấy khi dùng SqlDataReader, nên nhớ rằng khi bạn thực hiện với mục đích xuất thông tin ra thôi thì nên dùng SqlDataReader để thay thế cho DataSet, vì sẽ tiết kiệm được thời gian và tài nguyên. Ví dụ trên nhằm mình họa một trong những tính năng của DataSet. Như vậy DataSet có điểm gì nổi bậc hơn SqlDataReader, điểm nổi bậc ở đây chính là khả năng tùy biến cao, có thể chỉnh sửa CSDL và lưu lại vào DataSource.
Bạn hãy xem ví dụ sau: 

private void DataSetInsertAndView()
{
    // Tạo connection strin
    string connString = @"Server =.\SQL2005;Initial Catalog=Northwind;User ID=sa;Password=******";
    // Tạo SQL query        
    string ins = @"INSERT INTO employees (firstname, lastname, titleofcourtesy, city, country) VALUES
                       (@firstname, @lastname, @titleofcourtesy, @city, @country) ";
    // Tạo connection
    SqlConnection conn = new SqlConnection(connString);
    try
    {
        // Tạo Adapter
        SqlDataAdapter da = new SqlDataAdapter(qry, conn);
        // Tạo và lấp đầy DataSet
        DataSet ds = new DataSet();
        da.Fill(ds, "employees");
        // Lấy thông tin Table vào DataTable
        DataTable dt = ds.Tables["employees"];
        // Tạo thêm row mới
        DataRow newRow = dt.NewRow();
        newRow["firstname"] = "Bui";
        newRow["lastname"] = "Hung";
        newRow["titleofcourtesy"] = "AND";
        newRow["city"] = "HaNoi";
        newRow["country"] = "Viet Nam";
        dt.Rows.Add(newRow);
        // Hiển thị thông tin các rows trong DataSet sau khi thêm vào
        foreach (DataRow row in dt.Rows)
        {
            Literal1.Text = row["firstname"].ToString().PadRight(15) + "|";
            Literal1.Text += row["lastname"].ToString().PadLeft(15) + "|";
            Literal1.Text += row["city"];
        }
        // Làm việc với Insert
        SqlCommand cmd = new SqlCommand(ins, conn);
        cmd.Parameters.Add("@firstname", SqlDbType.NVarChar, 10, "firstname");
        cmd.Parameters.Add("@lastname", SqlDbType.NVarChar, 20, "lastname");
        cmd.Parameters.Add("@titleofcourtesy", SqlDbType.NVarChar, 25, "titleofcourtesy");
        cmd.Parameters.Add("@city", SqlDbType.NVarChar, 15, "city");
        cmd.Parameters.Add("@country", SqlDbType.NVarChar, 15, "country");
        // Tiến hành insert vào database Source
        da.InsertCommand = cmd;
        da.Update(ds, "employees");
    }
    catch (Exception e)
    {
        // Bắt lỗi
        Console.WriteLine(e.Message);
    }
    finally
    {
        // Đóng kết nối
        conn.Close();
    }
}

Qua ví dụ trên bạn có thể nhận thấy DataSet khá linh hoạt, thông qua việc đổ dữ liệu từ dataSet đến các Tables, chúng ta có thể xem thông tin, chỉnh sửa thông tin và khi chỉnh sửa xong có thể update cho DataSource. Nếu các bạn nào tinh ý sẽ thấy quá trình trên thêm vào thực hiện quá dài cứ lập đi lặp lại việc cmd.Parameters.Add,để giải quyết vấn để này .NET cung cấp cho ta SqlCommandBuilder
Bạn xem ví dụ sau:
 

    private void DataSetInsertAndView()
    {
        // Tạo connection string
        string connString = @"Server =.\SQL2005;Initial Catalog=Northwind;User ID=sa;Password=******";
        // Tạo SQL query        
        string ins = @"INSERT INTO employees (firstname, lastname, titleofcourtesy, city, country) VALUES
                           (@firstname, @lastname, @titleofcourtesy, @city, @country) ";
        // Tạo connection
        SqlConnection conn = new SqlConnection(connString);
        try
        {
            // Tạo Adapter
            SqlDataAdapter da = new SqlDataAdapter(qry, conn);
            // Tạo commandbuider
            SqlCommandBuilder cb = new SqlCommandBuilder(da);
            // Tạo và lấp đầy DataSet
            DataSet ds = new DataSet();
            da.Fill(ds, "employees");
            // Lấy thông tin Table vào DataTable
            DataTable dt = ds.Tables["employees"];
            // Tạo thêm row mới
            DataRow newRow = dt.NewRow();
            newRow["firstname"] = "Pi";
            newRow["lastname"] = "Pi_Pi";
            newRow["titleofcourtesy"] = "AND";
            newRow["city"] = "UITS";
            newRow["country"] = "Viet Nam";
            dt.Rows.Add(newRow);
            // Hiển thị thông tin các rows trong DataSet sau khi thêm vào
            foreach (DataRow row in dt.Rows)
            {
                Literal1.Text = row["firstname"].ToString().PadRight(15) + "|";
                Literal1.Text += row["lastname"].ToString().PadLeft(15) + "|";
                Literal1.Text += row["city"];
            }
            //Nhờ sử dụng SqlCommandBuilder mà ta update rất nhanh
            da.Update(ds, "employees");
        }
        catch (Exception e)
        {
            // Bắt lỗi
            Console.WriteLine(e.Message);
        }
        finally
        {
            // Đóng kết nối
            conn.Close();
        }
    }

 // Trong hai ví dụ trên mình có tạo 1 <asp:Literal ID="Literal1" runat="server" /> để khi chạy sẽ hiển thị dữ liệu. Để chạy thử hàm trong ví dụ trên bạn chỉ cần đưa nó lên hàm Page_Load: DataSetInsertAndView();


3.Tổng kết và So sánh giữa DataSet và DataReader

3.1. DataReader:

-Ưu điểm: Thực thi nhanh, ít tốn tài nguyên hơn so với DataSet rất nhiều
-Khuyết Điểm: Tùy biến không cao, thường dùng để lấy dữ liệu và trình bày, hạn chế chỉnh sửa CSDL

3.2
. DataSet
- Ưu điểm: Tùy biến cao, có thể chỉnh sửa CSDL rất tiện lợi
-Khuyết điểm: Như đã trình bày, hơi tốn tài nguyên

Lời khuyên:
Tùy vào từng trườn hợp, từng mục đích mà ta có thể quyết định chọn cái nào, tránh lạm dụng quá khả năng một cái, phải biết kết hợp hài hòa. Thông thường khi bạn xuất CSDL viết dưới dạng XML, sau đó thao tác trên XML thì bạn nên sử dụng DataReader để phát huy sức mạnh của nó.

Hy vọng qua bài viết này bạn đã hiểu hơn về SqlDataReader & Dataset.

hmclip.net



__________________

YM: DUCVINH83
0912 822334


Lên trên Xem DUCVINH83's Thông tin cá nhân Tìm những bài viết khác của DUCVINH83 Ghé thăm DUCVINH83's Trang chủ
 

Nếu bạn muốn trả lời thì trước tiên bạn phải đăng nhập
Nếu chưa đăng ký thì bạn hãy đăng ký

  Trả lời bài viếtGửi bài viết mới
Xem trang in Xem trang in

Di chuyển nhanh
Bạn không thể tạo đề tài mới
Bạn không thể trả lời bài viết
Bạn không thể xoá bài viết bạn đã gưi
Bạn không thể sửa bài viết bạn đã gửi
Bạn không thể tạo bình chọn
Bạn không thể bình chọn



Trang này được tạo ra trong 0.1836 giây.
cheap jordans for salecheap jordans for salecheap jordans for salecheap jordans for salecheap jordans for salecheap jordans for salecheap jordans for salecheap jordans for salecheap jordans for salesac longchamp pas chergucci outlet

baomang.net  9ecva.com © 2007 - Phát triển bởi Trịnh Đức Vinh