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 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;