Activex data objects net
Download
1 / 47

ActiveX Data Objects .NET - PowerPoint PPT Presentation


  • 77 Views
  • Uploaded on
  • Presentation posted in: General

ActiveX Data Objects .NET. ADO . NET. กว่าจะมาเป็น ADO . NET.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha

Download Presentation

ActiveX Data Objects .NET

An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


ActiveX Data Objects.NET

ADO.NET


กว่าจะมาเป็น ADO.NET

  • เริ่มแรกเลยนั้น ไมโครซอฟท์ต้องการพัฒนา DAO (Data Access Objects) ขึ้นมาเพื่อให้โปรแกรมเมอร์ที่เขียน Visual Basic สามารถเขียนโปรแกรมติดต่อกับฐานข้อมูล Microsoft Access (หรือที่รู้จักกันในชื่อของ Jet Engine)ได้  แต่อย่างไรก็ดีการใช้ DAO ติดต่อกับฐานข้อมูลที่ใหญ่ขึ้น (ในที่นี้หมายถึงระบบที่ใหญ่ขึ้น ไม่ใช่ปริมาณข้อมูล) เช่น SQL Server หรือ Oracle นั้นไม่เป็นที่น่าพอใจนักเนื่องจากประสิทธิภาพของ DAO ไม่ดีเท่าที่ควร  ดังนั้นไมโครซอฟท์จึงพัฒนาโปรแกรมตัวใหม่ที่เรียกว่า RDO (Remote Data Objects) ออกมาเพื่อสนองความตัองการในระดับที่สูงขึ้นของฐานข้อมูลขนาดใหญ่


กว่าจะมาเป็น ADO.NET(cont.)

  • และก็เป็นธรรมดาของการมีอะไรให้ใช้มากกว่าหนึ่งอย่าง ปัญหาที่เกิดขึ้นก็คือเราไม่สามารถพัฒนาโปรแกรมที่สามารถติดต่อกับฐานข้อมูลหลาย ๆ ประเภทได้ คือถ้าเขียนสำหรับ Access ก็ใช้ DAO แต่พอจะเอา code ส่วนนี้ไปใช้ใหม่ การแก้ไขโปรแกรมนั้นจะลำบาก เพราะโครงสร้างของ DAO กับ RDO ไม่เหมือนกันเท่าไหร่  นี่แหล่ะครับทำให้ต้องมี ADO (ActiveX Data Objects) ออกมา  คราวนี้เราสามารถใช้ ADO ตัวเดียวนี่แหล่ะติดต่อกับฐานข้อมูลประเภทไหนก็ได้ ที่มี driver รองรับ 

  • ข้อแตกต่างอีกข้อหนึ่งระหว่าง DAO, RDO กับ ADO ก็คือ  DAO และ RDO นั้นใช้ ODBC (Open Database Connectivity)  แต่ ADO นั้นใช้ OLE DB และก็ใช้ ODBC ได้ถ้าอยากจะใช้


แนะนำADO.NET

  • สำหรับคนที่ลองศึกษา ADO.Net ดูจะเห็นว่า มันมี class มาเพียบอะไรก็ไม่รู้เยอะแยะไปหมด (คำถามก็คือแล้วจะใช้อะไรดีเนี่ย) ไม่ต้องแปลกใจ เพราะ ADO.Net ได้ถูกพัฒนาขึ้นด้วยหลักของ OOP (Object-Oriented Programming) แบบเต็มที่ ดังนั้น class จะเยอะหน่อย เพราะแต่ล่ะ class มีหน้าที่เฉพาะของมันเอง  ไม่เหมือน ADO ที่ RecordSet เป็นพระเอกอยู่คนเดียว ทำได้ทุกอย่าง (อะไรที่ RecordSet ทำไม่ได้ ก็ให้โปรแกรมเมอร์นั่นแหล่ะเป็นคนทำ)


แนะนำADO.NET(cont.)

  • การติดต่อกับฐานข้อมูลด้วย ADO นั้นเป็นแบบที่เรียกว่า Connected Database ซึ่งก็หมายความว่าในขณะที่เราต้องเปิดการติดต่อกับฐานข้อมูลอยู่ตลอดเวลาที่ใช้  ถ้าโปรแกรมส่วนอื่น หรือ session อื่นต้องการใช้ฐานข้อมูลด้วย connection อันใหม่ก็จะต้องถูกสร้างขึ้นมา ส่วนนี้จะเป็นปัญหาในกรณีที่มีผู้เข้าใช้โปรแกรมมาก ๆ เพราะฐานข้อมูลอย่าง Access นั้นรองรับการใช้งานพร้อม ๆ กันได้จำกัด


แนะนำADO.NET(cont.)

  • สำหรับ ADO.Net นั้น เราสามารถติดต่อกับฐานข้อมูลได้ 2 รูปแบบหลัก ๆ ก็คือ connect กับ disconnect  การติดต่อแบบ connect โดยหลักการแล้วก็เหมือนกันกับ RecordSet ของ ADO ซึ่ง class หลักที่ใช้ใน ADO.Net นั้นคือ DataReader   ส่วนการติดต่อแบบ disconnect นั้นเป็นรูปแบบใหม่ที่แทนที่จะต้องเปิด connection แช่เอาไว้ ADO.Net จะทำ snapshot ของฐานข้อมูลที่เรากำลังติดต่ออยู่เก็บไว้ในหน่วยความจำของเครื่อง ในส่วนนี้ไม่ใช่ว่าทำ snapshot ทั้งฐานข้อมูล  ทำเฉพาะกับ query ที่เราใช้ดึงข้อมูลเท่านั้น


แนะนำADO.NET(cont.)

  • ดังนั้นการอ่านข้อมูลก็จะเป็นการดึงผลที่ได้จากการ query มาทั้งก้อนเอามาเก็บเอาไว้ พอได้ข้อมูลมาหมดก็ disconnect ฐานข้อมูลได้ทันที  ในขณะที่แบบ connect นั้นเราจะต้องเรียกข้อมูลมาทีละรายการ   class หลัก ๆ ที่เกี่ยวข้องกับการติดต่อฐานข้อมูลแบบ disconnect ก็คือ  DataAdapterและDataSet


แนะนำADO.NET(cont.)

  • คราวนี้ดูเหมือนว่าแบบ disconnect น่าจะดีกว่า แต่ทำไมต้องมีแบบ connect มาด้วย?  เหตุผลก็คือแต่ละแบบนั้นมีข้อดี ข้อเสีย ต่างกัน 

  • DataReader ช่วยประหยัดหน่วยความจำอย่างมากเพราะว่าข้อมูลจะถูกนำมาไว้ทีละ 1 record เท่านั้น ลองนึกดูในกรณีที่เราใช้ DataSet ดึงข้อมูลมา สมมติว่ามีข้อมูลมาประมาณ 5000 records ถ้า user ใช้คนเดียวอาจจะไม่เท่าไหร่ แต่ถ้ามี user ใช้โปรแกรมเราพร้อม ๆ กันมาก ๆ หน่วยความจำจะไม่พอเอา และจะทำให้ช้าลงได้เนื่องจากเครื่องต้องทำการสลับข้อมูลไป ๆ มา ๆ ระหว่างหน่วยความจำ กับ disk (memory paging)


แนะนำADO.NET(cont.)

  • แต่อย่างไรก็ดี DataReader นั้นใช้ได้ในกรณีที่เราดึงข้อมูลมาทีละรายการโดยไม่ย้อนกลับเท่านั้น และเป็นการดึงข้อมูลมาอย่างเดียว (forward-only, read-only) เขียนกลับไปไม่ได้ (เขียนข้อมูลกลับแบบ RecordSet ไม่ได้)  เพราะฉะนั้นถ้าเราต้องการดึงข้อมูลมาประมวลผลก่อน หรือต้องมีการแก้ไขข้อมูลแล้วเขียนกลับไปทีละมาก ๆ  เราต้องใช้ DataSet แทน


โครงสร้างของ ADO.NET

  • ใน ADO.Net นั้นจะมี namespace ที่เกี่ยวข้องอยู่ 5 ตัวด้วยกันได้แก่

    • System.Data

    • System.Data.Common

    • System.Data.OleDb

    • System.Data.SqlClient

    • System.Data.SqlTypes


โครงสร้างของ ADO.NET(cont.)

  • 1. System.Data เป็น namespace ที่รับผิดชอบพวก class พื้นฐานที่เกี่ยวกับฐานข้อมูล เช่น DataSet, DataTable, DataRow, DataColumn, ฯลฯ

  • 2. System.Data.Common จะมีพวก class พื้นฐานที่ใช้สำหรับการสร้าง DataAdapter สำหรับฐานข้อมูลแบบต่าง ๆ ซึ่งเราจะไม่ได้ใช้ class เหล่านี้โดยตรง แต่จะไปใช้ class ที่ derive ไปจาก class เหล่านี้อีกที

  • 3. System.Data.OleDb รวบรวม class ที่เกี่ยวข้องการการติดต่อฐานข้อมูลด้วย OLE DB ซึ่งจะเป็น provider-specific


โครงสร้างของ ADO.NET(cont.)

  • 4. System.Data.SqlClient ก็เป็นพวก class ที่ใช้ติดต่อกับ SQL Server

  • 5. System.Data.SqlTypes เป็น namespace ที่รวบรวมข้อมูลเกี่ยวกับ data type ของ SQL Server

  • หมายเหตุ: ข้อมูลเกี่ยวกับ type ของ OLE DB นั้นถูกเก็บเอาไว้ที่ class เดียว คือ System.Data.OleDb.OleDbType เลยไม่มี namespace ให้เห็น


System.Data

  • มาเริ่มเจาะลึกกันทีละ namespace กันดีกว่า ว่ามีอะไรสำคัญ ๆ ที่ควรรู้ไว้บ้าง  สำหรับ System.Data นั้น class ที่สำคัญที่สุดก็เห็นจะเป็น DataSet เพราะเป็น class หลักที่รวบรวมทุกอย่างที่เกี่ยวข้องเข้าไว้ด้วยกัน  คือในหนึ่ง DataSet นั้นจะประกอบไปด้วยสองส่วนหลัก ๆ คือ DataTable กับ DataRelation  สำหรับ DataTable นั้นเราสามารถเก็บไว้ได้มากกว่าหนึ่ง Table ภายใน DataSet ตัวเดียวกัน Table ที่ว่านี่เป็น Table ที่เกิดจากการ query ฐานข้อมูล หรือเราจะสร้างขึ้นมาเองก็ได้เพื่อทำการ update กลับไปที่ฐานข้อมูลเมื่อพร้อม  ใน DataTable ก็จะมีหลาย ๆ DataRow และ DataColumn ดังแสดงในภาพ


ADO.NET architecture


System.Data(cont.)

  • DataRelation นั้นเป็นการกำหนดความสัมพันธ์ระหว่าง DataTable เพื่อสร้างข้อมูลที่มีความสัมพันธ์กันอย่างเช่น เรามี DataTable ที่ชื่อ Customer กับ Order เราสามารถสร้าง DataRelation ขึ้นมาเพื่อเชื่อม Customer กับ Order ได้ โดยกำหนด key ที่จะใช้เช่น CustomerID เป็นต้น


System.Data.OleDb และ System.Data.SqlClient

  • โดยโครงสร้างแล้ว namespace ทั้งสองตัวนี้เหมือนกัน  ส่วนที่ต่างกันก็คือ System.Data.OleDb นั้นเอาไว้ใช้ติดต่อฐานข้อมูลด้วย OLE DB เช่น Jet Engine ของ MS Access  ส่วน System.Data.SqlClient นั้นเอาไว้ใช้กับ SQL Server  ถ้าเราลองเรา class ที่มีอยู่ใน namespace ทั้งสองมาเปรียบเทียบกันตัวต่อตัว ก็จะเห็นได้ชัดขึ้น


System.Data.OleDb และ System.Data.SqlClient(cont.)


System.Data.OleDb และ System.Data.SqlClient(cont.)

  • ดังนั้นถ้าเราไปเจอตัวอย่างโปรแกรมที่เขียนด้วย SqlClient หรือ OleDb เราสามารถเปลี่ยนไปเปลี่ยนมาได้  แต่ที่ต้องระวังคือมันไม่ได้เหมือนกันไปทั้งหมดในรายละเอียด  แต่ส่วนมากแล้วเหมือนกันแค่แก้ชื่อ class ระหว่าง "OleDb" กับ "Sql" เท่านั้น และโดยรวมนั้นขั้นตอนการทำงานต่าง ๆ ก็เหมือนกันมากดังนั้นถ้าเข้าใจ namespace นึงได้ ก็เข้าใจอีก namespace นึงได้ไม่ยากในบทความนี้และต่อ ๆ ไป ตัวอย่างที่ใช้จะยึดที่ OLE DB เป็นหลัก เนื่องจากไม่ใช่ทุกคนที่มี SQL Server ใช้


หลักการติดต่อกับฐานข้อมูล


หลักการติดต่อกับฐานข้อมูล (cont.)

  • 1. เปิด connection ไปที่ ฐานข้อมูล ซึ่งทำได้โดยการสร้าง object จาก OleDbConnection ขึ้นมาโดยระบุ connection string เข้าไป  แล้วเรียก method ที่ชื่อ Open

  • 2. สร้าง OleDbCommand และกำหนด CommandText ซึ่งก็คือพวก SQL statement ที่เคยใช้ ๆ กันแล้วก็กำหนด connection ที่จะให้ command นี้ใช้

  • 3. Query, Update, หรือ Insert ข้อมูลในขั้นนี้ทำได้ 2 วิธี อย่างที่ได้พูดถึงไว้ตอนต้น คือ connect หรือ disconnect  ถ้าต้องการแบบ connect ก็ใช้ OleDbDataReader ถ้าต้องการแบบ disconnect ก็ใช้ DataSet และ OleDbDataAdapter


หลักการติดต่อกับฐานข้อมูล (cont.)

  • 4. ในกรณีที่ไม่ได้ใช้ DataAdapter นั้น เราสามารถใช้ OleDbCommand ได้อยู่ 4 วิธี คือ ถ้าเป็นคำสั่งที่ไม่ใช่ SELECT ก็ใช้ ExecuteNonQuery  ซึ่งผลลัพธ์ที่ได้จะเป็นจำนวน record ที่ถูกเพิ่ม หรือแก้ไขไปที่ฐานข้อมูล  ส่วนถ้าเป็นคำสั่ง SELECT นั้นจะใช้ได้ 3 วิธีคือ

    • 4.1 ExecuteReader ซึ่งจะได้ผลออกมาเป็น DataReader ที่เราสามารถเอาไปใช้ดึงข้อมูลทีละรายการได้ (DataReader ก็เหมือนกันกับ RecordSet ของ ADO แบบเก่า)

    • 4.2 ExecuteScalar ซึ่งจะให้ค่าที่ได้จาก row แรก column แรก ออกมาเป็นค่า ๆ เดียวเท่านั้น เช่น การ select count ,max


หลักการติดต่อกับฐานข้อมูล (cont.)

  • 4.3 ExecuteXmlReader ซึ่งจะให้ผลออกมาเป็น XmlReader เพื่อใช้เอาข้อมูลที่จะได้ออกมาจากฐานข้อมูลในรูปของ XML  คำสั่งนี้ก็มีประโยชน์มาก อย่างเช่นเราสามารถดึงข้อมูลมาเป็น XML แล้วส่งต่อไปให้ XSLT ทำการจัดผลลัพธ์ ออกมาเป็น HTML ที่เราต้องการ ทำให้ผลลัพธ์ของเราสามารถแสดงได้หลายแบบจากข้อมูลชุดเดียวกัน

  • 5. ในกรณีที่ใช้ DataSet นั้น สามารถทำได้โดยสร้าง DataSet ขึ้นมาแล้วสั่งให้ DataAdapter นำข้อมูลมาใส่ไว้ใน DataSet

  • 6. ปิด connection ทำได้โดยการเรียก method ที่ชื่อ Close


  • Namespace ที่ต้องใช้

    • สำหรับการติดต่อกับฐานข้อมูลนั้น namespace ที่ต้องใช้โดยมากแล้วจะมีอยู่ 2 ตัว คือ System.Data ซึ่งเป็นตัวพื้นฐานไม่ว่าจะติดต่อกับฐานข้อมูลยี่ห้ออะไร และอีกตัวก็คือ namespace ที่เป็นตัวเฉพาะของฐานข้อมูลที่เราจะติดต่อด้วยเช่นถ้าเป็น MS Access ก็ใช้

      • using System.Data;

      • using System.Data.OleDb;

    • หรือถ้าเป็น MS SQL Server ก็ใช้

      • using System.Data;

      • using System.Data.SqlClient;


    สร้าง Connection ไปที่ฐานข้อมูล

    • คำสั่งที่ใช้ในการสร้าง connection ไปที่ฐานข้อมูล ก็ง่าย ๆ ไม่มีอะไร เราแค่สร้าง object ที่เป็น connection ที่เราต้องการขึ้นมา แล้วส่งค่า connection string เข้าไปเป็นค่าเริ่มต้น

    • String connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=\somepath\mydb.mdb;Jet OLEDB:Database Password=MyDbPassword;"

    • OleDbConnection myConnection = new OleDbConnection(connectionString);


    เปิด และ ปิดConnection

    • การเปิด connection ทำได้ด้วยการเรียก method ที่ชื่อ Open() ของ OleDbConnection object  เช่น

      • myConnection.Open();

    • ส่วนการปิด connection ทำได้ด้วยการเรียก method ที่ชื่อ Close() ดังนี้

      • myConnection.Close();


    เปิด และ ปิดConnection (cont.)

    • การสั่งเปิด และปิด connection นั้นไม่จำเป็นเสมอไปที่เราต้องสั่งไปในโปรแกรมของเรา  อันนี้ขึ้นอยู่กับวิธีการดึงข้อมูลที่เราจะใช้ในลำดับต่อไป 

    • ถ้าเป็นการดึงข้อมูลด้วย DataReader เราจำเป็นต้องสั่งให้เปิด และปิด connection ด้วยคำสั่งดังกล่าว  แต่ถ้าเป็นกรณีของ DataSet นั้นเราไม่จำเป็นต้องสั่งเปิด (แต่ถ้าจะสั่งก็ได้) เพราะตัว DataSet จะเปิด connection ให้เราเองถ้าถึงเวลา  ในกรณีของการปิดก็เช่นกันเราไม่จำเป็นต้องสั่งปิด

    • ถ้าเราใช้ DataSet  ในกรณีของการปิดนั้นแนะนำว่าให้เราสั่งปิดให้เร็วที่สุดเท่าที่จะทำได้จะดีกว่ารอให้ DataSet ปิด (ซึ่งจะขึ้นอยู่กับระบบ Garbage Collection ของ .Net ด้วยว่าจะจัดการให้เมื่อไหร่) 


    เปิด และ ปิดConnection (cont.)

    • การเปิด connection ในช่วงเวลาที่สั้นที่สุดเท่าที่จะทำได้นั้น จะมีผลดีต่อความเร็วของโปรแกรมเรา เนื่องจาก connection นั้นสามารถนำไปใช้ใหม่ได้ ที่เราเรียกว่าการทำ Connection Pooling   การทำ Connection Pooling นั้น .Net จะทำให้เราโดยอัตโนมัติ โดยดูที่ connection string เป็นหลัก  ถ้าเป็น connection string ที่เหมือนกัน  .Net จะพยายามสร้าง connection ให้น้อยที่สุด และใช้ connection ที่มีอยู่ให้เกิดประโยชน์มากที่สุด


    สร้าง SQLCommand

    • ขั้นตอนต่อมาหลังจากได้ connection มาแล้ว ก็คือการสร้าง Command Object  สำหรับ OLE DB นั้น เราจะใช้ class ที่ชื่อ System.Data.OleDb.OleDbCommand  ยกตัวอย่างเช่น


    สร้าง SQLCommand (cont.)

    • ในตัวอย่างข้างต้น เราสร้าง OleDbCommand ด้วย default constructor -- หมายถึงตัวสร้าง object ของ class นั้น ๆ ที่ไม่รับค่า parameter เลย -- ซึ่งในการใช้งานนั้น เราสามารถเรียกใช้ได้อีกหลายแบบแล้วแต่คนที่สร้าง class นั้น ๆ จะกำหนดเอาไว้ให้  สำหรับ OleDbCommand นั้น ยังมี constructor อีก 3 ตัวที่เรียกใช้ได้คือ


    สร้าง SQLCommand (cont.)

    • 1. ตัวที่รับเฉพาะ CommandText ซึ่งเป็น String

    • 2. ตัวที่รับ CommandText กับ OleDbConnection

    • 3. ตัวที่รับ CommandText, OleDbConnection, และ OleDbTransaction

    •  ซึ่งจะใช้แบบนี้ดีก็แล้วแต่ความเหมาะสม และความสะดวก จากตัวอย่างข้างต้น เราเขียนอีกแบบได้ดังนี้


    สร้าง SQLCommand (cont.)


    DataReader

    • คราวนี้เราก็พร้อมจะดึงข้อมูลแล้ว ตัวอย่างแรกที่เราจะดูกันก็คือการดึงข้อมูลด้วย DataReader ซึ่งเป็นการติดต่อกับฐานข้อมูลแบบ connect กับฐานข้อมูลตลอดเวลา การใช้ DataReader นั้นเราจะได้มันมาจากการเรียก method ที่ชื่อ ExecuteReader() ของ Command object  สำหรับ OLE DB เราทำได้ดังตัวอย่างต่อไปนี้


    DataReader(cont.)

    • หลังจากนั้นเราก็ต้องวนลูปดึงข้อมูลทีละ record จนกว่าจะหมด

    • method Read() ของ DataReader นั้นจะทำการดึงข้อมูลมารอไว้ที่ DataReader หนึ่ง record แล้วส่งค่าออกมาเป็น true หรือ false ถ้าดึงข้อมูลได้ (ข้อมูลยังไม่หมด) ก็จะได้เป็น true มิฉะนั้นก็จะเป็น false


    DataReader(cont.)

    • การดึงข้อมูลในแต่ละ field ของ record ที่ DataReader ได้เอามาเก็บรอไว้นั้นทำได้หลายวิธี ดังนี้

    • 1. ดึงข้อมูลโดยระบุชื่อ field ซึ่งจะเป็นชื่อที่ต้องสอดคล้องกับคำสั่ง SQL ที่เราระบุไปใน OleDbCommand

      • myDataReader["ProductID"].ToString()

    • 2. ดึงข้อมูลโดยระบุตำแหน่งของ Column ซึ่งจะเป็นตำแหน่งที่สอดคล้องกับคำสั่ง SQL ที่เราระบุไปใน OleDbCommand

      • myDataReader[0].ToString()


    DataReader(cont.)

    • 3. ดึงข้อมูลออกมาเป็น type ที่ต้องการ

      • จะเห็นได้ว่า 2 แบบดังกล่าวเราต้องเรียกคำสั่ง ToString() อีกที เนื่องจากค่าที่ส่งกลับมาจะเป็น Object  ดังนั้นถ้าเราต้องการข้อมูลให้เป็น type อื่น เช่น long, int, ฯลฯ เราก็ต้องนำไปแปลงอีกที  โชคดีที่ DataReader ได้เตรียม method ให้เราไว้แล้วอยู่หลายตัวทีเดียวเพื่อให้เราดึงข้อมูลออกมาเป็น type ที่เราต้องการได้เลย method เหล่านี้จะมีชื่อเป็น GetInt32(), GetInt64(), GetBoolean(), GetDateTime(), ฯลฯ ซึ่งชื่อมันก็บอกอยู่แล้วว่าจะส่งค่าออกมาเป็น type อะไร  ดังนั้นด้วแปรที่เราจะเอามารับค่านั้นจะต้องรับกันได้


    DataReader(cont.)

    • 3. ดึงข้อมูลออกมาเป็น type ที่ต้องการ

    • ข้อควรระวังสำหรับการดึงข้อมูลแบบนี้ก็คือ

      1) เราต้องรู้ type ที่แน่นอนของ field ที่เราจะดึงค่า และ

      2) เราต้องรู้ตำแหน่ง column ของ field ที่ต้องการ


    DataReader(cont.)

    • ในกรณีที่มีการดึงข้อมูลหลาย field การใช้ ตำแหน่ง column เพื่ออ้างอิงชื่อ field ที่ต้องการนั้นอ่านยาก ถ้าเราต้องกลับมาแก้โปรแกรม หรือคนอื่นมาช่วยดูโปรแกรม  วิธีแก้ก็คือการใช้ method ของตัว DataReader เองที่ชื่อ GetOrdinal() เพื่อหาค่าตำแหน่ง column ของ field ที่ต้องการ ซึ่งวิธีนี้จะทำให้โปรแกรมทำงานหนักขึ้นอีกนิดนึง แต่ทำให้เราอ่านโปรแกรมได้สะดวกขึ้น ยกตัวอย่างเช่น


    DataReader(cont.)

    • อีกคำสั่งที่น่าสนใจใน DataReader ก็คือ NextResult() ซึ่งจะคล้ายกับ Read() ตรงที่ส่งค่า true/false ออกมาว่ายังมีข้อมูลต่อหรือไม่ แต่ที่ไม่เหมือนคือ NextResult() จะไม่ทำการดึงข้อมูลมาจริง ๆ แค่ตรวจสอบเท่านั้นว่ามีต่อหรือไม่


    DataSet & DataAdapter


    DataSet & DataAdapter (cont.)


    DataSet & DataAdapter(cont.)

    • ตัวอย่างนี้ที่เราจะดูกันก็คือการดึงข้อมูลด้วย DataSet และ DataAdapter ซึ่งเป็นการติดต่อกับฐานข้อมูลแบบ disconnect สำหรับ OLE DB เราทำได้ดังตัวอย่างต่อไปนี้


    DataSet & DataAdapter (cont.)

    • แบบที่ 1

    • string sqlCustomers =“select * from customers order by customerid”;

    • //สร้าง Object DataAdapter ทำหน้าที่ run คำสั่ง SQL

    • OleDbDataAdapter da = new OleDbDataAdapter(sqlCustomers ,conn);

    • //สร้าง Object DataSet

    • DataSet ds = new DataSet();

    • //สั่งให้ Object da ใส่ข้อมูลลงใน ds โดยใช้ methodFill() และตั้งชื่อชุดข้อมูลว่า “Customers”

    • da.Fill(ds,”Customers”);


    DataSet & DataAdapter(cont.)

    • แบบที่ 2

    • string sqlCustomers =“select * from customers order by customerid”;

    • //สร้าง Object DataAdapter ทำหน้าที่ run คำสั่ง SQL

    • OleDbDataAdapter da = new OleDbDataAdapter();

    • da.SelectCommand = new OleDbCommand(sqlCustomers, conn);

    • //สร้าง Object DataSet

    • DataSet ds = new DataSet();

    • //สั่งให้ Object da ใส่ข้อมูลลงใน ds โดยใช้ methodFill() และตั้งชื่อชุดข้อมูลว่า “Customers”

    • int nRows = da.Fill(ds,”Customers”);


    DataView

    • การเรียงลำดับและการกรองข้อมูลด้วยออปเจ็กต์ DataView

    • //ประกาศตัวแปรออปเจ็กต์ DataViewManager

    • DataViewManager dvm = new DataViewManager();

    • dvm.DataSet = ds; //ระบุแหล่งข้อมูล

    • DataViewSetting dvs;

    • //ระบุชื่อชุดข้อมูลที่ต้องการปรับปรุง

    • dvs = dvm.DataViewSettings[“Customers”];

    • dvs.Sort = “ContactName”; //เรียงลำดับด้วย Field ContactName

    • dvs.RowFilter = “Country=‘USA’ ”; //กรองข้อมูลด้วย Field Country


    การติดต่อกับ Oracle Database จาก .NET Framework

    • สามารถทำได้โดยผ่าน .NET Framework Data Provider ได้ดังนี้

      • 1. .NET Framework Data Provider for OLE DB (OLE DB.NET)

      • 2. .NET Framework Data Provider for ODBC (ODBC.NET)


    การติดต่อกับ Oracle Database จาก .NET Framework (cont.)

    • 3. .NET Framework Data Provider for Oracle

      และ ที่ OTN ก็จะเสนอทางเลือกเพิ่มเติม นอกเหนือจาก 3 วิธีข้างต้นคือ

    • 4. Oracle Data Provider for .NET ซี่งเป็นTechnology ของ ทาง Oracle เองhttp://www.oracle.com/technology/tech/windows/odpnet/index.html


    การติดต่อกับ Oracle Database จาก .NET Framework (cont.)


    ad
  • Login