Tải bản đầy đủ (.pdf) (10 trang)

Các giải pháp lập trình CSharp- P51 pdf

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.65 MB, 10 trang )

391
Chương 10: Cơ sở dữ liệu
rong Microsoft .NET Framework, việc truy xuất đến các loại data-source (nguồn dữ
liệu) được cho phép thông qua một nhóm các lớp có tên là Microsoft ADO.NET. Mỗi
loại data-source được hỗ trợ thông qua một data-provider (bộ cung cấp dữ liệu). Mỗi
data-provider gồm tập các lớp không chỉ hiện thực tập giao diện chuẩn, mà còn cung cấp chức
năng duy nhất của data-source mà nó hỗ trợ. Các lớp này mô tả về kết nối, câu lệnh, thông số,
data-adapter (bộ điều hợp dữ liệu), và data-reader (bộ đọc dữ liệu) mà qua đó, bạn có thể
tương tác với một loại data-source. Bảng 10.1 liệt kê các hiện thực data-provider trong .NET.
T
Bảng 10.1
Các hiện thực data-provider trong .NET Framework
Data-provider Mô tả
.NET Framework
Data Provider
for ODBC
Cung cấp kết nối đến mọi data-source có hiện thực giao diện ODBC;
bao gồm Microsoft SQL Server, Oracle, và Microsoft Access. Các lớp
data-provider nằm trong không gian tên
System.Data.Odbc
và có tiền
tố
Odbc
.
.NET Framework
Data Provider
for OLE DB
Cung cấp kết nối đến mọi data-source có hiện thực giao diện OLE DB;
bao gồm Microsoft SQL Server, MSDE, Oracle, và Jet. Các lớp data-
provider nằm trong không gian tên
System.Data.OleDb


và có tiền tố
OleDb
.
.NET Framework
Data Provider
for Oracle
Cung cấp kết nối đến Oracle. Các lớp data-provider nằm trong không
gian tên
System.Data.OracleClient
và có tiền tố
Oracle
.
.NET Framework
Data Provider
for SQL Server
Cung cấp kết nối đến Microsoft SQL Server phiên bản 7 và mới hơn
(gồm cả MSDE) bằng cách liên lạc trực tiếp với SQL Server mà không
cần sử dụng ODBC hay OLE DB. Các lớp data-provider nằm trong
không gian tên
System.Data.SqlClient
và có tiền tố
Sql
.
.NET Compact
Framework Data
Provider for SQL
Server CE
Cung cấp kết nối đến Microsoft SQL Server CE. Các lớp data-provider
nằm trong không gian tên
System.Data.SqlServerCe

và có tiền tố
SqlCe
.
Chương này mô tả một vài khía cạnh thường được sử dụng nhất của ADO.NET. Tuy nhiên,
ADO.NET là một phần con mở rộng của thư viện lớp .NET Framework và chứa một lượng lớn
các chức năng cao cấp. Do đó, để có thể hiểu rõ hơn về ADO.NET, bạn nên tìm đọc một
quyển sách khác chuyên về ADO.NET. Những đề mục trong chương này trình bày các vấn đề
sau:

Cách tạo, cấu hình, mở, và đóng kết nối cơ sở dữ liệu (mục 10.1).

Cách sử dụng connection-pooling để cải thiện hiệu năng và tính quy mô của các ứng
dụng có sử dụng kết nối cơ sở dữ liệu (mục 10.2).

Cách thực thi các câu lệnh SQL và các thủ tục tồn trữ (Stored Procedure), và cách sử
dụng các thông số để cải thiện tính linh hoạt của chúng (mục 10.3 và 10.4).

Cách xử lý kết quả được trả về từ truy vấn cơ sở dữ liệu (mục 10.5 và 10.6).

Cách nhận biết tất cả các đối tượng SQL Server đang có hiệu lực trên mạng (mục 10.7).
392
Chương 10: Cơ sở dữ liệu

Đọc file Excel với ADO.NET (mục 10.8).

Cách sử dụng Data Form Wizard (mục 10.9) và Crystal Report Wizard (mục 10.10).

Những đề mục trong chương này sử dụng cơ sở dữ liệu mẫu
Northwind
(do

Microsoft
cấp) để làm rõ những kỹ thuật được thảo luận.
1.
1.
K t n i c s d li uế ố ơ ở ữ ệ
K t n i c s d li uế ố ơ ở ữ ệ


Bạn cần mở một kết nối đến một cơ sở dữ liệu.


Tạo một đối tượng kết nối phù hợp với kiểu cơ sở dữ liệu mà bạn cần kết nối; tất
cả các đối tượng kết nối đều hiện thực giao diện
System.Data.IDbConnection
. Cấu
hình đối tượng kết nối bằng cách thiết lập thuộc tính
ConnectionString
của nó.
Mở kết nối bằng cách gọi phương thức
Open
của đối tượng kết nối.
Bước đầu tiên trong việc truy xuất cơ sở dữ liệu là mở một một kết nối đến cơ sở dữ liệu. Giao
diện
IDbConnection
mô tả một kết nối cơ sở dữ liệu, và mỗi data-provider chứa một hiện thực
duy nhất. Dưới đây là danh sách các hiện thực
IDbConnection
cho năm data-provider chuẩn:

System.Data.Odbc.OdbcConnection


System.Data.OleDb.OleDbConnection

System.Data.OracleClient.OracleConnection

System.Data.SqlServerCe.SqlCeConnection

System.Data.SqlClient.SqlConnection
Bạn cấu hình một đối tượng kết nối bằng một chuỗi kết nối. Chuỗi kết nối là một tập các cặp
giá trị tên được phân cách bằng dấu chấm phẩy. Bạn có thể cung cấp một chuỗi kết nối làm
đối số trong phương thức khởi dựng hoặc bằng cách thiết lập thuộc tính
ConnectionString
của
đối tượng kết nối trước khi mở kết nối. Mỗi hiện thực lớp kết nối yêu cầu bạn cung cấp những
thông tin khác nhau trong chuỗi kết nối. Bạn hãy tham khảo tài liệu về thuộc tính
ConnectionString
đối với mỗi hiện thực để biết được những giá trị mà bạn có thể chỉ định.
Dưới đây là một số thiết lập:

Tên server cơ sở dữ liệu đích

Tên cơ sở dữ liệu cần mở vào lúc đầu

Giá trị timeout của kết nối

Cơ chế connection-pooling (xem mục 10.2)

Cơ chế xác thực dùng khi kết nối đến các cơ sở dữ liệu được bảo mật, bao gồm việc
cung cấp username và password
Một khi đã được cấu hình, gọi phương thức

Open
của đối tượng kết nối để mở kết nối đến cơ
sở dữ liệu. Kế đó, bạn có thể sử dụng đối tượng kết nối để thực thi những câu lệnh dựa vào
data-source (sẽ được thảo luận trong mục 10.3). Các thuộc tính của đối tượng kết nối cũng
393
Chương 10: Cơ sở dữ liệu
cho phép bạn lấy thông tin về trạng thái của một kết nối và những thiết lập được sử dụng để
mở kết nối. Khi đã hoàn tất một kết nối, bạn nên gọi phương thức
Close
để giải phóng các tài
nguyên hệ thống và kết nối cơ sở dữ liệu nằm dưới.
IDbConnection
được thừa kế từ
System.IDisposable
, nghĩa là mỗi lớp kết nối sẽ hiện thực phương thức
Dispose
. Phương thức
này sẽ tự động gọi
Close
, cho nên lệnh
using
là một cách rất rõ ràng và hiệu quả khi sử dụng
đối tượng kết nối trong mã lệnh.
Để đạt được hiệu năng tối ưu trong việc truy cập dữ liệu thì phải mở kết nối cơ sở dữ liệu
càng chậm càng tốt, và khi đã hoàn tất thì ngắt kết nối càng sớm càng tốt. Việc này bảo đảm
rằng, bạn không truy xuất tới kết nối cơ sở dữ liệu trong một thời gian dài và mã lệnh có cơ
hội cao nhất để giữ lấy kết nối. Điều này đặc biệt quan trọng nếu bạn đang sử dụng
connection-pooling.
Đoạn mã dưới đây trình bày cách sử dụng lớp
SqlConnection

để mở một kết nối đến SQL
Server đang chạy trên máy cục bộ có sử dụng Integrated Windows Security (bảo mật tích hợp
với Windows). Để truy xuất đến một máy từ xa, chỉ cần thay đổi data-source từ
localhost
thành tên của đối tượng cơ sở dữ liệu.
// Tạo đối tượng SqlConnection rỗng.
using (SqlConnection con = new SqlConnection()) {
// Cấu hình chuỗi kết nối của đối tượng SqlConnection.
con.ConnectionString =
"Data Source = localhost;"+ // Đối tượng SQL Server cục bộ
"Database = Northwind;" + // Cơ sở dữ liệu mẫu Northwind
"Integrated Security=SSPI"; // Integrated Windows Security
// Mở kết nối cơ sở dữ liệu.
con.Open();
// Hiển thị thông tin về kết nối.
if (con.State == ConnectionState.Open) {
Console.WriteLine("SqlConnection Information:");
Console.WriteLine(" Connection State = " + con.State);
Console.WriteLine(" Connection String = " + con.ConnectionString);
Console.WriteLine(" Database Source = " + con.DataSource);
Console.WriteLine(" Database = " + con.Database);
Console.WriteLine(" Server Version = " + con.ServerVersion);
Console.WriteLine(" Workstation Id = " + con.WorkstationId);
Console.WriteLine(" Timeout = " + con.ConnectionTimeout);
Console.WriteLine(" Packet Size = " + con.PacketSize);
} else {
Console.WriteLine("SqlConnection failed to open.");
394
Chương 10: Cơ sở dữ liệu
Console.WriteLine(" Connection State = " + con.State);

}
// Cuối khối using, Dispose sẽ gọi Close.
}
Đoạn mã dưới đây trình bày một chuỗi kết nối dùng để mở một kết nối đến cơ sở dữ liệu ở
trên (nếu bạn đang sử dụng OLE DB Data Provider để thực hiện kết nối):
// Tạo một đối tượng OleDbConnection rỗng.
using (OleDbConnection con = new OleDbConnection()) {
// Cấu hình chuỗi kết nối của đối tượng OleDbConnection.
con.ConnectionString =
"Provider = SQLOLEDB;" + // OLE DB Provider for SQL Server
"Data Source = localhost;" + // Đối tượng SQL Server cục bộ
"Initial Catalog = Northwind;" + // Cơ sở dữ liệu mẫu Northwind
"Integrated Security=SSPI"; // Integrated Windows Security
// Mở kết nối cơ sở dữ liệu.
con.Open();
§
}
2.
2.
S d ng connection-poolingử ụ
S d ng connection-poolingử ụ


Bạn muốn duy trì một pool chứa các kết nối đang mở để cải thiện hiệu năng và
tính quy mô cho một hệ thống lớn.


Cấu hình pool bằng cách sử dụng các thiết lập trong chuỗi kết nối của đối tượng
kết nối.
Connection-pooling làm giảm đáng kể tổng phí liên hợp với việc tạo và hủy kết nối cơ sở dữ

liệu. Connection-pooling cũng cải thiện tính quy mô của các giải pháp bằng cách giảm số
lượng kết nối đồng thời mà một cơ sở dữ liệu phải duy trì—đa số thường “ngồi không” suốt
một phần đáng kể thuộc thời gian sống của chúng. Với connection-pooling, thay vì tạo và mở
một đối tượng kết nối mới mỗi khi cần, bạn có thể lấy kết nối đã mở từ pool. Khi bạn đã hoàn
tất việc sử dụng kết nối, thay vì đóng nó, bạn trả nó về cho pool và cho phép đoạn mã khác sử
dụng nó.
Theo mặc định, SQL Server và Oracle Data Provider cung cấp chức năng connection-pooling.
Một pool sẽ hiện diện đối với mỗi chuỗi kết nối do bạn chỉ định khi mở một kết nối mới. Mỗi
khi bạn mở một kết nối mới với chuỗi kết nối đã được sử dụng qua, nó sẽ được lấy từ pool
395
Chương 10: Cơ sở dữ liệu
hiện có. Chỉ khi bạn chỉ định một chuỗi kết nối khác thì data-provider mới tạo một pool mới.
Bạn có thể điều khiển các đặc tính của pool bằng cách sử dụng các thiết lập trong chuỗi kết
nối được mô tả trong bảng 10.2.

Một khi đã được tạo, pool sẽ tồn tại cho đến khi tiến trình kết thúc.
Bảng 10.2
Các thiết lập trong chuỗi kết nối dùng để điều khiển Connection Pooling
Thiết lập Mô tả
Connection
Lifetime
Chỉ định thời gian tối đa (tính bằng giây) mà một kết nối được phép sống
trong pool trước khi nó bị đóng. “Tuổi” của một kết nối được kiểm tra
chỉ khi kết nối được trả về cho pool. Thiết lập này cần thiết trong việc
thu nhỏ kích thước pool nếu pool không được sử dụng nhiều và cũng bảo
đảm tính cân bằng tải được thực hiện tối ưu trong môi trường cơ sở dữ
liệu gom tụ. Giá trị mặc định là 0, có nghĩa là kết nối tồn tại trong thời
gian sống của tiến trình hiện thời.
Connection
Reset

Chỉ được SQL Server Data Provider hỗ trợ. Chỉ định kết nối có được
reset hay không khi chúng được lấy từ pool. Giá trị
True
bảo đảm trạng
thái của kết nối được reset nhưng cần phải thông báo cho cơ sở dữ liệu.
Giá trị mặc định là
True
.
Pooling
Thiết lập là
False
để có được kết nối không lấy từ pool. Giá trị mặc định

True
.
Max Pool Size
Chỉ định số lượng kết nối tối đa cần có trong pool. Các kết nối được tạo
và thêm vào pool khi được yêu cầu cho đến khi đạt đến con số này. Nếu
một yêu cầu kết nối được thực hiện nhưng không còn kết nối trống thì lời
gọi sẽ block cho đến khi có một kết nối có hiệu lực. Giá trị mặc định là
100.
Min Pool Size
Chỉ định số lượng kết nối tối thiểu cần có trong pool. Lúc tạo pool thì số
kết nối này được tạo và thêm vào pool. Trong quá trình duy trì định kỳ
hoặc khi một kết nối được yêu cầu, các kết nối sẽ được thêm vào pool để
bảo đảm số lượng kết nối tối thiểu có hiệu lực. Giá trị mặc định là 0.
Đoạn mã dưới đây mô tả cấu hình của một pool: chứa tối thiểu 5 kết nối và tối đa 15 kết nối,
kết nối sẽ hết hiệu lực sau 10 phút (600 giây) và được reset mỗi khi một kết nối được lấy từ
pool.
// Thu lấy pooled connection.

using (SqlConnection con = new SqlConnection()) {
// Cấu hình chuỗi kết nối của đối tượng SqlConnection.
con.ConnectionString =
"Data Source = localhost;" + // Đối tượng SQL Server cục bộ
"Database = Northwind;" + // Cơ sở dữ liệu mẫu Northwind
"Integrated Security = SSPI;" + // Integrated Windows Security
396
Chương 10: Cơ sở dữ liệu
"Min Pool Size = 5;" + // Kích thước tối thiểu của pool
"Max Pool Size = 15;" + // Kích thước tối đa của pool
"Connection Reset = True;" + // Reset kết nối mỗi khi sử dụng
"Connection Lifetime = 600"; // Thời gian sống tối đa
// Mở kết nối cơ sở dữ liệu.
con.Open();
// Truy xuất cơ sở dữ liệu
§
// Cuối khối using, Dispose sẽ gọi Close,
// trả kết nối về cho pool để tái sử dụng.
}
Đoạn mã dưới đây mô tả cách sử dụng thiết lập
Pooling
để có được một đối tượng kết nối
không phải lấy từ pool. Điều này cần thiết khi ứng dụng của bạn sử dụng một kết nối đơn
"sống lâu".
// Thu lấy non-pooled connection.
using (SqlConnection con = new SqlConnection()) {
// Cấu hình chuỗi kết nối của đối tượng SqlConnection.
con.ConnectionString =
"Data Source = localhost;" + // Đối tượng SQL Server cục bộ
"Database = Northwind;" + // Cơ sở dữ liệu mẫu Northwind

"Integrated Security = SSPI;" + // Integrated Windows Security
"Pooling = False"; // Chỉ định non-pooled connection
// Mở kết nối cơ sở dữ liệu.
con.Open();
// Truy xuất cơ sở dữ liệu
§
// Cuối khối using, Dispose sẽ gọi Close,
// đóng non-pooled connection.
}
397
Chương 10: Cơ sở dữ liệu
ODBC và OLE DB Data Provider cũng hỗ trợ connection-pooling, nhưng chúng không hiện
thực connection-pooling bên trong các lớp .NET, nên bạn không thể cấu hình pool theo cách
như SQL Server hay Oracle Data Provider. Connection-pooling trong ODBC được quản lý
bởi ODBC Driver Manager và được cấu hình bằng công cụ ODBC Data Source
Administrator trong Control Panel. Connection-pooling trong OLE DB được quản lý bởi hiện
thực OLE DB nguyên sinh; bạn có thể làm mất hiệu lực pooling bằng cách thêm thiết lập “
OLE
DB Services=-4;
” vào chuỗi kết nối. SQL Server CE Data Provider không hỗ trợ connection-
pooling, vì tại một thời điểm SQL Server CE chỉ hỗ trợ một kết nối.
3.
3.
Th c thi câu l nh SQL ho c th t c t n trự ệ ặ ủ ụ ồ ữ
Th c thi câu l nh SQL ho c th t c t n trự ệ ặ ủ ụ ồ ữ


Bạn cần thực thi một câu lệnh
SQL
hoặc một thủ tục tồn trữ trên một cơ sở dữ

liệu.


Tạo một đối tượng câu lệnh phù hợp với kiểu cơ sở dữ liệu mà bạn định sử dụng;
tất cả các đối tượng câu lệnh đều hiện thực giao diện
System.Data.IDbCommand
.
Cấu hình đối tượng câu lệnh bằng cách thiết lập các thuộc tính
CommandType

CommandText
của nó. Thực thi câu lệnh bằng một trong các phương thức
ExecuteNonQuery
,
ExecuteReader
, hay
ExecuteScalar
tùy thuộc vào kiểu câu lệnh
và kết quả của nó.
Giao diện
IDbCommand
mô tả một câu lệnh cơ sở dữ liệu, và mỗi data-provider chứa một hiện
thực duy nhất. Dưới đây là danh sách các hiện thực
IDbCommand
cho năm data-provider chuẩn:

System.Data.Odbc.OdbcCommand


System.Data.OleDb.OleDbCommand



System.Data.OracleClient.OracleCommand


System.Data.SqlServerCe.SqlCeCommand


System.Data.SqlClient.SqlCommand

Để thực thi một câu lệnh dựa trên một cơ sở dữ liệu, bạn phải có một kết nối đang mở (đã
được thảo luận trong mục 10.1) và một đối tượng câu lệnh đã được cấu hình phù hợp với kiểu
cơ sở dữ liệu đang truy xuất. Bạn có thể tạo đối tượng câu lệnh một cách trực tiếp bằng
phương thức khởi dựng, nhưng cách đơn giản hơn là sử dụng phương thức
CreateCommand
của
đối tượng kết nối. Phương thức
CreateCommand
trả về một đối tượng câu lệnh (đúng kiểu data-
provider) và cấu hình nó với các thông tin cơ sở được lấy từ kết nối mà bạn đã sử dụng để tạo
câu lệnh. Trước khi thực thi câu lệnh, bạn phải cấu hình các thuộc tính được mô tả trong bảng
10.3
[
Bảng 10.3
Các thuộc tính thông dụng của đối tượng câu lệnh
Thuộc tính Mô tả
CommandText
Chuỗi chứa câu lệnh SQL hoặc tên của thủ tục tồn trữ. Nội dung của
thuộc tính
CommandText

phải tương thích với giá trị bạn chỉ định trong
thuộc tính
CommandType
.
398
Chương 10: Cơ sở dữ liệu
CommandTimeout
Số nguyên (
int
) chỉ định số giây đợi câu lệnh trả về trước khi hết thời
gian và ngoại lệ xảy ra. Mặc định là 30 giây.
CommandType
Một giá trị thuộc kiểu liệt kê
System.Data.CommandType
, chỉ định kiểu
câu lệnh được mô tả bởi đối tượng câu lệnh. Đối với hầu hết các data-
provider, giá trị hợp lệ là
StoredProcedure
(khi bạn muốn thực thi một
thủ tục tồn trữ), và
Text
(khi bạn muốn thực thi một câu lệnh SQL dạng
text). Nếu đang sử dụng OLE DB Data Provider, bạn có thể chỉ định
TableDirect
khi muốn trả về toàn bộ nội dung của một hoặc nhiều
bảng; hãy tham khảo tài liệu .NET Framework SDK để biết thêm chi
tiết. Mặc định là
Text
.
Connection

Đối tượng
IDbConnection
, cung cấp kết nối đến cơ sở dữ liệu mà bạn
sẽ thực thi câu lệnh trên đó. Nếu bạn tạo câu lệnh bằng phương thức
IDbConnection.CreateCommand
, thuộc tính này sẽ tự động được thiết
lập thành đối tượng
IDbConnection
mà bạn đã tạo câu lệnh từ nó.
Parameters
Đối tượng
System.Data.IDataParameterCollection
, chứa tập các
thông số để thay thế vào câu lệnh (xem mục 10.4 để biết cách sử dụng
thông số).
Transaction
Đối tượng
System.Data.IDbTransaction
, mô tả phiên giao dịch mà câu
lệnh được đưa vào đó (xem tài liệu .NET Framework SDK để biết thêm
chi tiết về phiên giao dịch).
Một khi bạn đã cấu hình đối tượng câu lệnh thì có nhiều cách để thực thi nó, tùy thuộc vào
bản chất của câu lệnh, kiểu dữ liệu do câu lệnh trả về, và bạn muốn xử lý dữ liệu theo định
dạng nào.
Để thực thi một câu lệnh như
INSERT
,
DELETE
, hoặc
CREATE TABLE

(không trả về dữ liệu trong
cơ sở dữ liệu), bạn hãy gọi
ExecuteNonQuery
. Đối với các câu lệnh
UPDATE
,
INSERT
, và
DELETE
,
phương thức
ExecuteNonQuery
trả về một số nguyên cho biết số hàng bị tác động bởi câu lệnh.
Đối với các câu lệnh khác như
CREATE TABLE
,
ExecuteNonQuery
trả về -1. Ví dụ dưới đây sử
dụng
UPDATE
để chỉnh sửa một bản ghi.
public static void ExecuteNonQueryExample(IDbConnection con) {
// Tạo và cấu hình câu lệnh mới.
IDbCommand com = con.CreateCommand();
com.CommandType = CommandType.Text;
com.CommandText = "UPDATE Employees SET Title = 'Sales Director'" +
" WHERE EmployeeId = '5'";
// Thực thi câu lệnh và xử lý kết quả.
int result = com.ExecuteNonQuery();
399

Chương 10: Cơ sở dữ liệu
if (result == 1) {
Console.WriteLine("Employee title updated.");
} else {
Console.WriteLine("Employee title not updated.");
}
}
Để thực thi một câu lệnh trả về một tập kết quả như lệnh
SELECT
hoặc thủ tục tồn trữ, bạn hãy
sử dụng phương thức
ExecuteReader
. Phương thức này trả về một đối tượng
IDataReader
(sẽ
được thảo luận trong mục 10.5) mà qua nó bạn có thể truy xuất đến dữ liệu kết quả. Hầu hết
các data-provider cũng cho phép bạn thực thi nhiều câu lệnh SQL trong một lời gọi phương
thức
ExecuteReader
; ví dụ trong mục 10.5 sẽ giải thích điều này và trình bày cách truy xuất
mỗi tập kết quả.
Đoạn mã dưới đây sử dụng phương thức
ExecuteReader
để thực thi thủ tục tồn trữ “Ten Most
Expensive Products” (mười sản phẩm đắt nhất) từ cơ sở dữ liệu Northwind và hiển thị kết quả
trong cửa sổ Console:
public static void ExecuteReaderExample(IDbConnection con) {
// Tạo và cấu hình câu lệnh mới.
IDbCommand com = con.CreateCommand();
com.CommandType = CommandType.StoredProcedure;

com.CommandText = "Ten Most Expensive Products";
// Thực thi câu lệnh và xử lý kết quả.
using (IDataReader reader = com.ExecuteReader()) {
Console.WriteLine("Price of the Ten Most Expensive Products.");
while (reader.Read()) {
// Hiển thị chi tiết về sản phẩm.
Console.WriteLine(" {0} = {1}",
reader["TenMostExpensiveProducts"],
reader["UnitPrice"]);
}
}
}
400
Chương 10: Cơ sở dữ liệu
Nếu muốn thực thi một truy vấn, nhưng chỉ cần giá trị thuộc cột đầu tiên của hàng đầu tiên
trong dữ liệu kết quả, bạn hãy sử dụng phương thức
ExecuteScalar
. Giá trị trả về là một tham
chiếu đối tượng và bạn cần ép nó về đúng kiểu. Dưới đây là ví dụ:
public static void ExecuteScalarExample(IDbConnection con) {
// Tạo và cấu hình câu lệnh mới.
IDbCommand com = con.CreateCommand();
com.CommandType = CommandType.Text;
com.CommandText = "SELECT COUNT(*) FROM Employees";
// Thực thi câu lệnh và ép kiểu kết quả.
int result = (int)com.ExecuteScalar();
Console.WriteLine("Employee count = " + result);
}

Các hiện thực

IDbCommand
trong
Oracle

SQL

Data Provider
có hiện thực các
phương thức thực thi câu lệnh bổ sung. Mục 10.6 sẽ mô tả cách sử dụng phương
thức
ExecuteXmlReader
do lớp
SqlCommand
cung cấp. Bạn hãy tham khảo tài liệu
.NET Frameworks SDK
để biết thêm chi tiết về các phương thức bổ sung
ExecuteOracleNonQuery

ExecuteOracleScalar
do lớp
OracleCommand
cung cấp.
4.
4.
S d ng thông s trong câu l nh SQL ho c th t c t n trử ụ ố ệ ặ ủ ụ ồ ữ
S d ng thông s trong câu l nh SQL ho c th t c t n trử ụ ố ệ ặ ủ ụ ồ ữ


Bạn cần thiết lập các đối số của một thủ tục tồn trữ hoặc sử dụng các thông số
trong một câu lệnh

SQL
để cải thiện tính linh hoạt.


Tạo đối tượng thông số phù hợp với kiểu đối tượng câu lệnh mà bạn dự định
thực thi; tất cả các đối tượng thông số đều hiện thực giao diện
System.Data.IDataParameter
. Cấu hình kiểu dữ liệu, giá trị, và hướng của đối
tượng thông số và thêm chúng vào tập hợp thông số của đối tượng câu lệnh bằng
phương thức
IDbCommand.Parameters.Add
.
Tất cả các đối tượng câu lệnh đều hỗ trợ việc sử dụng thông số, do đó bạn có thể thực hiện các
công việc sau:

Thiết lập các đối số của thủ tục tồn trữ

Lấy các giá trị trả về từ thủ tục tồn trữ

Đổi các giá trị thành các câu lệnh text lúc thực thi
Giao diện
IDataParameter
mô tả một thông số và mỗi data-provider chứa một hiện thực duy
nhất. Dưới đây là danh sách các hiện thực
IDataParameter
cho năm data-provider chuẩn:

×