วันจันทร์ที่ 15 กันยายน พ.ศ. 2551

วิธีเชื่อมข้อมูล MySql โดยใช้ BindingSource บน .Net

คำเตือน ข้อมูลในส่วนนี้สรุปเอาจากความเข้าใจ โดยการศึกษาและพยายามลองผิดลองถูกเอา อาจจะมีวิธีการอื่นที่ถูกต้องและรัดกุมกว่านี้

สิ่งที่ต้องเตรียม
1. ฐานข้อมูล MySql พร้อมข้อมูล ในที่นี้จะใช้ฐานข้อมูลชื่อ test ภายในฐานข้อมูลมีตาราง 1 ตารางชื่อ table1 ข้อมูลมีดังนี้
==== table1 ====
id name
================
1 abc
2 def
================

2. ติดตั้ง MySql Connector สำหรับ .net

ลงมือทำ

1. สร้าง Project ใหม่ใน Visual Studio

2. เพิ่ม Refence ของ MySql โดยเลือก Project -> Add Reference -> MySQL.Data ดังรูป














3. เพิ่ม using MySql ในหัวของ Form1 ดังนี้

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MySql.Data;
using MySql.Data.MySqlClient;


4. วาง component ดังรูป















พร้อมกับกำหนด properties ของ component แต่ละตัวดังนี้
- dataset1 ให้เลือก Tables แล้วในช่อง (Collection) จะแสดงปุ่ม '...' ให้กดปุ่มนี้ โปรแกรมจะแสดงหน้าต่างใหม่ ให้กดปุ่ม add จะได้ตารางใหม่ชื่อ Table1 ให้เปลี่ยนเป็นชื่อ table1 (เปลี่ยนตัว T เป็นตัวเล็ก) จากนั้นเลือก Columns ช่อง (Collection) จะแสดงปุ่ม '...' ให้กดปุ่มนี้ จากนั้นโปรแกรมจะแสดง หน้าต่างใหม่ ให้เพิ่ม 2 column แบบเดียวกับที่เพิ่ม table จากนั้นเปลี่ยนชื่อ ColumnName เป็น id และ Name
- bindingSource1 ให้กำหนด properties DataSource = dataSet1, DataMember = table1
- bindingNavigator1 ให้กำหนด BindingSource = bindingSource1
- dataGridView1 ให้กดปุ่มเล็กๆ ตรงมุมขวา (จะมีหน้าต่างๆ เล็กๆ ขึ้นมา) แล้วเลือก ข้อมูลในช่อง Choose Data Source เป็น bindingSource1
5. แก้ไข Source Code ให้เป็นดังนี้ (ขี้เกียจแสดงอธิบายรายละเอียดการใส่ code นะ)

public partial class Form1 : Form
{
private MySqlConnection conn;
private MySqlDataAdapter adp;

public
Form1()
{
InitializeComponent();
}
private void Form1_Load(object
sender, EventArgs e)
{
conn = new
MySqlConnection("database=test;server=localhost;uid=root;pwd=password");
adp = new MySqlDataAdapter();
adp.SelectCommand = new MySqlCommand("SELECT * FROM
table1", conn);
MySqlCommandBuilder cb = new
MySqlCommandBuilder(adp);
conn.Open();
adp.Fill(dataSet1,
"table1");

// ในกรณีที่ไม่ได้สร้าง table ภายใน dataSet1 ตามข้อ 4 ให้เพิ่ม  Code นี้ลงไป

DataColumn dc1 = new DataColumn("id", System.Type.GetType("System.Int32"));
DataColumn dc2 = new DataColumn("Name", System.Type.GetType("System.String"));
DataTable tb = new DataTable("NameList");
dataSet1.Tables.Add(tb);
bindingSource1.DataSource = dataSet1;
bindingSource1.DataMember = "table1";
dataGridView1.AutoGenerateColumns = true;

}


private void Form1_FormClosed(object sender, FormClosedEventArgs
e)
{
conn.Close();
}

private void dataGridView1_CellEndEdit(object sender,
DataGridViewCellEventArgs e)
{
adp.Update(dataSet1.Tables["table1"]);
}
private void
dataGridView1_RowsRemoved(object sender, DataGridViewRowsRemovedEventArgs e)
{
adp.Update(dataSet1.Tables["table1"]);
}
}


เพิ่มเติม ในกรณีที่ต้องการเชื่อมต่อกับ control อื่นๆ เช่น textbox, combobox ให้ใช้ code ดังต่อไปนี้ในส่วนที่จะเชื่อมต่อกับฐานข้อมูล

ในกรณี textbox

textBox1.DataBindings.Add(new Binding("Text", bindingSource1, "id", true));

ในกรณี combobox

comboBox1.DataSource = dataSet1;
comboBox1.DisplayMember = "table1.Name";
comboBox1.DataBindings.Add(new Binding("Text", bindingSource1, "Name"));