250 likes | 600 Views
การ เข้าถึง ฐานข้อมูล ด้วย กลุ่ม object ADO.NET. กลุ่ม object หลักของสถาปัตยกรรม ADO.NET. (ActiveX Data Object). หน้าที่ของแต่ละ object. Connection ทำหน้าที่สร้างการเชื่อมต่อเข้ากับฐานข้อมูล OleDbConnection ติดต่อกับ Access, Oracel , SQL Server, MySQL
E N D
การเข้าถึงฐานข้อมูลด้วยกลุ่ม object ADO.NET
กลุ่ม object หลักของสถาปัตยกรรม ADO.NET (ActiveX Data Object)
หน้าที่ของแต่ละ 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 เองได้ • ใน 1DataSetสามารถเก็บผลลัพธ์จากการคิวรีได้หลายๆ ครั้งโดยตั้งชื่ออ้างอิงที่แตกต่างกันออกไป
ตัวอย่างการใช้งานDataSet • ตัวอย่างตาราง User
การใช้งาน DataReader • DataReaderอ่านข้อมูลออกมาครั้งละ 1record โดยใช้คำสั่ง Read() เหมาะกับการอ่านข้อมูลจำนวนน้อยๆ มีการทำงานเร็วกว่าDataSet • ถ้าต้องการอ่านข้อมูลจำนวนมากขึ้นต้องมีการเก็บผลลัพธ์ไว้ในDataTableโดยใช้คำสั่ง Load() • การอ่านข้อมูลของDataReaderนั้นเป็นการอ่านข้อมูลโดยการเลื่อน pointer ไปข้างหน้าเพียงอย่างเดียว (forward-only)
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) เพื่อเชื่อมต่อฐานข้อมูล publicstaticclassdbcon{ publicstaticSqlConnectionconn=null; privatestaticstringconstr=@"Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Company.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"; publicstaticvoidconnectToDB() { conn=newSqlConnection(constr); if (conn.State==ConnectionState.Open) { conn.Close(); } conn.Open(); } publicstaticvoidcloseDB() { if (conn.State==ConnectionState.Open) { conn.Close(); } } }
สร้างหน้าสมัครสมาชิก 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 protectedvoidselect_group() { connect_db(); stringselect_sql="select * from [Group]"; //ประมวลผลคำสั่งsqlโดยใช้ SqlCommand โดยมี connection ส่งเข้าไปเป็นพารามิเตอร์ SqlCommandcmd=newSqlCommand(select_sql, dbcon.conn); //สร้างdatareaderเพื่ออ่านข้อมูลผลลัพธ์ที่ได้ SqlDataReaderreader=cmd.ExecuteReader(); //สร้างdatatableเพื่อเก็บผลลัพธ์ที่ได้อีกต่อหนึ่ง DataTabledt=newDataTable(); //โหลดผลลัพธ์จาก 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เรียกใช้เมธอดselect_groupจากPage_Load protectedvoidPage_Load(objectsender, EventArgse) { if (Page.IsPostBack==false) //คือเปิดเพจมาครั้งแรก select_group(); } ** property IsPostBack จะเป็น true ก็ต่อเมื่อเพจนั้นถูกเปิดมาแล้วเป็นครั้งที่ 2 ขึ้นไป (เช่นผู้ใช้กด refreshหรือมี event อื่นเกิดขึ้นในหน้านั้นแล้ว)
ก่อนจะ insert ข้อมูลผู้ใช้ ให้ตรวจสอบก่อนว่า username นั้นไม่ซ้ำกับข้อมูลที่มีอยู่แล้ว protectedboolvalid_username() { connect_db(); stringselect_sql=“……………………………………………………………….."; SqlCommandcmd=newSqlCommand(select_sql, dbcon.conn); cmd.Parameters.AddWithValue(“ชื่อพารามิเตอร์", ค่าที่กำหนดให้); SqlDataReaderreader=cmd.ExecuteReader(); if (reader.HasRows) { lbCheck.Text="Username ถูกใช้งานแล้ว"; dbcon.closeDB(); returnfalse; } lbCheck.Text="สามารถใช้ Username นี้ได้"; dbcon.closeDB(); returntrue; }
เมื่อกดปุ่ม Register ให้ insert ข้อมูลลงตาราง user protectedvoid btnRegister_Click(objectsender, EventArgse){ if (valid_username()) { //check ก่อนว่า username นี้ยังไม่ถูกใช้งาน try{ connect_db(); //กำหนดคำสั่งsqlinsert ข้อมูลลงตาราง SqlCommandinsert_cmd=newSqlCommand(“………………………", …………………); //ให้ค่าพารามิเตอร์ต่างๆ insert_cmd.Parameters.AddWithValue(“………..", ………………….); ……. //ประมวลผลคำสั่ง sql ใช้ExecuteNonQuery() คือไม่ returnผลลัพธ์แถวกลับมา insert_cmd.ExecuteNonQuery(); lbStatus.Text="เพิ่มข้อมูลสำเร็จ"; } catch (SqlExceptionse) { 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