
Th c thi l nh v i Database và C#ự ệ ớ
cách t o m t m nh l nh (command) và th c thi trên c s d li u (database). ạ ộ ệ ệ ự ơ ở ữ ệ
T o m t m nh l nh (CREATING A COMMAND) ạ ộ ệ ệ
Có r t nhi u cách ngoài cách s d ng SqlCommand nh ng mình s dùng cách này đấ ề ử ụ ư ẽ ể
làm ví d vì nó đ c cung c p t t nh t trong vi c liên k t v i c s d li u SQL. ụ ượ ấ ố ấ ệ ế ớ ơ ở ữ ệ
M Visual C# ch n Console Application và dùng th code sau đ phân tích : ở ọ ử ể
Code:
using System;
using System.Data;
using System.Data.SqlClient;
class MenhLenh
{
public static void Main()
{
// t o m t k t n iạ ộ ế ố
SqlConnection conn = new SqlConnection(@"Server = .\SQLEXPRESS;
Integrated Security =
True;
Database = Northwind");
// t o m t đ i t ng gi l nh c n th c thiạ ộ ố ượ ữ ệ ầ ự
SqlCommand cmd = new SqlCommand();
Console.WriteLine("Command created.");
try
{
// m k t n iở ế ố
conn.Open();
}
catch (SqlException e)
{
Console.WriteLine(e.ToString());
}
finally
{
// đóng k t n iế ố
conn.Close();
Console.WriteLine("Connection Closed.");
}
}
}
đây thông qua l p ‘SqlCommand’ mình t o m t đ i t ng đ n m gi thông tin vỞ ớ ạ ộ ố ượ ể ắ ữ ề
l nh. Sau khi t o xong thì thông báo ra Console “Command created.” Ch ng trình vệ ạ ươ ề
c b n là v y r t đ n gi n d hi u. Đó là cách t o đ i t ng n m gi m nh l nh.ơ ả ậ ấ ơ ả ễ ể ạ ố ượ ắ ữ ệ ệ
M nh l nh t o ra ch có tác d ng KHI VÀ CH KHI nó đ c ch đ nh th c thi trongệ ệ ạ ỉ ụ Ỉ ượ ỉ ị ự
k t n i nào. Vì v y ph i cho nó đi kèm v i m t k t n i t n t i đ t o và thi hànhế ố ậ ả ớ ộ ế ố ồ ạ ể ạ
m nh l nh đ c vi t ra. ệ ệ ượ ế
Ví d sau mình s minh h a các gán m nh l nh vào m t k t n i. ụ ẽ ọ ệ ệ ộ ế ố

Code:
using System;
using System.Data;
using System.Data.SqlClient;
class MenhLenh
{
public static void Main()
{
// t o m t k t n iạ ộ ế ố
SqlConnection conn = new SqlConnection(@"Server = .\SQLEXPRESS;
Integrated Security =
True;
Database = Northwind");
// t o m t đ i t ng gi l nh c n th c thiạ ộ ố ượ ữ ệ ầ ự
SqlCommand cmd = new SqlCommand();
Console.WriteLine("Command created.");
try
{
// m k t n iở ế ố
conn.Open();
// gán m nh l nh vào k t n iệ ệ ế ố
cmd.Connection = conn;
Console.WriteLine("Connected command to connection !");
}
catch (SqlException e)
{
Console.WriteLine(e.ToString());
}
finally
{
// đóng k t n iế ố
conn.Close();
Console.WriteLine("Connection Closed.");
}
}
}
B n d th y ví d này cũng chính là ví d ban đ u nh ng mình ch có thay đ i thêmạ ễ ấ ụ ụ ầ ư ỉ ổ
m t chút trong kh i l nh ‘try’ ộ ố ệ
Code:
// gán m nh l nh vào k t n iệ ệ ế ố
cmd.Connection = conn;
Console.WriteLine("Connected command to connection !");
Sau khi trên mình đã t o ra m t k t n i t i c s d li u và m t đ i t ng n m giở ạ ộ ế ố ớ ơ ở ữ ệ ộ ố ượ ắ ữ
m nh l nh thi hành thì bên d mình th gán m nh l nh v i k t n i. ệ ệ ướ ử ệ ệ ớ ế ố
Trong đ i t ng c a m nh l nh có m t thu c tính (properties) đ gán vào m t k t n iố ượ ủ ệ ệ ộ ộ ể ộ ế ố

nào đó :
CommandObject.Connection = ConnectionObject;
Nh trên thì sau khi gán k t n i xong thì Console s thông báo ra k t qu là gánư ở ế ố ẽ ế ả
m nh l nh vào k t n i thành công. ệ ệ ế ố
Câu h i đ t ra đây là : T i sao không gán k t n i ngay khi t o ra đ i t ng k t n iỏ ặ ở ạ ế ố ạ ố ượ ế ố
mà ph i cho vào kh i ‘try..catch..finally’ làm cái gì ? ả ố
Câu tr l i r t d hi u: B n th nghĩ xem sau khi b n t o k t n i thì mu n kích ho tả ờ ấ ễ ể ạ ử ạ ạ ế ố ố ạ
và ki m tra k t n i có t t hay không thì ph i ném vào trong kh i ‘try..catch’. Gi sể ế ố ố ả ố ả ử
mà b n khai báo gán m nh l nh ngay tr c kh i ‘try..catch’ và k t n i thành côngạ ệ ệ ở ướ ố ế ố
thì không có l i gì c . Nh ng trong tr ng h p n u có l i bi n c b t ng x y ra thìỗ ả ư ườ ợ ế ỗ ế ố ấ ờ ả
khi gán m nh l nh vào k t n i s có l i và ch ng trình s ng ng ho t đ ng và tìnhệ ệ ế ố ẽ ỗ ươ ẽ ư ạ ộ ở
tr ng treo mà v n tiêu th tài nguyên máy, r t lãng phí. Vì v y mà t t nh t gán trongạ ẫ ụ ấ ậ ố ấ
kh i ‘try..catch’ sau khi m k t n i đ g p l i thì ta có th bi t đ c l i và nguyênố ở ế ố ể ặ ỗ ể ế ượ ỗ
nhân gây l i và s a (debug).Gi i thích th này không bi t có hi u không ^_^! ỗ ử ả ế ế ể
Tuy nhiên n u b n ch c ch n là k t n i đ m b o t t thì b n có th gán m nh l nhế ạ ắ ắ ế ố ả ả ố ạ ể ệ ệ
vào k t n i ngay t đ u và rút ng n l i code ế ố ừ ầ ắ ạ
Code:
SqlCommand cmd = conn.CreateCommand();
T ng đ ng v i 2 dòng code ươ ươ ớ
code:
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
B n đã t o đ c đ i t ng n m gi m nh l nh và gán đ c vào k t n i, bây giạ ạ ượ ố ượ ắ ữ ệ ệ ượ ế ố ờ
ph i vi t m nh l nh cho đ i t ng. ả ế ệ ệ ố ượ
Ta dùng thu c tình ‘CommandObject.CommandText’ đ t o m t l nh c n th c thi v iộ ể ạ ộ ệ ầ ự ớ
c s d li u. ơ ở ữ ệ
B n v n dùng code trên nh ng ch thay đ i đi ph n code trong kh i ‘try..catch’ b ngạ ẫ ở ư ỉ ổ ầ ố ằ
ph n code d i đây nhé : ầ ướ
Code:
try
{
// m k t n iở ế ố
conn.Open();
// gán m nh l nh vào k t n iệ ệ ế ố
cmd.Connection = conn;
Console.WriteLine("Connected command to connection !");
// t o m t l nh cho đ i t ng ạ ộ ệ ố ượ
cmd.CommandText = @" SELECT count(*) FROM Employees ";
Console.WriteLine(" Ready to execute SQL command : {0} ",
cmd.CommandText);
}

B n đ ý đây t có thêm 2 dòng code khác bên d i. ạ ể ở ớ ướ
‘CommandText’ đây là m t l nh SQL, n u b n vi t cái gì đó khác h n là m t câuở ộ ệ ế ạ ế ơ ộ
l nh SQL thì s có l i thông báo khi th c thi l nh này, đây là đo n trick n u mà b nệ ẽ ỗ ự ệ ạ ế ạ
không thông th o v c u trúc câu l nh SQL . Xem bài 1 ‘C b n v SQL cho ng iạ ề ấ ệ ơ ả ề ườ
m i b t đ u’ đ bi t chút c b n ban đ u v SQL nhé. ớ ắ ầ ể ế ơ ả ầ ề
Th c thi m nh l nh (EXECUTING COMMAND) ự ệ ệ
Bây gi th th c thi câu l nh nhé xem k t qu th nào. Nh ng khi th c thi m t l nhờ ử ự ệ ế ả ế ư ự ộ ệ
thì k t qu s cho ra khác nhau n u nh b n s d ng ph ng th c th c thi (executionế ả ẽ ế ư ạ ử ụ ươ ứ ự
method) khác nhau. Có 4 cách th c thi l nh theo b ng sau : ự ệ ả
1. ExecuteNonQuery() -------------------> không tr v gì vì không ph i Query ả ề ả
2. ExecuteScalar() -------------------> M t giá tr duy nh t ộ ị ấ
3. ExecuteReader() -------------------> Không ho c nhi u hàng ặ ề
4. ExecuteXmlReader -------------------> XML
À b n có th hi u query là m t bi u th c có giá tr tr v . ạ ể ể ộ ể ứ ị ả ề
Bây gi v n bài trên t dùng ‘ExecuteScalar’ đ thu giá tr l y v ờ ẫ ở ớ ể ị ấ ề
using System;
using System.Data;
using System.Data.SqlClient;
class MenhLenh
{
public static void Main()
{
// t o m t k t n iạ ộ ế ố
SqlConnection conn = new SqlConnection(@"Server = .\SQLEXPRESS;
Integrated Security =
True;
Database = Northwind");
// t o m t đ i t ng gi l nh c n th c thiạ ộ ố ượ ữ ệ ầ ự
SqlCommand cmd = new SqlCommand();
Console.WriteLine("Command created.");
try
{
// m k t n iở ế ố
conn.Open();
// gán m nh l nh vào k t n iệ ệ ế ố
cmd.Connection = conn;
Console.WriteLine("Connected command to connection !");
// t o m t l nh cho đ i t ng ạ ộ ệ ố ượ
cmd.CommandText = @"SELECT count(*) FROM Employees ";
Console.WriteLine("Ready to execute SQL command : {0} ",
cmd.CommandText);
// Th c thi câu l nh ự ệ

Console.WriteLine("Number of Employees is {0} ",
cmd.ExecuteScalar());
}
catch (SqlException e)
{
Console.WriteLine(e.ToString());
}
finally
{
// đóng k t n iế ố
conn.Close();
Console.WriteLine("Connection Closed.");
}
}
}
đây b n s thu k t qu là : ‘Number of Employees is 9’. Ở ạ ẽ ế ả
B n h c thêm m t câu l nh SQL m i luôn nhé. Đ đ m s dòng (rows) trong m tạ ọ ộ ệ ớ ể ế ố ộ
b ng ta dùng tham s ‘count(*)’ ả ố
Cách g i : ọ
SELECT count(*) FROM <table_name>
Giá tr tr v là ki u ‘Object’ và có m t k t qu nên s d ng ‘ExecuteScalar’. ị ả ề ể ộ ế ả ử ụ
B n nên chú ý đây : ‘ExecuteScalar’ tr v ki u ‘Object’ và trong môi tr ng .NETạ ở ả ề ể ườ
Framework thì c s d li u có th ch a b t c ki u d li u nào. Khi đ a ra Consoleơ ở ữ ệ ể ứ ấ ứ ể ữ ệ ư
dùng ‘WriteLine’ thì t t c các ki u đ u b convert sang ki u kí t in ra màn hình h t. ấ ả ể ề ị ể ự ế
B n có th chuy n giá tr thu đ c v m t ki u nào đó nh ng n u convert không h pạ ể ể ị ượ ề ộ ể ư ế ợ
l thì s có ‘Runtime Error : Invaliad type cast’ hay gì đó đ i lo i nh th . ệ ẽ ạ ạ ư ế
Mình gi s bài trên mình mu n giá tr thu v ki u ‘Int’ thì mình code nh sau : ả ử ở ố ị ề ể ư
int count = (int)cmd.ExecuteScalar();
Console.WriteLine(“ Number of Employees is {0} “, count);
N u nh mình v n dùng thêm cái code convert ngay trên đây và thay đ i đi câu l nhế ư ẫ ở ổ ệ
th c thi (commandText) thành : ự
cmd.CommandText = “SELECT firstname FROM employees WHERE lastname =
‘Davolio’
Thì v i ExecuteScalar() s tr v ki u Object có giá tr là “Nancy” th c ch t là ki uớ ẽ ả ề ể ị ự ấ ể
String (C#) nh ng mà trên b n l i cast nó sang ki u ‘Int’ và màn hình s thông báoư ở ạ ạ ể ẽ
l i nh sau ỗ ư
Unhandled Exception : System.InvalidCastException: Specified cast is not valid.
Ki u ‘String’ không th b convert sang ki u ‘Int’. ể ể ị ể
Bây gi chúng ta cùng th c hi n câu l nh thu v nhi u k t qu xem. T t nhiên là sờ ự ệ ệ ề ề ế ả ấ ử
d ng : ExecuteReader() ụ
using System;