Monday, June 4, 2012

การทำ Deploy .NET Window application

"พอดีจะทำ Setup project  กับ โปรเจคเล็ก ๆ ทีทำไว้ ต้องการให้รวมเอา Ms Access ไปด้วยและต้อง รวมเอา Crystal Report Runtime เข้าไปด้วย ยังหาข้อมูลตรงนี้ไม่ได้ ก็เลยตั้งใจว่าคงต้อง ให้เวลากับมันสัีกนิด เพื่อทำความเข้าใจจริงจัง แล้วไหน ๆ ทำแล้วก็ เผยแพร่เพื่อ เพื่อน ๆ โปรแกรมเมอร์ และนักพัฒนาโปรแกรม ด้วยกัน …"

ไหน ๆ ก็ พูดแล้วกล่าวถึงคำว่า Deployment กันสักนิด  หลังจากที่เราได้พัฒนา Application เส็จสิ้นสมบูรณ์แล้ว ถึงเวลาที่เราจะนำโปรแกรมไปให้กับผู้ใช้งาน หรือสร้างเป็นชุด Installation เพื่อทำให้โปรแกรมของเราสามารถที่ทำงานบนเครื่องผู้ใช้ได้อย่างสมบูรณ์ เราก็ต้องสร้าง ชุด Install ที่สามารถนำไฟล์ทุกไฟล์ที่เกี่ยวข้อง กับการทำงานของโปรแกรม ไม่ว่าจะเป็น .exe , .dll , component ต่าง ๆ ที่เกี่ยวข้อง  third party component  ไฟล์อื่น ๆ เป็นต้น หรือแม้แต่การสร้าง directory การสร้าง shortcut  การทำ environment บนเครื่องเป้าหมาย ให้มีสภาวะเช่นเดียวกับ เครื่องที่เราใช้พัฒนา  กระบวนการที่เราทำสิ่งเหล่านี้ก็คือการ Deployment นั่นเอง
วิธีการที่เราจะกล่าวถึง สำหรับการ Deploying .NET Application คือการใช้ Visual studio .NET Deployment Tools  ซึ่งใช้เครื่องมือที่มีมาพร้อมกับ .NET Visual studio ในบทความนี้ เราอ้างอิง Visual Studio 2005 นะครับ ซึ่งเจ้าเครื่องมือนี้ เราสามารถใช้สำหรับการทำงานดังต่อไปนี้นะครับ
  1. ใช้ Copy ไฟล์ที่จำเป็นทั้งหมดไปยังเครื่อง เป้าหมาย
  2. นอกจากที่มันทำในข้อ 1 แล้วมันก็ยังสามารถเอาไฟล์เหล่านั้นไปไว้ยัง Folders ต่าง ๆ ตามความต้องการของโปรแกรม
  3. และเรายังสามารถใช้ให้มันสร้าง Registry entry ได้ตามต้องการอีกด้วย
  4. และยิ่งไปกว่านั้นเราสามรถทำ custom Dialog ได้ และตรวจสอบ ความต้องการเบื่องต้น เช่น ตรวจสอบว่ามี .NET Framework บนเครื่องเป้าหมายหรือไม่ เป็นต้น
  5. และอื่น ๆ อีก เราสามารถเลือกใช้ได้ตามความต้องการของเรานะครับ
เรามาดูกันที่ เมื่อเริ่มต้นสร้างเราสร้างกัน อย่างไร การเริ่มต้นสร้าง นั้นใช้วิธีการเดียวกับการสร้างโปรเจค นะครับ กล่าวคือเมื่อเราเริ่มสร้างโปรเจค เราเลือก Project type ที่ชื่อว่า Setup Deployment  project  เราสามารถเลือก  template สำหรับการ deployment ได้ตามชนิดของ Application ที่เราทำนะครับ ซึ่งมันก็จะมี
  1. Setup Project สำหรับการสร้าง Deployment ให้กับ Project ธรรมดาที่ทำงานโดยใช้ windows form
  2. Web Setup Project สำหรับสร้าง Deployment ให้กับ Project ที่เป็น Web application
  3. Merge module project สำหรับ การสร้าง Deployment ให้กับ component หมายถึงเราจะ deploy component ที่เราสร้างนะครับไม่ใช่ application
  4. Cab project ก็เช่นเดียวกัน นะครับสำหรับการ deploying component   เช่น component ที่สร้างสำหรับการทำงานบนเครื่อง client เราใช้ component ชนิดนี้วางไว้บน Web server เมื่อ Web browser ต้องการ component การสามารถ download จาก server และทำที่เครื่อง client ได้ คงจะพอนึก app. ประเภทนี้ออกนะครับ
  5. Web Wizard Project มี Wizard  นำทางตลอดทุกขั้นตอนในการทำงาน เหมาะสำหรับ มือใหม่นะครับ จะเริ่มที่นี่
  6. Smart Device Cab Project สำหรับการ Deploying Application ที่ทำงานกับ Pocket PC หรือ smart Phone
     "เอาหล่ะครับเข้าประเด็นดีกว่า ความต้องการก็คือ เรา ต้องการ ให้มีการสร้าง path ที่เครื่องปลายทางและ นำเอา file Database ของเรา รวมไปใส่ไว้ที่ path นั้น รวม  Crystal report และ .Net framework ด้วย . นั่นคือทั้งหมด ที่ต้องการ "

เราเริ่มด้วยการสร้าง Set up Project  เราสามารถที่จะสร้างไว้ภายใน Solution เดียวกันก็ได้ หรือ สร้างไว้ต่าง Solution กันก็ได้ (แล้ว add project เข้ามาทีหลัง) ผมขอกล่าวกึงวิธีการ สร้าง ไว้ภายใน Solution เดียวกันก็แล้วกันนะครับ เพราะเวลาเราทำ Installation file ก็มักจะทำ ให้กับ solution ใด solution หนึ่งเท่านั้น
  • หลังจากเรา เปิด  Solution ขี้นมาแล้ว คือเมื่อเรา เปิดโปรเจคใดโปรเจคหนึ่ง มันก็จะเปิด Solution ที่โปรแจคนั้นอยู่ขึ้นมาทั้งหมด เราก็ Add โปรเจคใหม่เข้าไป โดยเราเลือก ให้เป็น  “Setup Project” นะครับ แล้วตั้งชื่อให้กับโปรเจกสักหน่อยก็ได้ ไม่งั้นเราก็จะได้ชื่อ Default ซึ่งเป็น Setup1 Setup2 .. หรืออะไรก็ตาม 
pic11

pic2


pic2
  • ถัดมาเราจะได้ view ที่เรียกว่า File system view  ซึ่งจะมีรายการของ File system ดังนี้
    • Application Folder ซึ่งมันก็คือ  “C:/Program Files/ชื่อเรา[manufacturer]/projectductname”
    • Profile Folder มันคือ  “C:/Program Files” ของเรานั้นเอง
    • User’s Desktop คือ path ที่อ้างไปยัง หน้าจอ desktop ของ  User แต่ละคนนั่นเอง
    • สุดท้าย ก็คือ User’s Program Menu คือ path ที่อ้างไปยัง All programs ใน start นั่นเอง
ที่จริงเราสามารถเพิ่มเข้ามาได้อีก กรณีที่เรามีความต้องการใช้งานมากกว่านี้  คลิกขวาที่ File system on target machine แล้วเลือก Add special folder ผมจะไม่กล่าวถึงในตอนนี้ นะครับเพราะเท่าที่มีนั้นเพียงพอต่อความต้องการของผมแล้ว (ฝรั่งเขาเรียกว่า commonly used ไง ยังไงก็ต้องใช้มัน )
  • ขั้นตอนต่อไปคือ การทำ Project output ก็คือว่าจะให้ Project ไหนเป็นตัวโปรแกรมหลักในการ Deploy ครั้งนี้ หรือ main project นั้นแหละครับ เราผมจะให้มันสร้างภายใต้ Application Folder นะครับ ก็คลิกขวาที่ Application Folder แล้วเลือก Add –> Project output นะครับ แล้วจะมีโปรเจค ให้เราเลือก เราก็เลือกว่า โปรเจคใดที่เราต้องการ ดังรูป 

pic3 เรา Project ใน combobox แล้ว Primary output ที่ Listbox ด้านล่าง นะครับ แล้วก็ OK

เราจะได้ Primary output ขึ้นทางด้านขวามมือนะครับ หากเราสร้าง class library  project ที่เราอ้างอิงจาก primary เราก็จะเห็น .dll ของ class library เหล่านั้นแสดงอยู่ด้วย ดังนี้

pic4

  • จะเห็นว่า ภายใต้ Application Folder ของผมมี Sub folder เพิ่อมเขามาอีก นั้นคือเราเพิ่มเขามา เพื่อให้เป็น sub folder ที่อยู่ภายใต้ folder เดียวกับ .exe file นั่นเอง คือผมต้องการให้มี folder สำหรับ database (ใส่ ฐานข้อมูล MsAccess) และ reports ที่เราเรียกใช้ระหว่างโปรแกรมทำงานนั่นเอง การเพิ่มก็เพียงแค่ คลิดขวาที่ Application folder แล้วเลือก Add->Folder เท่านั่นเอง ครับ
  • ส่วนไฟล์ที่ต้องการ add เข้าไปในแต่ละ Folder (database และ reports )นั้นก็ คลิกวาที่ Folder นั้นแล้วเลือก Add->file แล้วเราก็ไปเลือกไฟล์ที่เราต้องการ เช่น filename.mdb เป็นต้น มันก็จะทำการรวม file นั้นเขามาในโปรเจค เช่นเดียวกันกับ reports ซึ่งผมใช้ crystal report ในระหว่างการเขียนโปรแกรมมมันก็จะรวมอยู่กับ code file  ผมก็ add มันเขามาใน folder reports ครับ แต่ข้อที่ควรรระวังก็คือ คุณตั้งกลับไปจัดการกับ การอ้างอิง file เหล่านี้อีกครั้ง ให้ตรงกับ ที่ทำไว้ใน setup project และ build ใหม่อีกครั้ง ผมหมายถึงใน primary project นะครับ
  • ต่อไปเราจะทำการสร้าง shortcut ที่หน้า desktop และสร้าง item ใน Programe Menu    จริงแล้วไม่ใช่เรืองยากเลย ครับ อันดับแรกเราสร้าง short cut ก่อน โดยการคลิกขวาที่ primary output from ……… (active) แล้วก็เลือก “Create shortcut to primary…… ” หลังจากนั้นเราก็จะได้ shortcut มาในชื่อเดียวกันเราก็เปลี่ยนชื่อซะให้เหมาะสม แล้วก็ ดึงไปวางไว้ – หากต้องการให้เป็น shortcut ที่หน้าจอ desktop ก็ วางไว้ที่ User’s Desktop folder ด้านซ้ายมือ
  • ในกรณี User’s Program Menu นั้น หากเรามีหลาย Shortcut เราอาจต้องการทำให้เป็นกลุ่มไม่ปะปนกับ menu อื่น ๆ เราก็ต้อง สร้าง folder ภายใต้ User’s Program Menu ด้วย ใช้ชื่ออะไร ก็ตาม หลังจากนั้นเราก็ สร้าง short cut เช่นเดียวกันกับ ที่กล่าวมาก่อนหน้านี้ แล้วก็ลากมาวางไว้ที่ folder ที่อยู่ภายใต้ User’s Program Menu นี้ เราก็จะได้ menu ตามที่เราต้องการ
  • นั่นเป็นทั้งหมด ที่ผมทำนะครับ อ้อมีเพิ่มเติมนะครับ เรื่อง Prerequisites … ในกรณีของผมนี่ ต้องการให้ Setup ของผม ตรวจสอบและ install  crystal report สำหรับ .net framwork 2.0 ด้วย และ ก็รวมถึง framework ด้วยนะครับ เราก็สามารถที่จะกำหนดได้ดังนี้นะครับ  ใน solution explorer ให้คลิกขวาที่ setup project แล้วเลือก properties นะครับจะได้หน้าจอ properties ขึ้นมาเราก็เลือกไปที่ปุ่ม prerequisites นะครับแล้วเราก็เลือก จะเอาอะไรก็ ตามต้องการ



  • จากรูปนะครับ เลือกเสร็จด้านล่าง ถัดมาเราก็เลือก Download prerequisties from the same location as my application นะครับ ผมไม่แน่ใจว่า option นี้หมายถึงให้เอาจาก Installation ที่เราทำใช่หรือป่าวนะครับ เพราะผมยังได้ลอง install เครื่องอื่น เลยไม่ clear ตรงนี้ แต่ผมสังเกตุเห็นว่า ภายใต้ Debug จะมี sub folder ของ library เหล่านี้ปรากฎอยู่ อาจจะเป็นแค่ bosttrap โปรแกรมก็ได้ นะครับ คือมันเริ่มต้น และ download ส่วนที่เหลือ จาก internet นะครับ
  • ในกรณี prerequisites นี้หลายท่านแนะนำว่า ให้เรา แยกต่างหากไปเลย หมายถึง ถ้าเราต้องการ ให้ผู้ใช้ลง .net framework เราให้ ผู้ใช้ install .net framework ก่อน หรือเราจัดให้พร้อมกับชุด install ก็ได้ เช่นเดียวกันกับ crystal report นะครับ หลายท่านก็บอกให้แยก ประโยชน์ก็คือ มันจะ update ตัวมันเองได้ หากมีการ update เพิ่มเติม เขาว่ามาแบบนั้นนะครับ
  • ครับ เพิ่มเติมข้อที่แล้วอีกนิดนะครับ สำหรับใครต้องการ  crystal report  (runtime) ก็มา ได้ที่นี่นะครับ https://www.sdn.sap.com/irj/boc/businessobjects-downloads แล้วก็ คลิกที่ Get Crystal Reports, Crystal Reports Server, and Xcelsius downloads
  • ส่วน .NET Framework คงไม่ต้องบอกนะครับว่า ไป download ได้ที่ไหน
  • มาถึงสุดท้าย ท่านก็ build setup Project แล้วก็ลอง install ดูนะครับ  แล้วก็ลอง run ดูนะครับ  เรื่องการตรวจสอบ เรื่อง .net framework หรือ crystal report นั้นควรจะต้องไปหาเครื่องอื่นลงนะครับ เครื่องที่ยังบริสุทธิอยู่นะครับ ถึงจะรู้ว่า ผิดถูกประการใด ส่วนเรื่อง path ต่าง ๆ นั้นเราตรวจสอบ ได้บนเครื่องเรา แต่ต้องระวังนะครับ บางที่ เราอาจไม่เห็นขอผิดพลาดเพราะว่า บางครั้งถึงแม้เราแก้ไข path อ้างอิง ไม่หมด แล้ว ปรากฏว่าโปรแกรมทำงานได้ ที่ได้ก็เพราะว่า path เดิมของไฟล์ที่เราอ้างอิงนั้นมันยังมีอยู่ มันก็เลยยังทำงานได้ พอไปลงจริงอาจจะเกิดปัญหาได้ ต้องอรบคอบหน่อยนะครับตรงน้

ref : http://gpluspluss.com/category/dot-net/

View State , ASP.NET State Management

ที่เกรินมาทั้งหมดนี้ก็ เพราะว่า ผมจะหาข้อมูลและเขียนเกี่ยวกับ State Management ในหลาย ๆ ระดับ มาเล่าสู่กันฟัง และก็จะรวมถึง technique การส่งผ่านส่งผ่านข้อมูลจาก page หนึ่งไปยังอีก page ด้วย ดังนั้นในหัวข้อเหล่านี้มันก็คง จะมีหลาย ๆ ตอนอยู่นะครับ ถ้าพลังมีมาก ผมคง ให้รายละเอียดได้ทั้งหมด

View State

View state เห็นจะเป็นหัวข้อแรกที่ผมเลือก ที่จะพูดถึงเพราะ View state นี้เราใช้ในการรักษาข้อมูล ภายใต้กรอบการทำงาน page เดียวเท่านั้น ( ASP.NET web controls ใช้ View State เป็นพื้นฐานอยู่แล้ว ) ซึ่ง View state มันจะทำให้เรารักษาข้อมูลระหว่าง postbacks ได้ ( เหตุการณ์ที่จะทำให้เกิด postback เช่น การ click ปุ่มเป็นต้น )
Page object มี property ที่ชื่อว่า ViewState เป็นตัวช่วยให้เราสามารถที่จะเพิ่มข้อมูลเข้าไปใน View State Collection ได้ และ ข้อมูลที่เราสามารถที่จะเก็บลงใน view state ก็เป็นได้ทั้ง simple data types และ ก็ objects ที่เราสร้างขึ้นมา

ต่อไปเรามาดูการใช้งาน View State กันนะครับ เนื่อง จาก View State นั้นมีรูแบบ ที่เรียกว่า dictionary collection ก็หมายถึงว่าข้อมูลแต่ละตัวจะถูกอ้างอิงด้วย string name ที่แตกต่างกัน เช่น

ViewState[“Counter”] = 1;

นั่นเป็นการ เก็บ 1 ลงใน ViewState Collection และอ้าอิงด้วยชื่อที่มีความหมาย คือ Counter ตรงนี้สำคัญนะครับ ถ้า Counter ยังไม่เคยปรากฏอยู่ใน ViewState collection เลย มันก็จะเพิ่ม Counter เข้าไปและเก็บค่า 1 แต่ถ้า Counter มีอยู่แล้ว มันจะแทนที่ค่าเดิมด้วย 1 นะครับ

การ retrieve ข้อมูล เราก็อ้าอิง ด้วยชื่อ Counter ในลักษณะเดียวกับการ บันทึกข้อมูลงไป ( Counter เราเรียกว่าเป็น Key name ) และเราก็ต้องทำ casting ด้วย data type ที่เหมาะสมนะครับ เพราะการเก็บค่าเข้าเป็นใน View state collection นั้นมักจะถูก ทำให้เป็น object โดยอัตโนมัติ ( กรณีที่พวก simple data type เช่น integer ) ดังนั้นต้อง casting ก่อนเพื่อให้ได้ข้อมูลที่ถูกต้องและนำไปใช้งาน ต่อไปเป็นตัวอย่างของ code แสดงการ retrieve ข้อมูลจาก View State collection

int counter ; if (ViewState[“Counter”] != null) { Counter (int)ViewState[“Counter”]; }
ถ้าเรา พยายามที่จะ retrieve ข้อมูลซึ่งไม่มีเก็บอยู่ใน หรือ ไม่ปรากฏอยู่ ใน Collection เราจะได้ NullReferenceException มาแทน ใน code ก็เลยต้องทำการ ตรวจสอบซะก่อนว่า มีข้อมูลปรากฏอยู่หรือไม่ ถือว่าเป็นหลักปฏิบัติโดยทั่วไป นะครับ

จากตัวอย่างที่ผ่านมา เราสามารถประยุกค์ใช้กับ Data types ชนิดอื่นได้ (Simple data types) นอกจากนี้เรายังสามารถที่จะบันทึก ข้อมูลที่เป็น object ลงใน Veiw State ได้ด้วยเช่นกัน แต่การบันทึกข้อมูล objects ลง View State นั้น Object จะต้องเป็น Object ที่ประกาศให้สามารถ แปลงให้เป็น bytes  stream ได้ หรือ ที่เรียกว่า serialization ครับ การทำก็ไม่ได้เป็นเรื่องยากอะไรครับ แค่เพิ่ม ‘Serializable’ attribute ไว้ที่ การประกาศ class  ดังตัวอย่าง

[Serializable] public class Student
{
   public string firstName;
   public string lastName;
   public Student(string fName, string lName)
  {
     firstName = fName;
     lastName = lName;
  }
}

การเก็บค่าลงใน View State

   // Storing a student in view state.
   Student stud = new Student("John", "Doe");
  ViewState["CurrentStudent"] = stud;

และการดึงข้อมูลออกมาใช้งาน

  // Retrieve a student from view state.
  Student stud = (Student) ViewState["CurrentCustomer"];

อย่าลืมนะครับ เวลาเราดึงข้อมูลจาก View Sate จะต้องทำการ casting ให้เป็น Datatype เดียวกับที่เรา ใส่ลงไปนะครับ ในเรื่อง serializable นั้น มีข้อกำหนดดังนี้นะครับ
  • class จะต้องกำกับด้วย serializable attribute
  • derive ก็จะต้อง เป็น serializable ด้วย
  • ตัวแปร private ของ class ก็จะต้องเป็น serializable หรือ ถ้ามี none serializable ก็จะต้องกำกับ ด้วย [none serializable] attribute
ตัวอย่างการใช้งาน สมมติว่าเราจะทำ PostBack counter ก็คือเราจะทำการเพิ่มค่าทีละ 1 ทุกครั้งที่มีการ click ปุ่มนะครับ ลองมาดูกันว่าเป็นอย่างไร

อันดับแรกเรา สร้าง page ใส่ control ดังต่อไปนี้

และที่ code เป็นอย่างนี้ครับ อันดับแรกเป็นของ Page load event

protected void Page_Load(object sender, System.EventArgs e)
{ //First we check if the page is loaded for the first time,
      if (!IsPostBack)
         { ViewState["PostBackCounter"] = 0; } //Now, we assign the variable value in the text box
           int counter = (int)ViewState["PostBackCounter"];
           Label1.Text = counter.ToString();
}

ถัดมาเป็น ของ OnClick ของ Button1

protected void Button1_Click(object sender, System.EventArgs e)
{
     int oldCount = (int)ViewState["PostBackCounter"];
     int newCount = oldCount + 1;

     //First, we assign this new value to the label
     Label1.Text = newCount.ToString();

    //Secondly, we replace the old value of the view state so that the new value is read the next
    //time
     ViewState["PostBackCounter"] = newCount;
    }

ครับ จาก code จะเห็นว่า ทุกครั้งที่มีการ Click ปุ่ม จะทำการเพิ่มค่าให้ PostBackCounter ทีละหนึ่งนะครับ แต่ครั้งแรกที่ load page นี้จะทำการ set ค่าไปที่ 0

ครับที่กล่าวมาและตัวอย่าง ต่าง ก็คงพอที่จะได้ แนวความคิดการใช้งาน View state บ้าง ไม่มากก็น้อยนะครับ

การใช้งาน ADO.NET กับ วิธีปฏิบัติที่เป็นเลิศ [ Best practices ]

ผมครุ่นคิดอยู่นานว่า การใช้งาน Component ต่าง ๆ ใน .NET Framework นั้น จะทำอย่างไร จึงจะสามารถใช้ได้อย่างมีประสิทธิภาพเนื่องจาก document หรือ คู่มือต่าง ๆ ที่เราพอหาได้นั้นจะเป็นคู่มือแนะนำการใช้งาน กว่าเราจะเข้าใจการทำงานอย่างถ่องแท้และสามารถเลือกการปฏิบัติในการใช้งาน ด้วยตัวเองได้ดี ก็ต้องลองใช้งานไปแล้วหลายโครงการ ซึ่งในที่สุดเราก็ต้องหวนกลับมาปรับปรุง code เหล่านั้นใหม่เมื่อพบว่าลักษณะการใช้งานเหล่านั้นขาดประสิทธิภาพสิ้นดี
โชคดีครับที่ พอหาเรื่องเหล่านี้ได้ใน internet มีผู้ใช้งานมากมายรวมถึงผู้ผลิตเองเขียนแนะนำการใช้งาน หรือแนวทางในการใช้งานเพื่อให้ได้ประสิทธิภาพสูงสุดหรือที่เรียกว่า Best practice ในการใช้งาน Library หรือ components นั้น ๆ ซึ่งในหัวข้อนี้ จะขอพูดถึงการใช้งาน ADO.NET

ในบทความนี้จะกล่าวถึงหลักปฏิบัติ หรือแนวทางในการปฏิบัติเพื่อใช้งาน ADO.NET ให้ได้อย่างมีประสิทธิภาพ คือ เพิ่มความเร็วและประหยัดเนื้อที่การใช้งานและลดภาระให้กับ network ซึ่งจะประกอบด้วยหัวข้อต่าง ๆ เหล่านี้
- .NET Framwork Data providers
- การใช้งาน DataReaders, DataSets, DataAdapters, and DataView
- การใช้ Commands
- การใช้ Connections
- การทำงานร่วมกับ XML
          ความเข้าใจใน ADO.NET technology อย่างถ่องแท้จะทำให้เราสามารถพัฒนาระบบได้เต็มประสิทธิภาพ และได้ศักยภาพสูงสุดของการทำงาน รวมถึง ความสามารถในการขยายระบบ และ function การทำงานที่ เป็นไปตามทิศทางของระบบที่ ควรเป็น ในบทความพูดถึงการปฏิบัติที่ดีในการใช้ objects ใน ADO.NET และ ให้คำแนะนำที่จะช่วยให้เราสามารถที่จะปรับปรุง การออกแบบ Application ที่ใช้ ADO.NET ให้ดียิ่งขึ้นและมีประสิทิภาพสูงสุด
.NET Framework Data Providers
Data provider เปรียบเสมือน สะพานเชื่อมระหว่าง application และ data source  ซึ่ง data provider ทำหน้าที่ในการส่ง ผลของ query จาก data source หลังจากที่ประมวลผล คำสั่งที่ data source แล้ว และ ส่งการเปลี่ยนแปลงใน DataSet กลับไปยัง Data source
เพื่อให้ได้ประสิทธิภาพสูงสุด ในการพัฒนา Application ควรเลือกใช้ .NET Framework data provider ให้เหมาะสมกับ Data source  data provider มีให้เลือกใช้อยู่หลายตัวครับ ตารางด้านล้างแสดงข้อมูล ของ data provider กับ data source ที่เหมาะสมกัน
Provider
Details
SQL Server .NET Data Provider Found in the System.Data.SqlClientnamespace.Recommended for middle-tier applications using Microsoft SQL Server version 7.0 or later.Recommended for single-tier applications using the Microsoft Data Engine (MSDE) or Microsoft SQL Server 7.0 or later. 
OLE DB .NET Data Provider Found in the System.Data.OleDbnamespace.Recommended for middle-tier applications using Microsoft SQL Server 6.5 or earlier, or any OLE DB provider that supports the OLE DB interfaces listed in OLE DB Interfaces Used by the OLE DB .NET Data Providerin the .NET Framework SDK. (OLE DB 2.5 interfaces are not required.)For Microsoft SQL Server 7.0 or later, the .NET Framework Data Provider for SQL Server is recommended.Recommended for single-tier applications using a Microsoft® Access database. Use of an Access database for a middle-tier application is not recommended. Support for the OLE DB Provider for ODBC (MSDASQL) is disabled. For access to Open Database Connectivity (ODBC) data sources, an ODBC .NET Data Provider download is available and will be included in the .NET Framework SDK version 1.1.
ODBC .NET Data Provider The ODBC .NET Data Provider for is available for download.Found in the Microsoft.Data.Odbcnamespace.Provides access to data sources that are connected to using an ODBC driver.Note   The ODBC .NET Data Provider will be included in upcoming versions of the .NET Framework starting with version 1.1. The namespace for the included ODBC .NET Data Provider is System.Data.Odbc.
.NET Data Provider for Oracle The Microsoft .NET Data Provider for Oracle is available for download.Found in the System.Data.OracleClientnamespace.Provides access to Oracle data sources (version 8.1.7 and later).Note   The .NET Data Provider for Oracle will be included in upcoming versions of the .NET Framework starting with version 1.1.
Custom .NET Data Provider ADO.NET provides a minimal set of interfaces to enable you to implement your own .NET Framework data provider. For more information about creating a custom data provider, see Implementing a .NET Data Provider in the .NET Framework SDK.
SQLXML Managed Classes The release of XML for Microsoft SQL Server 2000 (SQLXML 3.0) contains SQLXML Managed Classes that enable you to access the XML functionality of Microsoft SQL Server 2000 and later, from the .NET Framework. For example, these classes enable you to execute XML templates, perform XML Path Language (XPath) queries over data at the server, or perform updates to data using Updategrams or Diffgrams.Building on the functionality from SQLXML 1.0 and 2.0, SQLXML 3.0 introduces Web Services to SQL Server 2000. With SQLXML 3.0, Stored Procedures and XML Templates can be exposed as a Web Service through SOAP.SQLXML 3.0 is available for download. 
อ้างอิงจาก http://msdn.microsoft.com/en-us/library/ms971481.aspx
การเชื่อมต่อกับ SQL Server ตั้งแต่ Version 7.0 ขึ้นไป
เพื่อให้ได้ประสิทธิภาพสูงสุด เมื่อต้องการเชื่อมต่อกับฐานข้อมูล Microsoft SQL server ควรเลือกใช้ SQL Server .NET Data provider.  SQL Server .NET Data provider นั้นออกแบบให้ เข้าถึง SQL Server โดยตรง โดยที่ไม่ต้องเกี่ยวข้องกับ technology อื่น ๆ  จากภาพด้าน แสดง  techonolgy ต่าง ๆ ที่ช่วยให้ เข้าถึง SQL Server

Figure 1. Connectivity methods for accessing SQL Server 7.0 or later
อ้างอิงจาก http://msdn.microsoft.com/en-us/library/ms971481.aspx
การเชื่อมต่อ ODBC Data Sources
ODBC .NET Data provider อยู่ใน namespace ที่ชื่อว่า Microsoft.Data.Odbc มีสถาปัตยกรรม แบบเดียวกับ  SQL Server .NET และ OLE DB Data provider. และใช้ connection strings มาตรฐานของ ODBC.
–>  ODBC.NET Data provider จะถูกรวมไว้ใน .NET Framework ตั้งแต่ version 1.1 เป็นต้นไป ซึ่งจะอยู่ใน namespace ชื่อ System.Data.Odbc
การใช้งาน DataReaders  DataSets DataAdapters และ DataViews
ADO.NET มี Object ที่ใช้ในการเข้าถึงข้อมูล และเก็บไว้ใน Memory คือ DataSet และ DataReader
-      DataSet เก็บข้อมูลในรูปแบบ relational ไว้ใน หน่วยความจำ  ประกอบด้วย ตาราง ข้อมูล ลำดับ และ ความสัมพันธ์ระหว่างตาราง
-      Data reader ให้ Streamของข้อมูล ในลักษณะไปข้างหน้าอย่างเดียว และอ่านได้อย่างเดียว
การ ใช้ DataSet มักใช้ควบคู่กับ DataAdapter เพื่อเชื่อมต่อไปยัง data source และมักต้องใช้ DataView เพื่อใช้ในการ sorting และ filtering ข้อมูลใน DataSet นอกจากนี้ DataSet ยังสามารถที่จะสร้าง strongly typed เพื่อให้สามารถเข้าถึงข้อมูลในตารางในลักษณะ property ของ object.
ในหัวข้อถัดไปจะกล่าวถึงการใช้งาน DataSet และ DataReader ทั้งเรื่องการใช้งานการ optimize การเข้าถึงข้อมูล รวมถึงเคร็ดลับการ optimize การใช้งาน DataAdapter และ DataView

 ref : http://gpluspluss.com/category/dot-net/