Tài liệu Lữu trữ hình ảnh vào cơ sở dữ liệu với C#: Lữu trữ hình ảnh vào cơ sở dữ liệu với C# 
Thứ bảy, 28 Tháng 8 2010 12:23 Thủ thuật Công nghệ 
“Làm thế nào chúng 
ta có thể lưu trữ hình ảnh vào cơ sở dữ liệu và truy cập chúng trở lại?”, đây 
là câu hỏi thường gặp trong lập trình cơ sở dữ liệu. 
Trong bài này chúng ta sẽ khảo sát cách thức lưu trữ hình ảnh trong cơ sở dữ 
liệu và hiển thị chúng dùng ADO. NET. Chúng ta sẽ tạo hai ứng dụng. Một 
ứng dụng để lưu trữ các thông tin về sách như tên tác giả, tên sách, hình 
minh họa trang bìa vào cơ sở dữ liệu. 
Ứng dụng còn lại sẽ truy xuất cơ sở dữ liệu và hiển thị những thông tin đó. 
Để tạo hai ứng dụng này chúng ta cần tạo một cơ sở dữ liệu có tên „book‟, 
trong đó có một bảng là „bookinfo‟ với các trường dữ liệu sau: 
bookname(char), author(char), logo(image).Ở đây logo đại diện cho hình bìa 
của sách.Ứng dụng đầu tiên Với ứng dụng đầu tiên, chúng ta tạo ứng dụng 
WinForm và thiết kế chúng như hình sau: 
 Sử dụng các control với tên như bảng sau: 
Book Name Textbox boo...
                
              
                                            
                                
            
 
            
                 7 trang
7 trang | 
Chia sẻ: Khủng Long | Lượt xem: 1238 | Lượt tải: 0 
              
            Bạn đang xem nội dung tài liệu Lữu trữ hình ảnh vào cơ sở dữ liệu với C#, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Lữu trữ hình ảnh vào cơ sở dữ liệu với C# 
Thứ bảy, 28 Tháng 8 2010 12:23 Thủ thuật Công nghệ 
“Làm thế nào chúng 
ta có thể lưu trữ hình ảnh vào cơ sở dữ liệu và truy cập chúng trở lại?”, đây 
là câu hỏi thường gặp trong lập trình cơ sở dữ liệu. 
Trong bài này chúng ta sẽ khảo sát cách thức lưu trữ hình ảnh trong cơ sở dữ 
liệu và hiển thị chúng dùng ADO. NET. Chúng ta sẽ tạo hai ứng dụng. Một 
ứng dụng để lưu trữ các thông tin về sách như tên tác giả, tên sách, hình 
minh họa trang bìa vào cơ sở dữ liệu. 
Ứng dụng còn lại sẽ truy xuất cơ sở dữ liệu và hiển thị những thông tin đó. 
Để tạo hai ứng dụng này chúng ta cần tạo một cơ sở dữ liệu có tên „book‟, 
trong đó có một bảng là „bookinfo‟ với các trường dữ liệu sau: 
bookname(char), author(char), logo(image).Ở đây logo đại diện cho hình bìa 
của sách.Ứng dụng đầu tiên Với ứng dụng đầu tiên, chúng ta tạo ứng dụng 
WinForm và thiết kế chúng như hình sau: 
 Sử dụng các control với tên như bảng sau: 
Book Name Textbox book 
Author Textbox author 
Image Textbox file 
Browse button browse 
Insert button insert 
Nút 'brower' dùng để chọn hình trang bìa, nút „Insert‟ dùng để đưa các thông 
tin về sách vào cơ sở dữ liệu. 
Trước khi có thể nhập thông tin vào cơ sở dữ liệu, chúng ta cần khởi tạo 1 
kết nối đến cơ sở dữ liệu „book‟ của chúng ta. Để làm được điều này, bên 
trong lớp Form1 bạn cần bổ sung các biến sau: 
------------------------------------- 
String constr; //chuỗi xác định kết nối với cơ sở dữ liệu „book‟ 
SqlConnection con; //đối tượng kết nối 
------------------------------------- 
Bạn cần bổ sung thêm khai báo namespace System.Data.SqlClient ở đầu 
chương trình để kích hoạt lớp SqlConnection.Bên trong constructor của lớp 
Form1, bạn cần khởi tạo kết nối và mở cơ sở dữ liệu „book‟: 
------------------------------------ 
//tạo chuỗi kết nối 
constr= “server 
database=books;uid=sa;pwd=”; 
//tạo đối tượng kết nối 
con=new SqlConnection(constr); 
//mở kết nối 
con.Open(); 
----------------------------------- 
Trong đó: 
- server: tên server. 
- database: tên cơ sở dữ liệu. 
- uid,pwd: lần lượt là username và password truy cập server. 
Sau khi đã mở được kết nối đến server cơ sở dữ liệu, người dùng có thể nhập 
vào các thông tin tên sách, tên tác giả, và lựa chọn hình ảnh cho trang bìa. 
Để có thể lựa chọn được hình trang bìa ta cần phải xử lí sự kiện xảy ra trên 
nút „Browse‟ khi nhấn vào nó. 
Dưới đây là hàm xử lí: 
------------------------------------ 
Private void browse_Click ( object sender,EventArgs e ) 
{ 
OpenFileDialog ofd = new OpenFileDialog(); 
ofd.Filter="Image files|*.jpg"; 
if ( ofd.ShowDialog( ) == DialogResult.OK ) 
file.Text=ofd.FileName; 
} 
------------------------------------ 
Trong đoạn mã trên chúng ta tạo một đối tượng của lớp OpenFileDialog có 
tên là ofd. Dùng thuộc tính Filter để lọc lấy những loại file mà ta quan tâm 
đến trong trường hợp này là các file ảnh jpg. Sau đó gọi hàm ShowDialog() 
để hiển thị hộp thoại và kiểm tra xem người dùng có chọn ảnh không. Nếu 
có, chúng ta gán giá trị của thuộc tính FileName của ofd cho thuộc tính Text 
của file text box.Sau khi đã nhập vào đầy đủ, người dùng nhấn nút „Insert‟ 
để lưu thông tin vào cơ sở dữ liệu. Để thực hiện điều này chúng ta cần xử lý 
hàm insert_Click,hàm quản lý sự kiện click lên nút Insert: 
------------------------------------ 
Private void insert_Click ( object sender,EventArgs e ) 
{ 
FileStream f = new FileStream(file.Text, 
FileMode.Open ) ; 
byte[ ] buff = new byte [ f.Length ] ; 
f.Read ( buff, 0, ( int ) f.Length ) ; 
string cmdstr = “Insert into bookinfo values ( @b,@a, @l )” ; 
SqlCommand com = new SqlCommand ( cmdstr,con ) ; 
com.Parameters.Add ( “@b”, book.Text ) ; 
com.Parameters.Add ( “@a”, author.Text ) ; 
com.Parameters.Add ( “@l”, buff ) ; 
com.ExecuteNonQuery( ) ; 
con.Close( ) ; 
} 
----------------------------------- 
Đầu tiên, chúng ta tạo 1 đối tượng thuộc lớp FileStream với các đối số khởi 
tạo là tên file chứa trong các file.Text và kiểu là FileMode.Open. Tiếp 
theo,chúng ta tạo 1 mảng buff kiểu byte có chiều dài bằng với chiều dài của 
đối tượng f. Kế tiếp dùng hàm Read() để đọc nội dung của f vào mảng 
buff.Tiếp theo tạo chuỗi truy vấn cmdstr để thêm thông tin vào cơ sở dữ liệu. 
Trong câu truy vấn trên, ta đã sử dụng các tham số hình thức @b, @a, @l 
chúng lần lươt đại diện cho các trường dữ liệu book, author, 
logo trong bảng „bookinfo‟. 
Điểm tiện lợi trong việc sử dụng các tham số hình thức đó là khi cần thay 
đổi giá trị của một hay tất cả các trường ta khôngcần phải viết lại toàn bộ 
câu truy vấn mà chỉ cần dựa trên các tham số hình thức tương ứng với file đó 
mà cập nhật lại dữ liệu. Thuộc tính Parameters của lớp SqlCommand chứa 
tất cả các tham số được tham chiếu đến trong đối tượng 
SqlParameterCollection. Chúng ta truyền giá trị cho những tham số này 
bằng cách gọi phương thức Add() của lớp SqlParameterCollection. 
Kế tiếp, chúng ta gọi phương thức ExecuteNonquery() để thực thi câu truy 
vấn và gọi hàm Close() để đóng kết nối với cơ sở dữ liệu. 
Trong ứng dụng này, bạn cần bổ sung namespace System.IO để có thể dùng 
lớp FileStream. 
Ứng dụng thứ hai 
Bây giờ chúng ta tạo ứng dụng thứ hai để truy cập và hiển thị dữ liệu trong 
bảng „bookinfo‟. Bạn hãy thiết kế ứng dụng WinForm như hình sau: 
 Xác định các control với tên tương ứng như sau: 
- Book Name Label bookl 
- Author Label authorl 
- Picture Box img 
- Next Button next 
Khi người dùng nhấn nút „Next‟, các thông tin về sách trong cơ sở dữ liệu sẽ 
được hiển thị.Bổ sung thêm các biến vào lớp Form1: 
---------------------------------------- 
string constr; 
SqlConnection con; 
string cmdstr; 
SqlCommand com; 
SqlDataReader r; 
--------------------------------------- 
Khởi tạo các biến trên trong contructor sau khi đã gọi phương thức 
InitializeComponent() như bên dưới: 
--------------------------------------- 
constr = “server database=books;uid=sa;pwd = ”; 
con = new SqlConnection ( constr ); 
cmdstr = “Select * from bookinfo”; com = new SqlCommand ( cmdstr, con 
); 
---------------------------------------- 
Bạn cũng nên bổ sung đoạn mã sau để mở cơ sở dữ liệu và hiển thị thông tin 
về quyển sách đầu tiên: 
---------------------------------------- 
con.Open( ); 
r = com.ExecuteReader( ); 
if ( r.Read( ) ) 
{ 
bookl.Text = r [ 0 ].ToString( ); 
authorl.Text = r [ 1 ].ToString( ); 
byte[ ] b = ( byte[ ] ) r [ 2 ]; 
MemoryStream st = new MemoryStream( ); 
st.Write ( b, 0, b.Length ); 
Image i = Image.FromStream ( st ); 
img.Image = i ; 
} 
--------------------------------------- 
Sau khi mở được kết nối đến cơ sở dữ liệu, chúng ta lấy được một tham 
khảo của đối tượng SqlDataReader trong r bằng cách gọi phương thức 
ExecuteReader(). Tiếp theo, ta gọi phương thức Read() để kiểm tra xem có 
tồn tại bản ghi (record) nào trong bảng „bookinfo‟ không. Nếu có, chúng ta 
lấy các thông tin về tên sách, tên tác giả hiển thị trong các hộp textbox tương 
ứng. Bây giờ, chúng ta cần phải hiển thị hình trang bìa của sách. Đầu tiên 
chúng ta dùng 1 mảng b kiểu byte để lưu trữ hình cần hiển thị. Do không thể 
hiển thị nội dung của mảng b trong hộp Picture Box vì nó không có định 
dạng là file Bitmap file hình) nên ta cần chuyển nội dung mảng b sang định 
dạng của l file bitmap. Để làm điều này,chúng ta tạo 1 đối tượng st của lớp 
MemoryStream. Lớp MemoryStream chỉ dùng để khởi tạo những đối tượng 
lưu trữ dữ liệu tạm thời trong bộ nhớ. Tiếp theo,ta dùng phương thức Write() 
của lớp MemoryStream để ghi dữ liệu của mảng b vào luồng dữ liệu st. Sau 
đó, chúng ta tạo 1 file bitmap bằng cách dùng phương thức constructor của 
lớp Image có đối số tham khảo đến đối tượng của lớp MemoryStream. Kế đó 
chúng tahiển thị hình ảnh trong hộp Picture Box. Ngay khi người dùng nhấn 
„Next‟ hàm next_Click() được gọi để xử lí. Đoạn mã cho hàm next_Click() 
như sau: 
----------------------------------------- 
private void next_Click ( object sender,EventArgs e ) { 
if ( r.Read( ) ) 
{ 
bookl.Text = r [ 0 ].ToString( ) ; 
authorl.Text = r [ 1 ] .ToString( ) ; 
byte[ ] b = ( byte[ ] ) r [ 2 ] ; 
MemoryStream st = new MemoryStream( ) ; 
st.Write ( b, 0, b.Length ) ; 
Image i = Image.FromStream ( st ) ; 
img.Image = i ; 
} 
} 
-------------------------------------------- 
Đoạn mã xử lí bên trong hàm này cũng tương tự như cách chúng ta lấy thông 
tin về quyển sách đầu tiên. Mỗi khi người dùng nhấn nút „Next‟ thông tin về 
quyển sách tiếp theo trong cơ sở dữ liệu „book‟ sẽ được hiển thị. 
Tổng kết 
Hy vọng bài viết này sẽ giúp bạn hiểu được cách thức ứng dụng tương tác 
với cơ sở dữ liệu cũng như thủ thuật giúp bạn có thể lưu trữ trực tiếp hình 
ảnh vào trong cơ sở dữ liệu. Tuy nhiên, cách làm này chỉ thích hợp để lưu 
trữ những hình ảnh nhỏ. Đối với những hình ảnh lớn thì phương pháp này 
trở nên không hiệu quả, bạn cần tìm hiểu những cách thức khác để lưu trữ; 
chẳng hạn như thay vì lưu nội dung hình ảnh, chúng ta sẽ lưu trữ đường dẫn 
tương đối của nó. Chúc thành công. 
            Các file đính kèm theo tài liệu này:
 tailieu.pdf tailieu.pdf