1. Trang chủ
  2. » Công Nghệ Thông Tin

Truy xuất cơ sở dữ liệu bằng ado

39 607 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 39
Dung lượng 199,65 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

công nghệ ado (activex data object), truy xuất cơ sở dữ liệu bằng ado× ung cấp các lớp để thao tác CSDL trong cả hai môi trường là phi kết nối (Disconected data) và kết nối (Connected data). Tích hợp chặt chẽ với XML (Extensible Markup Language) Tương tác với nhiều nguồn dữ liệu thông qua mô tả dữ liệu chung. Tối ưu truy cập nguồn dữ liệu (OLE DB SQL server). Làm việc trên môi trường Internet. Các lớp của ADO.NET được đặt trong Namespace là System.Data System.Data.oledb

Trang 1

1/ Bài 01: ADO.NET

2/ Bài 02: The SqlConnection Object

3/ Bài 03: The SqlCommand Object

4/ Bài 04: Reading Data with the SqlDataReader

5/ Bài 05: Working with Disconnected Data - The DataSet and SqlDataAdapter 6/ Bài 06: Adding Parameters to Commands

7/ Bài 07: Using Stored Procedures

Trang 2

và có những nguồn dữ liệu mà cho phép ta giao tiếp với chúng trực tiếp thông qua các thư viện lớp.NET là ADO.NET.

ADO.NET cung cấp một cách tương đối phổ biến để tương tác với các nguồn dữ liệu, đi kèm trong bộ khác nhau của thư viện đối với mỗi cách ta có thể làm việc /nói chuyện với một nguồn dữliệu Các thư viện này được gọi là Data Providers Bảng sau liệt kê một số Data Provider phổ biến,các tiền tố API chúng sử dụng, và các loại nguồn dữ liệu cho phép ta tương tác với nó

Provider Name

ODBC Data Provider

OleDb Data Provider

Oracle Data Provider

SQL Data Provider

Borland Data Provider

Một ví dụ có thể giúp ta hiểu được ý nghĩa của tiền tố API Một trong những đối tượng ADO.NETđầu tiên ta sẽ tìm hiểu về là đối tượng kết nối, cho phép ta thiết lập một kết nối đến một nguồn dữliệu Nếu chúng ta đã sử dụng Data Provider OleDb để kết nối với một nguồn dữ liệu đó cho thấymột giao diện OleDb, chúng ta sẽ sử dụng một đối tượng kết nối có tên là OleDbConnection.Tương tự như vậy, các kết nối tên đối tượng sẽ được bắt đầu bằng ODBC hoặc Sql cho một đốitượng OdbcConnection trên một nguồn dữ liệu ODBC hoặc một đối tượng SqlConnection trênmột cơ sở dữ liệu SQL Server, tương ứng Vì chúng ta đang sử dụng MSDE trong hướng dẫn này(một phiên bản thu nhỏ của SQL Server) tất cả các đối tượng API sẽ có tiền tố Sql nghĩaSqlConnection

Trang 3

3/ Đối tượng ADO.NET:

ADO.NET bao gồm nhiều đối tượng, ta có thể sử dụng để làm việc với dữ liệu Phần này giớithiệu một số đối tượng chính mà ta sẽ sử dụng Trong bài này, ta sẽ được tiếp xúc với nhiều đốitượng ADO.NET trong các ví dụ cụ thể Các đối tượng dưới đây là những cái ta cần phải nắmvững Tìm hiểu về nó sẽ cung cấp cho bạn một ý tưởng về mọi điều ta có thể làm gì với dữ liệukhi sử dụng ADO.NET

A/ The SqlConnection Object (đối tượng kết nối)

Để tương tác với một cơ sở dữ liệu, ta phải có một kết nối đến nó Các kết nối giúp xác định máychủ cơ sở dữ liệu, tên cơ sở dữ liệu, tên người dùng, mật khẩu và các thông số khác được yêu cầu

để kết nối đến cơ sở dữ liệu Một đối tượng kết nối được sử dụng bởi các đối tượng lệnh (Command Object) do đó nó sẽ biết được cơ sở dữ liệu để thực hiện các lệnh trên.

B/ The SqlCommand Object (đối tượng lệnh)

Quá trình tương tác với cơ sở dữ liệu có nghĩa là ta phải xác định các hành động mà ta muốn thựchiện Điều này được thực hiện với một đối tượng lệnh Ta sử dụng một đối tượng lệnh để gửi cáclệnh SQL vào cơ sở dữ liệu Một đối tượng lệnh sử dụng một đối tượng kết nối để tìm ra cơ sở dữliệu để giao tiếp với nó Ta có thể sử dụng một đối tượng lệnh một mình, để thực thi một lệnh trựctiếp, hoặc gán một tham chiếu đến một đối tượng lệnh cho một SqlDataAdapter, nó nắm giữ một

bộ các lệnh làm việc trên một nhóm các dữ liệu như mô tả dưới đây

C/ The SqlDataReader Object (đối tượng đọc dữ liệu)

Nhiều hoạt động / thao tác dữ liệu đòi hỏi rằng ta chỉ nhận được một dòng dữ liệu để đọc Các đốitượng Data Reader cho phép ta có được những kết quả của một câu lệnh SELECT từ một đốitượng lệnh Xét về hiệu suất, các dữ liệu trả về từ một Data Reader là một luồng dữ liệu nhanhchóng Điều này có nghĩa rằng ta chỉ có thể lấy dữ liệu từ các luồng một cách tuần tự, điều này làtốt cho tốc độ, nhưng nếu ta cần thao tác dữ liệu, thì một DataSet là một đối tượng tốt hơn để làmviệc với nó

D/ The DataSet Object (đối tượng DataSet)

Đối tượng DataSet là đại diện trong bộ nhớ của dữ liệu Chúng chứa nhiều đối tượng khác nhưDataTable, có chứa các cột và các hàng, giống như bảng cơ sở dữ liệu thông thường Ta có thể xácđịnh mối quan hệ giữa các bảng để tạo mối quan hệ cha-con DataSet được thiết kế đặc biệt đểgiúp quản lý dữ liệu trong bộ nhớ và hỗ trợ hoạt động ngắt kết nối vào dữ liệu, khi một kịch bảnnhư vậy rất có ý nghĩa quản lý DataSet là một đối tượng được sử dụng bởi tất cả Data Provider,

đó là lý do tại sao nó không có một tiền tố cụ thể cung cấp dữ liệu

Trang 4

E/ The SqlDataAdapter Object ()

Đôi khi với dữ liệu ta làm việc chủ yếu là chỉ đọc và ta ít khi cần phải thực hiện thay đổi đối vớicác nguồn dữ liệu bên dưới Một số tình huống cũng gọi là bộ đệm dữ liệu trong bộ nhớ để giảmbớt số lượng các cuộc gọi cơ sở dữ liệu cho dữ liệu mà nó không thay đổi Các Data Adapter (bộchuyển đổi dữ liệu) làm cho nó dễ dàng hơn và bằng cách giúp đỡ việc quản lý dữ liệu trong mộtchế độ ngắt kết nối Các Data Adapter điền vào một đối tượng DataSet khi đọc và ghi dữ liệutrong một đợt duy nhất Một Data Adapter có chứa một tham chiếu đến các đối tượng kết nối và

mở, đóng kết nối tự động khi đọc hoặc ghi với cơ sở dữ liệu Ngoài ra, các Data Adapter chứa cáctham chiếu đối tượng lệnh cho SELECT, INSERT, UPDATE, và DELETE trên dữ liệu Ta sẽđịnh nghĩa một Data Adapter cho mỗi bảng trong một DataSet và nó sẽ quản lý tất cả các giao tiếpvới cơ sở dữ liệu

4/ Tóm lược:

ADO.NET là công nghệ NET để tương tác với nguồn dữ liệu Ta có một vài Data Provider, cho phép giao tiếp với các nguồn dữ liệu khác nhau, tùy thuộc vào các giao thức nó sử dụng Bất kể, Data Provider nào được sử dụng, ta sẽ sử dụng một bộ tương tự của các đối tượng tương tác với một nguồn dữ liệu Các đối tượng SqlConnection cho phép ta quản lý kết nối với một nguồn dữ liệu Đối tượng SqlCommand cho phép bạn nói chuyện với một nguồn dữ liệu và gửi lệnh đến nó

Để có thể nhanh chóng đọc và truy cập vào dữ liệu ta sử dụng SqlDataReader Nếu ta muốn làm việc với các dữ liệu bị ngắt kết nối, sử dụng một DataSet và thực hiện việc đọc từ / ghi đến các nguồn dữ liệu bằng SqlDataAdapter

Trang 5

Bài 2: The SqlConnection Object

1/ Giới thiệu:

Điều đầu tiên ta cần phải làm gì khi tương tác với một cơ sở dữ liệu là tạo ra một kết nối Các kết

nối nói chuyện với cho phần còn lại của mã ADO.NET của cơ sở dữ liệu Nó quản lý tất cả các

logic mức thấp kết hợp với các giao thức cơ sở dữ liệu cụ thể Điều này làm dễ hơn và nhanh

chóng cho các công việc trên các đối tượng kết nối, mở kết nối, và đóng kết nối khi công việc

hoàn thành

A/ Tạo 1 SqlConnection Object

Một đối tượng SqlConnection, giống như bất kỳ đối tượng C # khác Ta chỉ cần khai báo và khởi

tạo các SqlConnection tất cả cùng một lúc, như mẫu sau:

SqlConnection conn = new SqlConnection(

"Data Source=(local);Initial Catalog=Northwind;Integrated Security=SSPI");

Đối tượng SqlConnection khởi tạo ở trên sử dụng một phương thức constructor với một đối số

đơn kiểu chuỗi đối số này được gọi là một chuỗi kết nối Bảng sau mô tả từng bộ phận của chuỗi

Vd: Tích hợp an toàn khi ta đang ở trên một máy tính duy nhất Tuy nhiên, Ta thường sẽ muốn

chỉ định bảo mật dựa trên SQL Server ID của người dùng với thiết lập cấp phép đặc biệt cho các

ứng dụng mà bạn đang sử dụng Sau đây cho thấy một chuỗi kết nối, sử dụng User ID và mật khẩu

thông số:

SqlConnection conn = new SqlConnection

("Data Source=DatabaseServer;Initial Catalog=Northwind;User

ID=YourUserID;Password=YourPassword");

Trang 6

Chú ý: các nguồn dữ liệu được thiết lập để DatabaseServer để chỉ ra rằng ta có thể xác định một

cơ sở dữ liệu nằm trên một máy tính khác, qua mạng LAN, hoặc qua Internet Ngoài ra, User ID

và mật khẩu thay thế các thông số an toàn tích hợp

B/ Sử dụng SqlConnection

Mục đích của việc tạo ra một đối tượng SqlConnection là Ta có thể kích hoạt mã ADO.NET khác

để làm việc với một cơ sở dữ liệu Đối tượng ADO.NET khác, chẳng hạn như một SqlCommand

và một SqlDataAdapter cần 1 đối tượng kết nối như là một tham số Chuỗi các hoạt động xảy ra trong cuộc đời của một SqlConnection như sau:

1 Khởi tạo các SqlConnection

2 Mở các kết nối

3 Thông qua kết nối để làm việc với các đối tượng ADO.NET khác

4 Thực hiện các hoạt động cơ sở dữ liệu với các đối tượng ADO.NET khác

5 Đóng kết nối

Chú ý:

• DataSource là server name trong SQL Server

• Catalog là tên cơ sở dữ liệu cần kết nối

• User ID và password là tài khoản SQL Server

• Chú ý cách kết nối và các xem chuỗi kết nối trong VS.

2/ Tóm lược:

Đối tượng SqlConnection để mã ADO.NET khác biết cơ sở dữ liệu đã kết nối và làm thế nào đểkết nối những thứ khác Các bước ta sử dụng để quản lý vòng đời của một kết nối được tạo ra, mở,chuyển, sử dụng, và đóng Hãy chắc chắn để đóng kết nối đúng khi ta đang thực hiện với nó đểđảm bảo bạn không có một rò rỉ tài nguyên kết nối

.

Trang 7

Bài 3: The SqlCommand Object

1/ Giới thiệu:

Một đối tượng SqlCommand cho phép ta xác định những loại tương tác ta muốn thực hiện với một

cơ sở dữ liệu Ví dụ, ta có thể làm chọn, thêm, sửa đổi và xóa trên dòng dữ liệu trong một bảng cơ

sở dữ liệu Các đối tượng SqlCommand có thể được sử dụng để hỗ trợ các tình huống quản lý dữ liệu bị ngắt kết nối, nhưng trong bài này Ta sẽ chỉ sử dụng các đối tượng SqlCommand một mình Một bài học sau này trên SqlDataAdapter sẽ giải thích làm thế nào để thực hiện một ứng dụng sử dụng dữ liệu bị ngắt kết nối Bài học này cũng sẽ cho bạn thấy làm thế nào để lấy một giá trị duy nhất từ một cơ sở dữ liệu, chẳng hạn như số lượng các Record trong một bảng

Tạo 1 đối tượng SqlCommand

Tương tự như các đối tượng C# khác, ta tạo 1 thể hiện đối tượng SqlCommand theo mẫu sau: SqlCommand cmd = new SqlCommand("lệnh SQL", conn);

Vd:

SqlCommand cmd = new SqlCommand("select Hoten from SinhVien", conn);

2/ Querying Data

Khi sử dụng một lệnh select SQL, ta lấy một tập hợp dữ liệu để xem Để thực hiện điều này với

một đối tượng SqlCommand, ta sẽ sử dụng các phương thức ExecuteReader, nó trả về một đối tượng SqlDataReader Chúng ta sẽ thảo luận về SqlDataReader trong một bài học sau

Vd: dưới đây cho thấy làm thế nào để sử dụng các đối tượng SqlCommand để có được một đối

tượng SqlDataReader:

// 1 Khởi tạo 1 lệnh truy vấn theo kết nối conn

SqlCommand cmd = new SqlCommand("select CategoryName from Categories", conn);

// 2 Gọi Execute reader để nhận kết quả truy vấn

SqlDataReader rdr = cmd.ExecuteReader();

Trang 8

Ví dụ trên khởi tạo 1 đối tượng SqlCommand, thông qua chuỗi lệnh SQL và đối tượng kết nối Sau đó ta có được đối tượng Data Reader bằng cách gọi phương thức thi hành ExecuteReader của đối tượng SqlCommand

3/ Thêm dữ liệu (Inserting Data):

Để thêm dữ liệu vào một cơ sở dữ liệu, sử dụng phương thức ExecuteNonQuery của đối tượng SqlCommand Mẫu sau đây cho thấy làm thế nào để chèn dữ liệu vào một bảng cơ sở dữ liệu:

// Tạo lệnh Insert để thêm dữ liệu vào bảng Categories

string insertString = @" insert into Categories (CategoryName, Description)

values ('Miscellaneous', 'Whatever doesn''t fit elsewhere')";

// 1 Khởi tạo SqlCommand mới với connection conn

SqlCommand cmd = new SqlCommand(insertString, conn);

// 2 Gọi ExecuteNonQuery để gởi lệnh

Trang 9

// 1 Khởi tạo SqlCommand mới với conn

SqlCommand cmd = new SqlCommand(updateString);

// Tạo chuỗi lệnh Delete

string deleteString = @"delete from Categories where CategoryName = 'Other'";

// 1 Khởi tạo SqlCommand mới

SqlCommand cmd = new SqlCommand();

// 2 Đặt thuộc tính CommandText là chuỗi lệnh Delete

6/ Nhận giá trị đơn từ truy vấn

Đôi khi tất cả các bạn cần từ một cơ sở dữ liệu chỉ là một giá trị duy nhất, nó có thể là một số,tổng, trung bình, hoặc giá trị tổng hợp khác từ một tập hợp dữ liệu Thực hiện một ExecuteReader

Trang 10

và tính toán kết quả trong mã của bạn không phải là cách hiệu quả nhất để làm điều này Sự lựachọn tốt nhất là để cho các cơ sở dữ liệu thực hiện công việc và trở về chỉ là giá trị duy nhất màbạn cần Mẫu sau đây cho thấy làm thế nào để làm điều này với phương thức ExecuteScalar:

// 1 Khởi tạo 1 SqlCommand mới

SqlCommand cmd = new SqlCommand("select count(*) from Categories", conn);

// 2 Gọi ExecuteNonQuery để gởi lệnh

int count = (int)cmd.ExecuteScalar();

Truy vấn trong SqlCommand có được số record từ bảng Categories Truy vấn này sẽ chỉ trả lại một giá trị duy nhất Các phương pháp ExecuteScalar ở bước 2 trả về giá trị này Từ kiểu trả về của ExecuteScalar là loại đối tượng, chúng ta sử dụng một phép toán để chuyển đổi các giá trị int

Vd: Gộp tất cả:

Để đơn giản, chúng ta cho thấy các đoạn mã trong phần trước để chứng minh các kỹ thuật được ápdụng Nó cũng rất hữu ích để có một danh sách toàn bộ mã để xem làm thế nào mã này được sửdụng trong một chương trình

Có Database BAITAP, Table ChuyenGia như sau:

// Khởi tạo connection

SqlConnection conn = new SqlConnection ( @"server = \SQLEXPRESS;database = BAITAP;integrated security = true" );

/*hoặc dùng:

Trang 11

SqlConnection conn = new SqlConnection(@"Data Source=XUANCUONG-PRO/SQLEXPRESS;Initial Catalog=Baitap;Integrated Security=True");

*/

}

static void Main()

{ //khởi tạo biến scd

SqlCommandDemo scd = new SqlCommandDemo ();

// gọi phương thức ExecuteScalar để đếm số Record

int numberOfRecords = scd.GetNumberOfRecords();

Trang 12

// 1 khởi tạo command là 1 query và connection

SqlCommand cmd = new SqlCommand ( "select * from ChuyenGia" , conn);

// 2 gọi phương thức ExecuteReader để nhận kết quả của query

// tạo chuỗi Insert

string insertString = @"insert into ChuyenGia (MSCG, HOTEN, TUOI)

values ('C0006','Trần Văn Tý','35')" ;

// 1 khởi tạo 1 lệnh với query và connection

SqlCommand cmd = new SqlCommand (insertString, conn);

// 2 Call ExecuteNonQuery to send command

cmd.ExecuteNonQuery();

}

finally

{

Trang 13

// tạo chuỗi lệnh update

string updateString = @"update ChuyenGia set HOTEN = 'Trần Văn Chuột'

where HOTEN = 'Trần Văn Tý'" ;

// 1 khởi tạo 1 command

SqlCommand cmd = new SqlCommand (updateString);

// 1 khởi tạo 1 command

SqlCommand cmd = new SqlCommand ();

// 2 đặt thuộc tính CommandText

cmd.CommandText = deleteString;

Trang 14

// 1 khởi tạo 1 command

SqlCommand cmd = new SqlCommand ( "select count(*) from ChuyenGia" , conn);

// 2 gọi phương thức ExecuteScalar để gởi lệnh

count = ( int )cmd.ExecuteScalar();

Trang 15

Phương thức ReadData hiển thị nội dung các cột của bảng ChuyenGia Chúng ta sử dụng nó nhiềulần trong các phương thức chính để hiển thị trạng thái hiện tại của bảng ChuyenGia, sau mỗi lầnthêm, cập nhật và xóa Nó được thiết kế để thuận tiện để tái sử dụng nhiều lần.

7/ Tóm lược

Một đối tượng SqlCommand cho phép ta thực hiện truy vấn và gửi lệnh đến một cơ sở dữ liệu Nó

có phương thức mà chuyên biệt cho các lệnh khác nhau

• Phương thức ExecuteReader trả về một đối tượng SqlDataReader để xem kết quả của một truy vấn chọn

• Để chèn, cập nhật và xóa các lệnh SQL, bạn sử dụng phương thức ExecuteNonQuery

• Nếu bạn chỉ cần một tổng giá trị duy nhất từ một câu truy vấn, ExecuteScalar là sự lựa chọntốt nhất

Trang 16

Bài 4: Đọc dữ liệuvới SqlDataReader

1/ Giới thiệu

Một SqlDataReader là một kiểu đó là tốt cho việc đọc dữ liệu một cách hiệu quả nhất có thể Bạnkhông thể sử dụng nó để ghi dữ liệu SqlDataReaders thường được mô tả như luồng dữ liệunhanh

Ta có thể đọc từ các đối tượng SqlDataReader một cách tuần tự theo hướng Forward only (chỉ đitới) Một khi ta đã đọc một số dữ liệu, ta có thể phải phải lưu nó bởi vì ta sẽ không thể quay trở lại

và đọc lại nó

2/ Tạo đối tượng SqlDataReader

Nhận một thể hiện của một SqlDataReader có một chút khác biệt hơn so với cách làm của đốitượng ADO.NET khác Ta phải gọi ExecuteReader vào một đối tượng lệnh, như sau:

SqlDataReader rdr = cmd.ExecuteReader();

Phương thức ExecuteReader của đối tượng SqlCommand, cmd, trả về một thể hiệnSqlDataReader Tạo một SqlDataReader với lệnh new không có tác dụng gì cả

3/ Reading Data

Trang 17

Như ví dụ ở bài trước, SqlDataReader trả về dữ liệu qua một luồng liên tục Để đọc dữ liệu, taphải lấy dữ liệu từ một bảng từng dòng một (row-by-row) Mỗi lần một dòng được đọc, dòngtrước đó sẽ không còn hiệu lực Để đọc lại dòng đó, bạn cần phải tạo một thể hiện mới củaSqlDataReader và đọc xuyên qua luồng dữ liệu một lần nữa.

Phương pháp điển hình để đọc từ luồng dữ liệu trả về bởi SqlDataReader là lặp qua mỗi dòng vớimột vòng lặp while Đoạn code sau cho thấy cách làm điều này:

while (rdr.Read())

{

// get the results of each column string mscg = ( string )rdr["MSCG"];

string hoten = ( string )rdr["HOTEN"];

string tuoi = ( string )rdr["TUOI"];

// print out the results

Trong bài trước, chúng ta lấy cột đầu tiên của dòng bằng cách dùng indexer của SqlDataReader,

ví dụ rdr[0] Ta có thể lấy mỗi cột của dòng với indexer kiểu số, nhưng cách này rất khó đọc Ví

dụ trên dùng indexer kiểu string, với chuỗi sử dụng là tên cột từ câu truy vân SQL Indexer kiểustring sẽ dễ đọc hơn và giúp mã nguồn dễ hiểu

Bỏ qua kiểu tham số của indexer, một indexer của SqlDataReader sẽ trả về kiểu object Đó là lý

do tại sao ví dụ trên phải chuyển kết quả về kiểu string Mỗi lần giá trị được lấy ra, bạn có thể làmbất kì điều gì bạn muốn với chúng, như in ra màn hình với các phương thức của lớp Console

4/ Đóng SqlDataReader

Luôn nhớ đóng SqlDataReader, giống như ta cần phải đóng SqlConnection Cho đoạn mã truy cập

dữ liệu vào trong khối try và đưa đưa lậnh đóng vào khối finally như sau:

try

Trang 18

ReaderDemo rd = new ReaderDemo ();

rd.SimpleRead(); // gọi phương thức SimpleRead()

Trang 19

SqlConnection conn = new SqlConnection ( @"server = \SQLEXPRESS;database = BAITAP;integrated security = true" );

/ / tạo command SqlCommand cmd = new SqlCommand ( "select MSSV, HOTEN from SinhVien" , conn);

try {

// mở connection conn.Open();

// 1 nhận 1 thể hiện của SqlDataReader rdr = cmd.ExecuteReader();

// xuất tên Field / cột làm tiêu đề Console WriteLine( "Ma so SV Hoten " );

Console WriteLine( " -" );

// 2 xuất dữ liệu

while (rdr.Read()) {

// nhận dữ liệu từ các Field

string maso = ( string )rdr[ "MSSV" ];

string ten = ( string )rdr[ "Hoten" ];

// xuất nội dung Console Write( "{0,-12}" , maso);

Console WriteLine( "{0,-30}" , ten);

} }

finally {

// 3 đóng SqlDataReader

if (rdr != null ) {

rdr.Close();

} // đóng connection

if (conn != null ) {

conn.Close();

} }

} }

}

5/ Tóm lược

Ngày đăng: 25/11/2016, 23:04

TỪ KHÓA LIÊN QUAN

w