hoangphuong2003
Banned
- Xu
- 0
Trong bài viết này tôi sẽ hướng dẫn bạn cách chèn hình ảnh trực tiếp vào database. Cách này tuy làm cho database lớn/nặng nhưng nó cũng giải quyết rất nhiều vấn đề trong quá trình lập trình.
Ở đây, csdl tôi sử dụng là ms Access và MS SQLserver.
Database là Access
1. Bạn tạo 1 file access có tên TestDB.mdb nằm trong thư mục bindebug của ứng dụng(chỗ khác cũng không sao, tùy).Tạo 1 bảng có tên tblSinhvien có cấu trúc như sau:
Tên field Kiểu dữ liệu
MSSV Text(15)
hinhAnh OLE Object
2. Tạo 1 Windows Form Application Project có tên Store_Retrieve_Image_From_DB.
3. Tạo lớp có tên ConnectDB.cs với nội dung sau:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;namespace Store_Retrieve_Image_From_DB
{
public class ConnectDB
{
private OleDbConnection con;
private DataSet ds;
private OleDbDataAdapter daSV;
///
/// Phương thức constructor khởi tạo kết nối đến database
///
public ConnectDB()
{
try
{
con = new OleDbConnection();
con.ConnectionString = "Provider=microsoft.jet.OLEDB.4.0;Data Source="+
System.Windows.Forms.Application.StartupPath+"TestDB.mdb";
con.Open();
}
catch (Exception)
{
throw;
}
}
///
/// Lấp về tất cả các mẫu tin trong bảng tblSinhvien
///
///
public DataSet GetTable()
{
ds = new DataSet();
daSV = new OleDbDataAdapter("select * from tblSinhvien", con);
daSV.Fill(ds, "tblSinhvien");
return ds;
}
///
/// Cập nhật các thay đổi của người dùng
///
public void UpdateSV()
{
try
{
OleDbCommandBuilder bd = new OleDbCommandBuilder(daSV);
daSV.Update(ds, "tblSinhvien");
}
catch (Exception)
{
throw;
}
}
}
}
Lớp này dùng để đọc dữ liệu từ database cũng như cập nhật dữ liệu xuống database.
4. Thiết kế MainForm như hình
5. Code cho Form:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Windows.Forms;namespace Store_Retrieve_Image_From_DB
{
public partial class MainForm : Form
{
private ConnectDB conDB;
private DataSet ds = new DataSet();
private BindingSource bs;
private DataTable dtSV;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
try
{
conDB = new ConnectDB();
ds = conDB.GetTable();
dtSV = ds.Tables["tblSinhvien"];
bs = new BindingSource(ds, "tblSinhvien");
bs.CurrentItemChanged += new EventHandler(bs_CurrentItemChanged);
dataGridView1.DataSource = bs;
bindingNavigator1.BindingSource = bs;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
///
/// Sự kiện xảy ra khi binding source có sự thay đổi do người
/// dùng chọn các dòng trên lưới hặc nhấn các nút di chuyển.
///
///
///
void bs_CurrentItemChanged(object sender, EventArgs e)
{
DataRowView row = (DataRowView)bs.Current;
try
{
Byte[] i = (byte[])row["hinhAnh"];
MemoryStream stmBLOBData = new MemoryStream(i);
picHinhAnh.Image = Image.FromStream(stmBLOBData);
}
catch (Exception ex)
{
picHinhAnh.Image = null;
MessageBox.Show(ex.ToString());
}
}
private void btnLuu_Click(object sender, EventArgs e)
{
try
{
DataRow dr = dtSV.NewRow();
dr["MSSV"] = txtMSSV.Text;
if (picHinhAnh.Image != null)
{
MemoryStream ms = new MemoryStream();
picHinhAnh.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
Byte[] bytBLOBData = new Byte[ms.Length];
ms.Position = 0;
ms.Read(bytBLOBData, 0, Convert.ToInt32(ms.Length));
dr["hinhAnh"] = bytBLOBData;
dtSV.Rows.Add(dr);
conDB.UpdateSV();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void btnLoadHinh_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "JPG Files(*.JPG)|*.JPG|GIF Files(*.GIF)|*.GIF";
if (dlg.ShowDialog(this) == DialogResult.OK)
{
picHinhAnh.Image = Image.FromFile(dlg.FileName);
}
}
}
}
[java]
Chú ý:
Để đọc dữ liệu hình ảnh ra ta dùng 1 mảng Byte để chứa giá trị của field hình ảnh. Sau đó muốn hiển thị nó lên PictureBox ta phải dùng MemoryStream để đưa ra:
[java]
Byte[] i = (byte[])row["hinhAnh"];
MemoryStream stmBLOBData = new MemoryStream(i);
picHinhAnh.Image = Image.FromStream(stmBLOBData);
Để cập nhật dữ liệu vào db, ta phải lấy ảnh từ PictureBox vào 1 MemoryStream:
?
1
2
MemoryStream ms = new MemoryStream();
picHinhAnh.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
Rồi sau đó mới chuyển nó thành mảng Byte rồi cung cấp cho 1 datarow để update xuống database.
Byte[] bytBLOBData = new Byte[ms.Length];
ms.Position = 0;
ms.Read(bytBLOBData, 0, Convert.ToInt32(ms.Length));
dr["hinhAnh"] = bytBLOBData;
dtSV.Rows.Add(dr);
Chạy ứng dụng, kết quả như hình sau:
Theo vovanhai
Nguồn: Chèn hình ảnh trực tiếp vào database trong C sharp(P1)
___________________________________________
Học tiếng anh chuyên ngành công nghệ thông tin
Ở đây, csdl tôi sử dụng là ms Access và MS SQLserver.
Database là Access
1. Bạn tạo 1 file access có tên TestDB.mdb nằm trong thư mục bindebug của ứng dụng(chỗ khác cũng không sao, tùy).Tạo 1 bảng có tên tblSinhvien có cấu trúc như sau:
Tên field Kiểu dữ liệu
MSSV Text(15)
hinhAnh OLE Object
2. Tạo 1 Windows Form Application Project có tên Store_Retrieve_Image_From_DB.
3. Tạo lớp có tên ConnectDB.cs với nội dung sau:
using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.OleDb;namespace Store_Retrieve_Image_From_DB
{
public class ConnectDB
{
private OleDbConnection con;
private DataSet ds;
private OleDbDataAdapter daSV;
///
/// Phương thức constructor khởi tạo kết nối đến database
///
public ConnectDB()
{
try
{
con = new OleDbConnection();
con.ConnectionString = "Provider=microsoft.jet.OLEDB.4.0;Data Source="+
System.Windows.Forms.Application.StartupPath+"TestDB.mdb";
con.Open();
}
catch (Exception)
{
throw;
}
}
///
/// Lấp về tất cả các mẫu tin trong bảng tblSinhvien
///
///
public DataSet GetTable()
{
ds = new DataSet();
daSV = new OleDbDataAdapter("select * from tblSinhvien", con);
daSV.Fill(ds, "tblSinhvien");
return ds;
}
///
/// Cập nhật các thay đổi của người dùng
///
public void UpdateSV()
{
try
{
OleDbCommandBuilder bd = new OleDbCommandBuilder(daSV);
daSV.Update(ds, "tblSinhvien");
}
catch (Exception)
{
throw;
}
}
}
}
Lớp này dùng để đọc dữ liệu từ database cũng như cập nhật dữ liệu xuống database.
4. Thiết kế MainForm như hình
5. Code cho Form:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Windows.Forms;namespace Store_Retrieve_Image_From_DB
{
public partial class MainForm : Form
{
private ConnectDB conDB;
private DataSet ds = new DataSet();
private BindingSource bs;
private DataTable dtSV;
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
try
{
conDB = new ConnectDB();
ds = conDB.GetTable();
dtSV = ds.Tables["tblSinhvien"];
bs = new BindingSource(ds, "tblSinhvien");
bs.CurrentItemChanged += new EventHandler(bs_CurrentItemChanged);
dataGridView1.DataSource = bs;
bindingNavigator1.BindingSource = bs;
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
///
/// Sự kiện xảy ra khi binding source có sự thay đổi do người
/// dùng chọn các dòng trên lưới hặc nhấn các nút di chuyển.
///
///
///
void bs_CurrentItemChanged(object sender, EventArgs e)
{
DataRowView row = (DataRowView)bs.Current;
try
{
Byte[] i = (byte[])row["hinhAnh"];
MemoryStream stmBLOBData = new MemoryStream(i);
picHinhAnh.Image = Image.FromStream(stmBLOBData);
}
catch (Exception ex)
{
picHinhAnh.Image = null;
MessageBox.Show(ex.ToString());
}
}
private void btnLuu_Click(object sender, EventArgs e)
{
try
{
DataRow dr = dtSV.NewRow();
dr["MSSV"] = txtMSSV.Text;
if (picHinhAnh.Image != null)
{
MemoryStream ms = new MemoryStream();
picHinhAnh.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
Byte[] bytBLOBData = new Byte[ms.Length];
ms.Position = 0;
ms.Read(bytBLOBData, 0, Convert.ToInt32(ms.Length));
dr["hinhAnh"] = bytBLOBData;
dtSV.Rows.Add(dr);
conDB.UpdateSV();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void btnLoadHinh_Click(object sender, EventArgs e)
{
OpenFileDialog dlg = new OpenFileDialog();
dlg.Filter = "JPG Files(*.JPG)|*.JPG|GIF Files(*.GIF)|*.GIF";
if (dlg.ShowDialog(this) == DialogResult.OK)
{
picHinhAnh.Image = Image.FromFile(dlg.FileName);
}
}
}
}
[java]
Chú ý:
Để đọc dữ liệu hình ảnh ra ta dùng 1 mảng Byte để chứa giá trị của field hình ảnh. Sau đó muốn hiển thị nó lên PictureBox ta phải dùng MemoryStream để đưa ra:
[java]
Byte[] i = (byte[])row["hinhAnh"];
MemoryStream stmBLOBData = new MemoryStream(i);
picHinhAnh.Image = Image.FromStream(stmBLOBData);
Để cập nhật dữ liệu vào db, ta phải lấy ảnh từ PictureBox vào 1 MemoryStream:
?
1
2
MemoryStream ms = new MemoryStream();
picHinhAnh.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
Rồi sau đó mới chuyển nó thành mảng Byte rồi cung cấp cho 1 datarow để update xuống database.
Byte[] bytBLOBData = new Byte[ms.Length];
ms.Position = 0;
ms.Read(bytBLOBData, 0, Convert.ToInt32(ms.Length));
dr["hinhAnh"] = bytBLOBData;
dtSV.Rows.Add(dr);
Chạy ứng dụng, kết quả như hình sau:
Theo vovanhai
Nguồn: Chèn hình ảnh trực tiếp vào database trong C sharp(P1)
___________________________________________
Học tiếng anh chuyên ngành công nghệ thông tin