การเข้าถึงฐานข้อมูล ด้วยกลุ่ม object ADO.NET
กลุ่ม object หลักของสถาปัตยกรรม ADO.NET (ActiveX Data Object) ADO.NET OleDbConnection OleDbCommand OleDbDataReader OleDbDataAdapter DataSet SqlConnection SqlDataAdapter SqlCommand SqlDataReader
หน้าที่ของแต่ละ object Connection ทำหน้าที่สร้างการเชื่อมต่อเข้ากับฐานข้อมูล OleDbConnection ติดต่อกับ Access, Oracel, SQL Server, MySQL SqlConnection ติดต่อกับ SQL Server DataAdapter ทำหน้าที่เก็บชุดคำสั่ง SQL เพื่อคิวรีข้อมูลออกมาจากฐานข้อมูล ผลลัพธ์ที่ได้คือออบเจ็กต์ DataSet DataSet ทำหน้าที่เก็บผลลัพธ์จาการทำคิวรีข้อมูลจากฐานข้อมูลที่ได้จาก DataAdapter Command ทำหน้าที่เก็บชุดคำสั่ง SQL เพื่อคิวรีข้อมูลออกมาจากฐานข้อมูล ผลลัพธ์ที่ได้คือออบเจ็กต์ DataReader DataReader ทำหน้าที่เก็บผลลัพธ์จาการทำคิวรีข้อมูลจากฐานข้อมูลที่ได้จาก Command
การใช้งาน DataSet DataSet อ่านข้อมูลทั้งหมดที่คิวรีได้ภายในครั้งเดียว โดยใช้คำสั่ง Fill() ของ DataAdapter เหมาะกับการอ่านข้อมูลจำนวนมาก สามารถจัดการข้อมูลที่ตัว DataSet เองได้ ใน 1 DataSet สามารถเก็บผลลัพธ์จากการคิวรีได้หลายๆ ครั้งโดยตั้งชื่ออ้างอิงที่ แตกต่างกันออกไป
ตัวอย่างการใช้งาน DataSet ตัวอย่างตาราง User
ตัวอย่าง DataSet
การใช้งาน DataReader DataReader อ่านข้อมูลออกมาครั้งละ 1 record โดยใช้คำสั่ง Read() เหมาะกับการ อ่านข้อมูลจำนวนน้อยๆ มีการทำงานเร็วกว่า DataSet ถ้าต้องการอ่านข้อมูลจำนวนมากขึ้นต้องมีการเก็บผลลัพธ์ไว้ใน DataTable โดยใช้คำสั่ง Load() การอ่านข้อมูลของ DataReader นั้นเป็นการอ่านข้อมูลโดยการเลื่อน pointer ไปข้างหน้าเพียงอย่างเดียว (forward-only)
ตัวอย่าง DataReader (1)
ตัวอย่าง DataReader (2)
Namespace ของ ADO.NET System.Data System.Data.SqlClient // ติดต่อกับ SQL Server System.Data.OleDb // ติดต่อกับ Access, Oracle, MySQL
สร้างฐานข้อมูล และตาราง สร้างฐานข้อมูลใหม่ Project > add new item > SQL Server Database ตั้งชื่อฐานข้อมูลเป็น Company.mdf สร้างตารางโดยไปที่ Database explorer > table > add new table กำหนดให้สร้างตาราง Group เก็บข้อมูลประเภทของผู้ใช้งาน และตาราง User เก็บข้อมูลผู้ใช้งาน
ตาราง Group ตาราง User
ตาราง Group ตาราง User
Database diagram สร้าง Database diagram เพื่อสร้างความสัมพันธ์ระหว่างตาราง โดยคลิ๊กที่ Database diagram > add new diagram
สร้างคลาส dbcon (แบบ static) เพื่อเชื่อมต่อฐานข้อมูล public static class dbcon { public static SqlConnection conn = null; private static string constr = @"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Company.mdf; Integrated Security=True;Connect Timeout=30;User Instance=True"; public static void connectToDB() { conn = new SqlConnection(constr); if (conn.State == ConnectionState.Open) { conn.Close(); } conn.Open(); public static void closeDB() {
สร้างหน้าสมัครสมาชิก Register.aspx เขียนเมธอด connect_db() ภายในหน้านี้ เพื่อทดสอบว่าสามารถเชื่อมต่อฐานข้อมูล ได้สำเร็จ (โดยเรียกใช้เมธอด connectToDB() ที่เคยได้เขียนไว้แล้วในคลาส dbcon) โดยต้องทดสอบเมธอด connect_db() นี้ โดยเรียกใช้จาก Page_Load() protected void connect_db() { try { dbcon.connectToDB(); Response.Write(“เชื่อมต่อฐานข้อมูลสำเร็จ<br />"); } catch (Exception ex) { Response.Write("เชื่อมต่อฐานข้อมูลไม่สำเร็จ <br />" + ex);
สร้างฟอร์มสำหรับกรอกข้อมูลผู้ใช้งาน
เขียนคำสั่งให้ดึงข้อมูลฟิลด์ groupName จากตาราง Group มาแสดงใน DropDownList protected void select_group() { connect_db(); string select_sql = "select * from [Group]"; //ประมวลผลคำสั่งsql โดยใช้ SqlCommand โดยมี connection ส่งเข้าไปเป็นพารามิเตอร์ SqlCommand cmd = new SqlCommand(select_sql, dbcon.conn); //สร้างdatareader เพื่ออ่านข้อมูลผลลัพธ์ที่ได้ SqlDataReader reader = cmd.ExecuteReader(); //สร้างdatatable เพื่อเก็บผลลัพธ์ที่ได้อีกต่อหนึ่ง DataTable dt = new DataTable(); //โหลดผลลัพธ์จาก datareader มาเก็บใน datatable dt.Load(reader); //สั่งให้แสดงผลลัพธ์ใน dropdownlist ddlGroup.DataSource = dt; ddlGroup.DataTextField = "groupName"; //ชื่อฟิลด์ที่แสดงผล ddlGroup.DataValueField = "groupID"; //ชื่อฟิลด์ที่returnค่าออกมา ddlGroup.DataBind(); //สั่งbind ให้แสดงผลลัพธ์จาก datatable ลงใน dropdown //ddlGroup.Items.Insert(0, "please select"); dbcon.closeDB(); }
เรียกใช้เมธอด select_group จาก Page_Load protected void Page_Load(object sender, EventArgs e) { if (Page.IsPostBack == false) //คือเปิดเพจมาครั้งแรก select_group(); } ** property IsPostBack จะเป็น true ก็ต่อเมื่อเพจนั้นถูกเปิดมาแล้วเป็นครั้งที่ 2 ขึ้น ไป (เช่นผู้ใช้กด refresh หรือมี event อื่นเกิดขึ้นในหน้านั้นแล้ว)
ก่อนจะ insert ข้อมูลผู้ใช้ ให้ตรวจสอบก่อนว่า username นั้นไม่ซ้ำกับข้อมูลที่มีอยู่แล้ว protected bool valid_username() { connect_db(); string select_sql = “……………………………………………………………….."; SqlCommand cmd = new SqlCommand(select_sql, dbcon.conn); cmd.Parameters.AddWithValue(“ชื่อพารามิเตอร์", ค่าที่กำหนดให้); SqlDataReader reader = cmd.ExecuteReader(); if (reader.HasRows) { lbCheck.Text= "Username ถูกใช้งานแล้ว"; dbcon.closeDB(); return false; } lbCheck.Text = "สามารถใช้ Username นี้ได้"; return true;
เมื่อกดปุ่ม Register ให้ insert ข้อมูลลงตาราง user protected void btnRegister_Click(object sender, EventArgs e) { if (valid_username()) { //check ก่อนว่า username นี้ยังไม่ถูกใช้งาน try { connect_db(); //กำหนดคำสั่ง sql insert ข้อมูลลงตาราง SqlCommand insert_cmd = new SqlCommand(“………………………", …………………); //ให้ค่าพารามิเตอร์ต่างๆ insert_cmd.Parameters.AddWithValue(“………..", ………………….); ……. //ประมวลผลคำสั่ง sql ใช้ ExecuteNonQuery() คือไม่ return ผลลัพธ์แถวกลับมา insert_cmd.ExecuteNonQuery(); lbStatus.Text = "เพิ่มข้อมูลสำเร็จ"; } catch (SqlException se) { lbStatus.Text ="เพิ่มข้อมูลไม่สำเร็จ " + se.ToString(); dbcon.closeDB(); else { lbStatus.Text = "เพิ่มข้อมูลไม่สำเร็จ เนื่องจาก username นี้ถูกใช้แล้ว";
แบบฝึกหัด สร้างหน้า Default.aspx ปุ่ม register ให้ลิ้งค์ไปหน้า Register.aspx ปุ่ม login เมื่อผู้ใช้กรอก username และ password แล้วให้ไปตรวจสอบว่าข้อมูลทั้งสอง ตรงกับในฐานข้อมูลหรือไม่ ถ้าตรงกัน ก็ให้เข้าสู่ระบบได้แล้วลิ้งค์ไปหน้าใหม่ก็ได้(สร้างมาเพิ่มเติม) ถ้าไม่ตรงกัน ก็แจ้งเตือนว่าให้ตรวจสอบ username, password อีกครั้งผ่าน label เพิ่มเติม: ถ้าสามารถแยกความแตกต่างของกลุ่มผู้ใช้ได้จะได้คะแนนเพิ่ม เช่น username: ton อยู่ groupID ที่ 2 คือเป็น employee ก็ให้ลิ้งค์มาหน้า employee username: tea อยู่ groupID ที่ 4 คือเป็น manager ก็ให้ลิ้งค์มาหน้า manager