Trong thời đại thông tin hiện nay, CSDL là cái không thể thiếu được trong hầu hết các ứng dụng tin học. Tuy nhiên, CSDL là một công cụ lưu trữ và quản lý dữ liệu nó nằm riêng một phần khác nhau. Vì vậy, trong lập trình ứng dụng bằng bất kỳ ngôn ngữ gì mà muốn sử dụng được dữ liệu của một CSDL nào đó thì ta phải kết nối với CSDL đó. Và để có một sự dễ dàng cho giải pháp vấn đề này, các kỹ thuật truy cập dữ liệu lần lượt ra đời.
a) ODBC.
ODBC được viết tắt bởi (Open Database Connectivity), được Microsoft và một số công ty khác phát triển vào đầu thập niên 90. Công nghệ này cung cấp một tầng truy cập dữ liệu chung, có thể được dùng để ruy cập hầu hết mọi hệ quản trị cơ sở dữ liệu quan hệ (relational database management system – RDBMS). Trong window, bạn có thể tạo các ODBC Connection bằng biểu tượng ODBC trong control panel.
a) DAO
Một trong những vấn đề đối với ODBC đó là nó đã được thiết kết để dùng truy cập dữ liệu chung nên nó thường chạy chậm. Và Microsoft đã cho ra đời 1 kỹ thuật khác là DAO (Data Access Object). DAO đã cung cấp 1 mô hình đối tượng đơn giản để nói chuyện với Jet, một cấu hình CSDL của Microsoft Access. Do DAO đã được tối ưu hoá cho Access nên nó chạy rất nhanh. Nếu bạn sử dụng MS Access thì đây là công cụ truy cập nhanh nhất.
b) RDO
Do DAO được tối ưu cho Access nên nó chỉ chạy tốt khi CSDL là Access và khi sử dụng nó để truy cập các CSDL khác thì nó chạy rất chậm. Để khắc phục điều này, Microsoft đã giới thiệu RDO (Remote Data Objects). RDO cung cấp mô hình đối tượng đơn giản như DAO, nhưng nó được thiết kế để kết nối với nhiều loại CSDL khác nhau.
c) OLE DB
Đợt cải tổ lớn tiếp theo trong thế giới các công nghệ truy cập dữ liệu đó là sự ra đời của OLE DB. Về kiến trúc, OLE DB gần giống vói DAO và RDO, nhưng OLE DB còn có thêm một số các trình cung cấp dịch vụ hỗ trợ cho quá trình truy cập dữ liệu. OLE DB được thiết kể để có thể dùng truy cập bất kỳ CSDL nào, và cách này cho thấy những ưu điểm vượt trội so với các kỹ thuật trước. Hiện nay OLE DB cũng được áp dụng lại cho ADO .Net.
d) ADO
ADO (ActiveX Data Objects) là công nghệ tiên tiến của Microsoft trong truy cập CSDL. ADO thật ra nó chính là 1 tầng mỏng nằm trên OLE DB nhưng nó lại có thêm một số các tiện ích hỗ trợ truy cập CSDL. ADO cho thấy nó thực sự là một công nghệ tốt nhất từ trước tới nay cho quá trình truy cập dữ liệu và hiện nay nó đã được thay đổi một số ít chức năng và trở thành ADO .Net.
Thế giới ngày càng có xu hướng sử dụng và xây dựng các ứng dụng internet trong một môi trường đa người dùng. Để hỗ trợ cho các nhà phát triển ứng dụng, Microsoft đã cho ra đời 1 công nghệ mới trong truy cập dữ liệu, đó là ADO .Net.
Lập trình phần mềm Quản lý thông tin sách có thêm các chức năng thêm mới, xóa thông tin sách từ CSDL.
Hình 1. Ứng dụng khi load form.
Chức năng của ứng dụng được mô tả như sau:
Hình 2. Form khi một item trên ListView được chọn .
Yêu cầu: Thực hiện thao tác thêm hàng, xóa hàng trên DataSet, sau đó cập nhật lại CSDL
1. DATABASE
use master
go
drop database sachdb
go
CREATE DATABASE SachDB
go
use SachDB
go
create table categories
(
categoryid int identity(1,1) primary key,
categoryname varchar(50)
)
go
insert into categories(categoryname) values (‘Sách .net’)
go
insert into categories(categoryname) values (‘Sách java’)
go
CREATE TABLE [dbo].[Products](
[ProductCode] [char](10) NOT NULL PRIMARY KEY,
[Description] [varchar](50) NOT NULL,
[UnitPrice] [money] NOT NULL,
[OnHandQuantity] [int] NOT NULL,
categoryid int
constraint fk_c_p foreign key(categoryid) references categories(categoryid)
)
GO
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity],categoryid) VALUES (N’A3CS ‘, N’Murach”s ASP.NET 3.5 Web Programming with C# 2008’, 54.5000, 4637,1)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity],categoryid) VALUES (N’A3VB ‘, N’Murach”s ASP.NET 3.5 Web Programming with VB 2008’, 54.5000, 3974,1)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity],categoryid) VALUES (N’ADC3 ‘, N’Murach”s ADO.NET 3.5, LINQ, and EF with C# 2008’, 54.5000, 5244,2)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity],categoryid) VALUES (N’ADV3 ‘, N’Murach”s ADO.NET 3.5, LINQ, and EF with VB 2008’, 54.5000, 4538,2)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity]) VALUES (N’CRFC ‘, N’Murach”s CICS Desk Reference’, 50.0000, 1865)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity]) VALUES (N’CSH8 ‘, N’Murach”s C# 2008’, 54.5000, 5136)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity]) VALUES (N’DB1R ‘, N’DB2 for the COBOL Programmer, Part 1 (2nd Edition)’, 42.0000, 4825)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity]) VALUES (N’DB2R ‘, N’DB2 for the COBOL Programmer, Part 2 (2nd Edition)’, 45.0000, 621)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity]) VALUES (N’JSE6 ‘, N’Murach”s JAVA SE 6’, 52.5000, 3455)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity]) VALUES (N’JSP2 ‘, N’Murach”s JAVA Servlets and JSP (2nd Edition)’, 52.5000, 4999)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity]) VALUES (N’MCBL ‘, N’Murach”s Structured COBOL’, 62.5000, 2386)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity]) VALUES (N’MCCP ‘, N’Murach”s CICS for the COBOL Programmer’, 54.0000, 2368)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity]) VALUES (N’MDOM ‘, N’Murach”s JavaScript and DOM Scripting’, 54.5000, 6937)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity]) VALUES (N’SQL8 ‘, N’Murach”s SQL Server 2008’, 52.5000, 2465)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity]) VALUES (N’VB08 ‘, N’Murach”s Visual Basic 2008’, 54.5000, 2193)
INSERT [dbo].[Products] ([ProductCode], [Description], [UnitPrice], [OnHandQuantity]) VALUES (N’ZJLR ‘, N’Murach”s OS/390 and z/os JCL’, 62.5000, 677)
go
select * from categories
go
select * from products
go
2. CODING
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void load_data()
{
SqlConnection con = new SqlConnection(“server=.;database=sachdb;integrated security=true;”);
SqlDataAdapter da = new SqlDataAdapter(“select * from products”,con);
DataTable tb = new DataTable();
da.Fill(tb);
dataGridView1.DataSource = tb;
//databinding
textBox1.DataBindings.Clear();
textBox2.DataBindings.Clear();
textBox3.DataBindings.Clear();
textBox4.DataBindings.Clear();
textBox1.DataBindings.Add(“Text”, dataGridView1.DataSource, “productcode”);
textBox2.DataBindings.Add(“Text”, dataGridView1.DataSource, “Description”);
textBox3.DataBindings.Add(“Text”, dataGridView1.DataSource, “UnitPrice”);
textBox4.DataBindings.Add(“Text”, dataGridView1.DataSource, “OnHandQuantity”);
}
private void Form1_Load(object sender, EventArgs e)
{
load_data();
textBox1.Enabled = false;
textBox2.Enabled = false;
textBox3.Enabled = false;
textBox4.Enabled = false;
button2.Enabled = false;
button3.Enabled = false;
button4.Enabled = false;
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Enabled = true;
textBox2.Enabled = true;
textBox3.Enabled = true;
textBox4.Enabled = true;
textBox1.Text = “”;
textBox2.Text = “”;
textBox3.Text = “”;
textBox4.Text = “”;
textBox1.Focus();
button1.Enabled = false;
button3.Enabled = false;
button2.Enabled = true;
button4.Enabled = true;
}
private void button2_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(“server=.;database=sachdb;integrated security=true;”);
SqlCommand cmd = new SqlCommand(“insert into products values(‘” + textBox1.Text + “‘,'” + textBox2.Text + “‘,'” + textBox3.Text + “‘,'” + textBox4.Text + “‘)”, con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
load_data();
}
private void button3_Click(object sender, EventArgs e)
{
DialogResult kq = MessageBox.Show(“ban muon xoa khong ?”,”tieu de”,MessageBoxButtons.YesNo);
if (kq == System.Windows.Forms.DialogResult.Yes)
{
SqlConnection con = new SqlConnection(“server=.;database=sachdb;integrated security=true;”);
SqlCommand cmd = new SqlCommand(“delete from products where productcode = ‘”+textBox1.Text+”‘”, con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
load_data();
}
}
private void button4_Click(object sender, EventArgs e)
{
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
button3.Enabled = true;
button4.Enabled = true;
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
dataGridView1_CellClick(sender, e);
}
}
Nâng cấp phần mềm Quản lý thông tin sách bằng cách thêm một bảng Category trên bảng
Product thêm 1 cột tên CategoryID và liên kết hai bảng này như sau
a. Đưa dữ liệu từ bảng Category vào Combobox tên là loại sách
b. Thực hiện chức năng nhập mới sách theo Category.
CODING :
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void load_data()
{
SqlConnection con = new SqlConnection(“server=.;database=sachdb;integrated security=true;”);
SqlDataAdapter da = new SqlDataAdapter(“select * from products”, con);
DataTable tb = new DataTable();
da.Fill(tb);
dataGridView1.DataSource = tb;
//databinding
textBox1.DataBindings.Clear();
textBox2.DataBindings.Clear();
textBox3.DataBindings.Clear();
textBox4.DataBindings.Clear();
textBox1.DataBindings.Add(“Text”, dataGridView1.DataSource, “productcode”);
textBox2.DataBindings.Add(“Text”, dataGridView1.DataSource, “Description”);
textBox3.DataBindings.Add(“Text”, dataGridView1.DataSource, “UnitPrice”);
textBox4.DataBindings.Add(“Text”, dataGridView1.DataSource, “OnHandQuantity”);
}
private void Form2_Load(object sender, EventArgs e)
{
load_data();
textBox1.Enabled = false;
textBox2.Enabled = false;
textBox3.Enabled = false;
textBox4.Enabled = false;
button2.Enabled = false;
button3.Enabled = false;
button4.Enabled = false;
// load dữ liệu lên comboBox
SqlConnection con = new SqlConnection(“server=.;database=sachdb;integrated security=true;”);
SqlDataAdapter da = new SqlDataAdapter(“select * from categories”, con);
DataTable tb = new DataTable();
da.Fill(tb);
comboBox1.DataSource = tb;
comboBox1.DisplayMember = “categoryname”;
comboBox1.ValueMember = “categoryid”;
}
private void button1_Click(object sender, EventArgs e)
{
textBox1.Enabled = true;
textBox2.Enabled = true;
textBox3.Enabled = true;
textBox4.Enabled = true;
textBox1.Text = “”;
textBox2.Text = “”;
textBox3.Text = “”;
textBox4.Text = “”;
textBox1.Focus();
button1.Enabled = false;
button3.Enabled = false;
button2.Enabled = true;
button4.Enabled = true;
}
private void button2_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(“server=.;database=sachdb;integrated security=true;”);
SqlCommand cmd = new SqlCommand(“insert into products values(‘” + textBox1.Text + “‘,'” + textBox2.Text + “‘,'” + textBox3.Text + “‘,'” + textBox4.Text + “‘,'”+comboBox1.SelectedValue.ToString()+”‘)”, con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
load_data();
}
private void button3_Click(object sender, EventArgs e)
{
DialogResult kq = MessageBox.Show(“ban muon xoa khong ?”, “tieu de”, MessageBoxButtons.YesNo);
if (kq == System.Windows.Forms.DialogResult.Yes)
{
SqlConnection con = new SqlConnection(“server=.;database=sachdb;integrated security=true;”);
SqlCommand cmd = new SqlCommand(“delete from products where productcode = ‘” + textBox1.Text + “‘”, con);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
load_data();
}
}
private void button4_Click(object sender, EventArgs e)
{
}
private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
button3.Enabled = true;
button4.Enabled = true;
}
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
dataGridView1_CellClick(sender, e);
}
private void button5_Click(object sender, EventArgs e)
{
SqlConnection con = new SqlConnection(“server=.;database=sachdb;integrated security=true;”);
//MessageBox.Show(textBox1.Text);
//MessageBox.Show(textBox2.Text);
//MessageBox.Show(textBox3.Text);
//MessageBox.Show(textBox4.Text);
//MessageBox.Show(comboBox1.SelectedValue.ToString());
//string sql = “update products set description='” + textBox2.Text + “‘,unitprice='” + textBox3.Text + “‘,OnHandQuantity='”+textBox4.Text+”‘,categoryid='”+comboBox1.SelectedValue.ToString()+”‘ where productcode='”+textBox1.Text+”‘”;
//MessageBox.Show(sql);
SqlCommand cmd = new SqlCommand(“update products set description=@description,unitprice=@unitprice,OnHandQuantity=@onhandquantity,categoryid=@categoryid where productcode=@productcode”, con);
cmd.Parameters.AddWithValue(“@description”, textBox2.Text);
cmd.Parameters.AddWithValue(“@unitprice”, textBox3.Text);
cmd.Parameters.AddWithValue(“@OnHandQuantity”, textBox4.Text);
cmd.Parameters.AddWithValue(“@categoryid”, comboBox1.SelectedValue.ToString());
cmd.Parameters.AddWithValue(“@productcode”, textBox1.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
load_data();
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
//SqlConnection con = new SqlConnection(“server=.;database=sachdb;integrated security=true;”);
//SqlDataAdapter da = new SqlDataAdapter(“select * from products where categoryid=@categoryid”, con);
//da.SelectCommand.Parameters.AddWithValue(“@categoryid”,comboBox1.SelectedValue);
//DataSet ds = new DataSet();
//da.Fill(ds);
//dataGridView1.DataSource = ds.Tables[0];
}
}
INFO24H.VN