You are on page 1of 189

I HC HU I HC KHOA HC KHOA CNG NGH THNG TIN

GIO TRNH C# V NG DNG


NGUYN HONG H NGUYN VN TRUNG

HU - 2008

Gio trnh Visual Studio .NET

CHNG 1 TNG QUAN V .NET FRAMEWORK


1.1 Tng quan v kin trc ca .NET Framework .NET Framework c thit k nh l mi trng tch hp n gin ha vic pht trin v thc thi cc ng dng trn Internet, trn desktop di dng Windows Forms, hoc thm ch l trn c cc thit b di ng (vi Compact Framework). Cc mc tiu chnh m .NET framework hng n l: - Cung cp mt mi trng hng i tng nht qun cho nhiu loi ng dng - Cung cp mt mi trng gim ti thiu s xung t phin bn (DLL Hell a ngc DLL) tng lm iu ng cc lp trnh vin Windows (COM), v n gin ha qu trnh trin khai/ci t. - Cung cp mt mi trng linh ng, da trn cc chun c chng nhn c th cha trn bt c h iu hnh no. C# v mt phn chnh ca mi trng thc thi .NET, CLI (Common Language Infrastructure H tng ngn ng chung) c chun ha bi ECMA. - cung cp mt mi trng qun l c, trong m c d dng xc thc thc thi an ton. Kin trc ca .NET Framework c thit k thnh 2 phn: CLR (Common Language Runtime Khi thc thi ngn ng chung) v FCL (Framework Class Library Th vin lp khung) nh hnh di

Hnh 1.1 Kin trc .NET Framework


Gio trnh Visual Studio .NET

CLR, phn ci t CLI ca Microsoft, lm nhim v qun l s thc thi m lnh v tt c cc tc v lin quan n n: bin dch, qun l b nh, bo mt, qun l tuyn on, v thc thi an ton kiu. M lnh thc thi trong CLR c gi l m c qun l (managed code), phn bit vi m khng c qun l (unmanaged code), l m lnh khng ci t nhng yu cu thc thi trong CLR chng hn nh COM hoc cc thnh phn da trn Windows API. FCL l th vin kiu d liu c th ti s dng (gm cc class, structure, ) dnh cho cc ng dng thc thi trong .NET. Tt c cc ngn ng h tr .NET Framework u s dng th vin lp dng chung ny. 1.2 Mi trng thc thi ngn ng chung CLR (Common Language Runtime) CLR (Common Languge Runtime Mi trng thc thi ngn ng chung) qun l ton b vng i ca mt ng dng: n np cc lp c lin quan, qun l s thc thi ca cc lp, v m bo qun l b nh mt cch t ng. Ngoi ra, CLR cn h tr tch hp gia cc ngn ng cho php m lnh c sinh ra bi cc ngn ng khc nhau c th tng tc vi nhau mt cch lin mch. 1.2.1 Bin dch m lnh .NET Trnh bin dch tng thch vi CLR s sinh m thc thi cho mi trng thc thi ch khng phi l m thc thi cho CPU c th. M thc thi ny c bit n qua tn gi CIL (Common Intermediate Language Ngn ng trung gian chung), hay MSIL (Microsoft Intermediate Language Ngn ng trung gian ca Microsoft); l ngn ng kiu assembler c ng gi trong cc file EXE hoc DLL. Cc file ny khng phi thuc dng file c th thc thi nh thng thng, chng cn trnh bin dch JIT (Just-inTime) ca mi trng thc thi chuyn i IL cha trong n sang dng m lnh c th ca my khi ng dng thc s thc thi. Qu trnh bin dch, thc thi mt chng trnh trong .NET framework c th tm tt nh sau: - Chng trnh ngun trc ht s c bin dch v ng gi thnh mt khi gi l assembly. Khi ny s cha cc m lnh ngn ng trung gian v cc metadata m t thng tin cn thit cho s hot ng ca khi. - Mi khi c yu cu thc thi assembly ni trn, CLR s chuyn i m lnh ngn ng trung gian trong assembly thnh m lnh tng thch vi CPU c th trc
Gio trnh Visual Studio .NET

khi c th thc thi.

Hnh 1.2 Chc nng ca CLR Nh vy, lp trnh vin c th s dng bt c ngn ng no pht trin ng dng trn .NET framework, min l ngn ng c h tr .NET framework. iu c bit l, do s dng chung h thng kiu d liu, nn tnh nng lin thng gia cc ngn ng trn .NET framework l rt cao. 1.2.2 H thng kiu d liu chung CTS (Common Type System) CTS cung cp mt tp c s cc kiu d liu cho mi ngn ng hot ng trn .NET platform. Ngoi ra, n c t cch khai bo v to cc kiu d liu ty bin, cch qun l vng i ca mt th hin ca nhng kiu d liu ny. Hnh di y m t cch t chc CTS ca .NET

Gio trnh Visual Studio .NET

Hnh 1.3 Cc kiu d liu c s ca CTS Mi kiu d liu trong .NET u c k tha t kiu d liu System.Object. Cc kiu d liu c chia lm hai loi: kiu tham chiu v kiu gi tr. Kiu d liu tham chiu c x l trong mt vng nh c bit gi l heap thng qua cc con tr. Kiu d liu gi tr c tham chiu trc tip trong stack ca chng trnh. 1.2.3 Assemblies Tt c cc m c qun l thc thi trong .NET u phi c cha trong mt assembly. Mt assembly c xem nh l mt file EXE hoc DLL. Mt asembly c th cha mt tp hp gm mt hay nhiu file cha phn m lnh hoc ti nguyn (nh nh hoc d liu XML). Mt assembly c to ra khi trnh bin dch tng thch vi .NET chuyn mt file cha m ngun thnh mt file DLL hoc EXE. Nh minh ha trong hnh 1.4, mt assembly cha mt manifest, metadata, v ngn ng trung gian sinh bi trnh bin dch c th. Manifest: Mi assembly phi c mt file cha mt manifest. Manifest ny l mt tp hp cc bng cha cc metadata trong lit k tn ca tt c cc file trong assembly, tham chiu n cc assembly bn ngoi, v cc thng tin nh tn, phin bn nh danh assembly . Mt s assembly cn c c ch k in t duy nht (unique digital signature). Khi mt assembly c np, nhim v u tin ca CLR l m file cha manifest c th nh danh cc thnh vin c trong assembly. Metadata: Ngoi cc bng trong manifest va nh ngha, trnh bin dch C# cn sinh ra cc bng nh ngha v bng tham chiu. Bng nh ngha cung cp mt ghi ch y
Gio trnh Visual Studio .NET

v cc kiu cha trong IL. V d, c cc bng nh ngha kiu, phng thc, trng d liu, tham s, v thuc tnh. Bng tham chiu cha cc thng tin v tt c cc tham chiu v kiu v cc assembly khc. Trnh bin dch JIT ph thuc vo cc bng ny chuyn IL sang m my. IL: Vai tr ca IL c cp trc y. Trc khi CLS c th s dng IL, n phi c ng gi vo trong mt assembly dng DLL hoc EXE. Assembly dng EXE phi c mt im nhp (entry point) n c th thc thi. Ngc li, Assembly dng DLL, c thit k hot ng nh l mt th vin m lnh nm gi cc nh ngha kiu.

Hnh 1.4 Assembly ch gm 1 file Assembly khng ch l cch logic ng gi cc m thc thi. N quy nh m hnh ch yu ca .NET trin khai m lnh, qun l phin bn, v bo mt. - Tt c cc m c qun l, cho d l mt chng trnh n, mt iu khin, hay mt th vin DLL cha cc kiu d liu ti s dng, u c ng gi vo mt assembly. y l khi c bn nht c th trin khai trn h thng. Khi mt ng dng c bt u, ch nhng assembly c yu cu cho vic khi to mi cn hin din. Cc assembly khc s c np khi c yu cu. Cc nh pht trin c th phn ng dng thnh cc assembly da theo mc thng xuyn s dng. - Trong th gii .NET, mt assembly quy nh mt bin gii phin bn. Trng Version Number trong manifest p dng cho tt c cc kiu v ti nguyn trong assembly. V vy, mi file to nn assembly c xem nh l mt n v n nht c cng phin bn. - Mt assembly cng thit lp mt bin gii bo mt nh ra quyn hn truy xut.
Gio trnh Visual Studio .NET

C# s dng cc b t truy cp iu khin cch m cc kiu v thnh phn kiu trong mt assembly c truy xut. Hai trong s ny c s dng trong assembly, l public cho php truy xut ty t assembly bt k ; v internal gii hn truy xut n cc kiu v thnh vin bn trong assembly. Nh cp trn, mt assembly c th cha nhiu file. Nhng file ny khng gii hn l cc module m lnh m c th l cc file ti nguyn nh file hnh nh hoc vn bn. Mt cch s dng tnh cht ny trong thc t l chng ta c th to ra ng dng a ngn ng, trong ng dng s cng s dng chung cc module logic, phn giao din hoc cc ti nguyn khc c th c trin khai ring thnh cc file c lp. Khng c gii hn v s lng file trong mt assembly. Hnh 1.5 minh ha b cc ca mt assembly cha nhiu file.

Hnh 1.5 - Assembly cha nhiu file Trong minh ha assembly cha nhiu file, manifest ca assembly cha thng tin nh danh mi file c s dng trong assembly. Mc d hu ht cc assembly u cha mt file duy nht. Sau y l cc thun li ca assembly cha nhiu file: - C th t hp cc module c to ra t nhiu ngn ng lp trnh khc nhau. - Cc module m lnh c th c phn ra ti u cch m m lnh c np vo trong CLR. Cc m lnh c lin quan v c s dng thng xuyn nn c t vo trong cng mt module; nhng m lnh t khi c s dng s c t vo trong module khc. CLR khng np cc module no khi cha thc s cn thit. Gio trnh Visual Studio .NET 7

- Cc file ti nguyn c th c t vo trong module ca ring n, qua cho php nhiu ng dng c th chia s ti nguyn dng chung. 1.2.4 Private Assembly v Shared Assembly Cc assembly c th c trin khai theo hai dng: private assembly v global assembly. Private assembly l assembly c t trong th mc ca ng dng hoc th mc con ca n. Qu trnh ci t v cp nht private assembly ch n gin l chp assembly vo trong th mc cn thit, khng cn thit lp thng tin trong registry. i khi, c th dng thm mt file cu hnh ng dng c th ghi mt s thit lp trong manifest ca ng dng. Shared assembly l assembly c ci t vo v tr ton cc, gi l Global Assembly Cache (GAC), l ni c th truy xut c t nhiu ng dng. im quan trng nht ca GAC l n cho php nhiu phin bn ca mt assembly c th c thc thi. h tr iu ny, .NET khc phc vn xung t tn bng cch s dng 4 thuc tnh nh danh 1 assembly, bao gm: Assembly Name (tn assembly), Culture Identity (nh danh vn ha), Version (phin bn), v Public Key Token (du hiu m kha cng khai). Cc shared assembly thng c t trong th mc assembly di th mc h thng ca h iu hnh (WINNT\ trong Windows 2000, WINDOWS\ trong Windows XP). Nh m t hnh 1.6, cc assembly c lit k theo nh dng c bit hin th 4 thuc tnh ca chng (.NET Framework bao gm mt file DLL m rng Windows Explorer cho php n c th hin th ni dung GAC). - Assembly Name: cn c gi l tn thng gi, l tn file ca assembly khng cha phn m rng. - Version: Mi assembly c mt s hiu phin bn dng cho tt c cc file trong assembly. N cha 4 s theo nh dng:
<major number>.<minor number>.<build>.<revision>

Thng thng cc s <major number> v <minor number> c cp nht cho nhng ln thay i mang tnh ph v tnh tng thch ngc. Mt s hiu phin bn c th c gn cho mt assembly bng cch nh thuc tnh AssemblyVersion trong phn m ngun ca assembly. - Culture Setting: Ni dung ca mt assembly c th c kt hp vi mt vn ha hay ngn ng c th. Thit lp ny c ch nh bng m hai k t kiu nh en cho English, vi cho Vietnam, v c th c gn vi thuc tnh
Gio trnh Visual Studio .NET

AssemblyCulture t trong m ngun ca assembly


[assembly: AssemblyCulture ("fr-CA")]

- Public Key Token: m bo mt shared assembly l duy nht v ng tin cy, .NET yu cu ngi to ra assembly phi nh du bng mt nh danh mnh. Qu trnh ny c gi l k, yu cu s dng cp kha cng khai/ring t. Khi trnh bin dch xy dng assembly, n s s dng kha ring t sinh ra mt nh danh mnh. Token c sinh ra y l 8 byte cui cng ca php bm (hashing) kha cng khai. Token ny s c t trong manifest ca bt k assembly client no c tham chiu n shared assembly v s dng n nh danh assembly trong qu trnh thc thi. Mt assembly c gn mt cp kha cng khai/ring th c gi l mt assembly nh danh mnh. Mi assembly u phi c nh danh mnh.

Gio trnh Visual Studio .NET

Hnh 1.6 Th mc Global Assembly trong mt h thng Windows XP 1.2.5 Tin bin dch mt Assembly Sau khi mt assembly c np vo CLR, IL phi c bin dch sang thnh m my trc khi thc s c thc thi. .NET Framework c cung cp mt cng c gi l Ngen (Native Image Generator), dng bin dch mt assembly thnh mt native image c lu trong native image cache mt vng dnh ring ca GAC. Mi khi CLR np mt assembly, n s kim tra trong cache xem c native image tng ng cha; nu c n s np m bin dch ch khng cn bin dch thm ln na. y l tnh nng m nu c khai thc hp l th c th tn dng ci thin hiu nng 1.2.6 Kim chng m lnh (Code Verification) Nh l mt phn ca qu trnh bin dch JIT, CLR thc hin hai loi kim chng: kim
Gio trnh Visual Studio .NET

10

chng IL v hp l ha metadata bo m m lnh c an ton kiu. Trong thc t, iu ny c ngha l cc tham s trong li gi v phng thc c gi phi c kim tra m bo chng c cng kiu d liu, hoc l mt phng thc ch tr v ng kiu c c t trong khai bo tr v. Ni ngn gn, CLR s xem xt trong IL v metadata m bo mi gi tr c gn cho mt bin l tng thch kiu; nu khng s c mt ngoi l xut hin. Thun li ca m lnh c kim chng l CLR c th chc chn m lnh s khng nh hng n ng dng khc theo kiu truy xut n vng nh ngoi vng cho php ca n. Do CLR t do thc thi nhiu ng dng trong cng mt tin trnh hay khng gian a ch.

Gio trnh Visual Studio .NET

11

CHNG 2 NGN NG LP TRNH C#


2.1 Chng trnh u tin Chng ta s lm quen vi ngn ng lp trnh C# v mi trng tch hp pht trin (IDE Integrated Development Environment) Visual Studio .NET bng cch xy dng mt ng dng u tin, ng dng firstApp. ng dng ny cho php ngi s dng nhp vo 2 s, sau in ra mn hnh tng, tch v thng ca hai s va nhp. Trnh t thc hin nh sau: 1. Khi ng Microsoft Visual Studio 2005. Nhn Ctrl + Shift + N hoc chn menu tng ng l File New Project to mi mt project

2. Chn loi ng dng cn pht trin l Visual C# Windows Console Application. Sau , chn th mc cha project v t tn cho project nh minh ha hnh trn. Ch , y, chng ta b chn hp kim Create directory for solution. Ch thch:
Gio trnh Visual Studio .NET

12

Visual Studio .NET coi mt bi ton cn gii quyt l mt solution. Mt solution c th bao gm mt hoc nhiu project. Mt solution, nu c nhiu project th nn c to ra trong mt th mc ring c th cha cc project trong n. y, solution ch c duy nht mt project, th nn khng cn thit phi to ra mt th mc cho solution. 3. Sau khi nhn nt OK, hy kho st xem cu trc ca th mc cha solution ca chng ta. Bn phi lun nm chc v s tn ti, ngha ca cc tp tin, th mc c to ra trong qu trnh lm vic!

4. G m lnh nh minh ha vo trong phn m ngun ca tp tin Program.cs

Gio trnh Visual Studio .NET

13

5. Bn c th s dng MSDN tra cu cc thng tin bn cha bit v: a. Lp Console v cc phng thc ReadLine(), WriteLine() ca n b. Cch chuyn i kiu chui thnh s, v d nh int.Parse() 6. Nhn Ctrl + F5 thc hin bin dch v chy chng trnh. Sau quan st cu trc th mc ca solution, cho bit s thay i ca n so vi khi mi c to ra bc 3 (xem th mc bin v th mc obj ca project). 7. Th thay i kt cu lnh
float thuong = (float)x / y;

thnh
float thuong = x / y;

ri chy chng trnh, quan st kt qu v rt ra kt lun. 8. S dng thm cc cu trc lnh khc tinh chnh hot ng ca chng trnh (x l php chia cho 0, ) R rng, on chng trnh n gin trn khng phi l qu phc tp i vi ngi
Gio trnh Visual Studio .NET

14

tng lm quen vi cc ngn ng lp trnh bc cao. 2.2 Bin d liu Bin trong C# c khai bo theo c php nh sau:
datatype identifier;

V d:
int i;

Cu lnh ny khai bo mt s int tn l i. Trnh bin dch thc s cha cho php s dng bin ny cho n khi chng ta khi to n bng mt gi tr. Lnh khai bo ny ch lm nhim v cp pht mt vng nh (4 bytes) cho bin i. Sau khi khai bo, chng ta c th gn mt gi tr cho bin bng ton t gn =, nh sau:
i = 10;

Chng ta cng c th va khai bo, va khi to gi tr cho bin cng lc:


int i = 10; // khai bao va khoi tao gia tri cho bien int double x = 10.25, y = 20; // khai bao va khoi tao hai bien double

2.2.1 Tm hot ng ca bin Tm hot ng ca mt bin l vng m lnh m trong bin c th truy xut. Ni chung, tm hot ng ca bin c xc nh theo cc quy tc sau: Mt trng d liu (field), cn c gi l mt bin thnh phn ca mt lp i tng s c tm hot ng trong phm vi lp cha n. Mt bin cc b s c tm hot ng trong khi khai bo n (trong cp du ngoc nhn { }) Mt bin cc b c khai bo trong cc lnh lp for, while, s c tm hot ng trong thn vng lp Tt nhin, trong cng phm vi hot ng, khng c c hai bin c trng tn. 2.2.2 Hng d liu Hng d liu l bin c gi tr khng c php thay i trong sut thi gian tn ti ca n. Cch khai bo ca hng d liu l tng t nh i vi bin d liu, ch khc l c thm t kha const u.
Gio trnh Visual Studio .NET

15

const int a = 100;

// Gia tri nay khong duoc thay doi

Hng d liu c cc c tnh sau: Phi c khi to ngay khi n c khai bo, sau khng c php thay i gi tr ca hng. Gi tr ca hng d liu phi c tnh ton trong thi im bin dch. V vy, chng ta khng th khi to mt hng s c gi tr c ly t mt bin d liu. Nu cn iu ny, chng ta s dng trng d liu kiu read-only. 2.3 Cc kiu d liu nh ngha sn ca C# C# phn kiu d liu thnh hai loi (tng t nh cch phn loi chung trong CTS): kiu d liu gi tr v kiu d liu tham chiu. V mt khi nim, im khc bit gia hai kiu d liu ny l, bin kiu d liu gi tr lu gi trc tip mt gi tr, trong khi , bin kiu tham chiu lu gi tham chiu n mt gi tr d liu. V mt lu tr vt l, bin ca hai kiu d liu ny c lu vo hai vng nh khc nhau ca chng trnh, l vng nh stack (cho bin d liu kiu gi tr) v vng nh heap (cho bin d liu kiu tham chiu). Bn cn c bit lu hiu ng ca cc php gn i vi kiu d liu kiu tham chiu. 2.3.1 Kiu d liu gi tr c nh ngha sn Cc kiu d liu gi tr c nh ngha sn bao gm s nguyn, s du chm phy ng, k t v boolean. 2.3.1.1 Cc kiu s nguyn C# h tr sn 8 kiu s nguyn: Tn sbyte short int long byte ushort uint Kiu trong CTS System.SByte System.Int16 System.Int32 System.Int64 System.Byte System.UInt16 System.UInt32 M t S nguyn c du 8-bit S nguyn c du 16-bit S nguyn c du 32-bit S nguyn c du 64-bit S nguyn khng du 8bit S nguyn khng du 16bit S nguyn khng du 32bit Vng biu din (min:max) -27:27-1 -215:215-1 -231:231-1 -263:263-1 0:28-1 0:216-1 0:232-1 16

Gio trnh Visual Studio .NET

ulong

System.UInt64

S nguyn khng du 64bit

0:264-1

2.3.1.2 Cc kiu s du chm ng Cc kiu s thc du chm ng c h tr sn ca C# bao gm:


Tn float double Kiu trong CTS System.Single System.Double S ch s c ngha 7 15/16 Vng biu din tng i (khong) 1.5 10-45 to 3.4 1038 5.0 10-324 to 1.7 10308

2.3.1.3 Kiu s thp phn biu din s thp phn vi chnh xc cao hn s thc du chm ng, C# h tr kiu d liu s thp phn:
Tn decimal Kiu trong CTS System.Decimal S ch s c ngha 28 Vng biu din 1.0 10-28 to 7.9 1028

2.3.1.3 Kiu boolean Tng ng vi System.Boolean trong CTS, C# c kiu d liu bool, c th nhn mt trong hai gi tr true hoc false. C mt iu lu , kiu d liu bool khng c nhn cc gi tr nguyn nh mt s ngn ng (C, C++) 2.3.1.4 Kiu k t lu tr gi tr ca mt k t n, C# h tr d liu kiu k t
Tn char Kiu trong CTS System.Char Gi tr Biu din 1 k t 16-bit (Unicode)

Cc hng kiu k t c gn bng cch ng trong cp du nhy n, v d 'A'. Cng c th biu th hng k t di dng s thp lc phn, kiu nh \u0041, hoc p kiu nh (char)65. Ngoi ra c th s dng mt s k t escape sau:
K t escape \' \" \\ \0 \a \b \f \n \r Gio trnh Visual Studio .NET K t tng ng Du nhy on Du nhy i K t \ Null K t Alert K t Backspace K t Form feed K t xung dng K t Carriage return

17

\t \v

K t Tab K t Vertical tab

2.3.2 Kiu d liu tham chiu c nh ngha sn C# h tr sn hai kiu d liu tham chiu:
Tn object string Kiu CTS System.Object System.String M t Kiu d liu gc, mi kiu d liu khc trong CTS u k tha t y (k c cc kiu d liu gi tr) Chui k t Unicode

2.3.2.1 Kiu d liu object object l kiu d liu gc, c bn nht m t , tt c cc kiu d liu khc u phi k tha (trc tip hoc gin tip). Cc thun li chng ta c c t kiu d liu object l: - Chng ta c th s dng tham chiu i tng gn kt vi mt i tng ca bt k kiu d liu con no. Tham chiu i tng cng c s dng trong nhng trng hp m m lnh phi truy xut n nhng i tng cha r kiu d liu (tng t nh vai tr con tr void C++) - Kiu object c ci t mt s phng thc c bn, dng chung, bao gm: Equals(), GetHashCode(). GetType(), v ToString(). Cc lp do ngi s dng t nh ngha c th ci t li cc phng thc ny theo k thut gi l overriding (ghi ) trong lp trnh hng i tng. 2.3.2.2 Kiu d liu string Kiu d liu string c cung cp sn trong C# vi nhiu php ton v cch thc hot ng thun tin l mt trong nhng kiu d liu c s dng nhiu nht khi lp trnh. i tng string c cp pht trong vng nh heap, v khi gn mt bin string cho mt bin khc, chng ta s c hai tham chiu n cng mt chui trong b nh. Tuy nhin, khi thay i ni dung ca mt trong cc chui ny, chui thay i s c to mi hon ton, khng nh hng n cc chui khc. Hy xem hiu ng ny trong on chng trnh di y:
using System; class MinhHoaString { public static int Main() { string s1 = "a string"; string s2 = s1;

Gio trnh Visual Studio .NET

18

Console.WriteLine("s1 is Console.WriteLine("s2 is s1 = "another string"; Console.WriteLine("s1 is Console.WriteLine("s2 is return 0; } }

" + s1); " + s2); now " + s1); now " + s2);

Kt qu ca on chng trnh trn l:


s1 s2 s1 s2 is is is is a string a string now another string now a string

Ni cch khc, vic thay i gi tr ca s1 khng nh hng g n s2, ngc vi nhng g chng ta trng i kiu d liu tham chiu. Hng kiu chui c bao trong cp du nhy kp (). Trong chui c th cha cc dy k t escape nh i vi kiu d liu k t. Do dy k t escape c bt u bng k t \ nn k t \ phi c lp i:
string filepath = "C:\\CSharp\\MinhHoaString.cs";

C mt gii php khc biu din k t \ trong chui, l dng c php @:


string filepath = @"C:\CSharp\MinhHoaString.cs";

C php ny cn cho php chng ta ngt dng trong hng chui, nh sau:
string st = @"'Day la dong thu nhat Day la dong thu hai.";

Khi , gi tr ca chui st s l:
'Day la dong thu nhat Day la dong thu hai.

2.4 Lung iu khin chng trnh 2.4.1 Cu lnh iu kin Cc cu lnh iu kin cho php phn nhnh m lnh theo cc iu kin c th. C# c hai cu trc phn nhnh if v switch.
Gio trnh Visual Studio .NET

19

2.4.1.1 Cu lnh if Cu lnh if ca C# c k tha t cu trc if ca C v C++. C php ca n l:


if (condition) statement1(s) [else statement2(s)]

Nu c nhiu hn mt cu lnh c thc thi tng ng vi mt trong hai gi tr ca biu thc logic condition, chng ta c th gp cc lnh ny trong cp du ngoc nhn ({ ... }) (iu ny cng c p dng cho nhiu cu trc lnh khc m chng ta s cp sau ny):
bool isZero; if (i == 0) { isZero = true; Console.WriteLine("i is Zero"); } else { isZero = false; Console.WriteLine("i is Non-zero"); }

iu ng lu nht khi s dng cu lnh if l condition nht thit phi l mt biu thc logic (ch khng th l mt s nh C/C++). 2.4.1.2 Cu lnh switch Cu lnh switch l mt cu lnh iu khin qun l nhiu la chn v lit k bng cch chuyn iu khin n mt trong nhng cu lnh case trong thn ca n:
switch (expression) { case const_1: statement_1; break; case const_2: statement_2; break; ... case const_n: statement_n; break; [default: statement_n+1; break;]

Gio trnh Visual Studio .NET

20

Ch rng, iu khin c chuyn n nhnh r tng ng vi gi tr ca biu thc. Cu lnh switch c th cha nhiu nhnh r nhng khng c hai nhnh r no c c cng gi tr. Vic thc thi thn cu lnh c bt u ti nhnh c la chn v tip tc cho n khi c chuyn ra ngoi qua lnh break. Cu lnh nhy break l bt buc i vi mi nhnh r, ngay c khi l nhnh r cui cng hoc l nhnh r default. Nu biu thc khng ng vi nhnh no ca lnh switch th iu khin s c chuyn n cc cu lnh sau nhn default (nu c). Nu khng c nhn default, iu khin c chuyn ra bn ngoi cu lnh switch. V d:
switch (integerA) { case 1: Console.WriteLine("integerA break; case 2: Console.WriteLine("integerA break; case 3: Console.WriteLine("integerA break; default: Console.WriteLine("integerA break; }

=1"); =2"); =3"); is not 1,2, or 3");

2.4.2 Cu lnh lp C# cung cp bn loi lnh lp (for, while, do...while, v foreach) cho php lp trnh vin c th thc thi mt khi lnh lin tip cho n khi mt iu kin xc nh no c tha mn. 2.4.2.1 Cu lnh lp for C php ca cu lnh lp for c c php nh sau:
for (initializer; condition; iterator) statement(s)

trong : Initializer:biu thc c c lng trc khi ln lp u tin c thc thi (y


Gio trnh Visual Studio .NET

21

thng l ni khi to mt bin cc b nh l mt bin m). Condition: l biu thc kim tra trc khi mi vng lp c thc thi. Iterator: biu thc c c lng sau mi vng lp (thng dng tng bin m). Cc vng lp s kt thc khi condition c c lng l false. V d di y in ra 100 s t nhin u tin (0, 1, 2, ..., 99), mi s trn mt dng:
for (int i = 0; i < 100; i = i+1) { Console.WriteLine(i); }

Tt nhin, chng ta c th s dng cc vng lp for lng nhau, nh v d in ra tam gic hnh sao di y.
for (int i = 0; i < 5; i++) { for (int j = 0; j <= i; j++) Console.Write(*); Console.WriteLine(i); }

2.4.2.2 Cu lnh lp while Cu lnh lp while, cn c gi l cu lnh lp kim tra iu kin trc, c c php nh sau:
while(condition) statements;

V d: on chng trnh sau minh ha vic kim tra nhp vo mt chui t dng lnh, s dng khi chui nhp vo l abc:
string correctPwd = abc, st = ; while (st != correctPwd) { Console.Write(Password = ); st = Console.ReadLine(); }

2.4.2.3 Cu lnh lp dowhile Cu lnh lp do... while c coi l phin bn kim tra iu kin sau ca cu lnh while, c c php nh sau:
do {

Gio trnh Visual Studio .NET

22

statements; } while(condition)

V d: on chng trnh minh ha vic kim tra nhp vo mt chui t dng lnh, s dng khi chui nhp vo l abc, c vit li theo kiu cu lnh lp do...while nh sau:
string correctPwd = abc, st; // rng st khng cn khi to l do { Console.Write(Password = ); st = Console.ReadLine(); } while (st != correctPwd)

2.4.2.4 Cu lnh lp foreach Cu lnh lp foreach cho php duyt qua mi phn t c trong mt tp phn t. Kiu d liu tp hp phn t (collection) s c trnh by trong cc phn tip theo. Xt v d di y:
foreach (int temp in arrayOfInts) { Console.WriteLine(temp); }

V d ny s in ra tt c cc phn t c trong tp hp arrayOfInts. C mt iu ng lu , chng ta khng c thay i gi tr ca bin phn t lp. Chng hn, on chng trnh di y s b bo li:
foreach (int temp in arrayOfInts) { temp++; //khng c thay i gi tr temp!!! Console.WriteLine(temp); }

2.4.3 Cu lnh nhy C# cung cp mt s cu lnh nhy cho php chuyn iu khin n dng lnh khc trong chng trnh. 2.4.3.1 Cu lnh goto Lnh goto cho php nhy trc tip n mt dng c th trong chng trnh, c xc nh bng mt nhn (label):
goto Label1; Console.WriteLine("Dng lnh ny s khng c thc hin"); Label1:

Gio trnh Visual Studio .NET

23

Console.WriteLine("Continuing execution from here");

2.4.3.2 Cu lnh break Chng ta s dng cu lnh break trong phn cu lnh r nhnh switch. C mt cch s dng khc ca cu lnh ny, l dng nhy ra khi iu khin ca lnh lp trc tip cha n (for, foreach, while, do...while). V d sau y l mt phin bn khc ca on lnh kim tra mt khu trn:
string correctPwd = abc; while (true) { Console.Write(Password = ); string st = Console.ReadLine(); if (st == correctPwd) break; }

2.4.3.3 Cu lnh continue Lnh continue cng tng t nh cu lnh break, phi c s dng trong thn cu lnh for, foreach, while, hay do while. Tuy nhin, n ch thot t ln lp hin ti ca vng lp bt u ln lp mi. V d, on chng trnh di y
for (int i = 0; i < 4; i++) { Console.WriteLine(---); if (i%2 == 0) continue; Console.WriteLine(i = {0}, i); }

s in ra kt qu nh th ny trong ca s Console:
----i = 1 ----i = 3

2.4.3.4 Cu lnh return Lnh return c s dng thot khi phng thc ca mt lp, tr iu khin tr v ni gi phng thc. Ty theo kiu d liu tr v ca phng thc l void hoc c mt
Gio trnh Visual Studio .NET

24

kiu d liu c th, lnh return phi tng ng khng tr v kiu d liu g, hoc l tr v mt gi tr c kiu d liu thch hp. 2.5 Cu trc chng trnh Trong phn u ca chng ny, chng ta vit mt chng trnh C# n gin u tin. Ti thi im , chng ta ch quan tm n cch thc qun l, bin dch solution, project ca Visual Studio. Sau khi nm vng c cu trc iu khin cng nh mt s c im c th ca ngn ng, gi l lc chng ta xem xt cu trc ca mt chng trnh vit bng C#. 2.5.1 Lp i tng Lp i tng ng vai tr rt ln trong cc chng trnh C#. Ni mt cch nm na, lp i tng l khun c ra cc i tng c th (gi l instance), nh ngha cc thnh phn d liu v chc nng c th c cho mi i tng c th. Thnh vin ca lp i tng l cc d liu v cc hm bn trong lp i tng n, gi l d liu thnh phn v hm thnh phn. Cc thnh vin ca lp i tng c th c khai bo l public (c th c truy xut trc tip t bn ngoi lp i tng), hoc private (ch c nhn thy trong chnh khai bo lp i tng), protected (ch c truy xut t bn trong chnh lp i tng hoc cc lp i tng khc k tha t n). D liu thnh phn l cc thnh phn bn trong lp cha d liu cho class c th l cc trng d liu (field), hng s (constant) hoc l cc s kin (event). Trng d liu l cc bin c khai bo mc lp i tng. V d di y nh ngha mt lp i tng c tn l PhoneCustomer vi 3 trng d liu CustomerID, FirstName v LastName. Lp ny cng nh ngha mt hng mc lp l DayOfSendingBill.
class PhoneCustomer{ public const int DayOfSendingBill = 1; public int CustomerID; public string FirstName; public string LastName; }

Khi to ra mt i tng ca lp i tng PhoneCustomer, chng ta c th truy xut cc trng d liu ny theo dng iTng.TrngDLiu, nh v d di y:
PhoneCustomer Customer1 = new PhoneCustomer();

Gio trnh Visual Studio .NET

25

Customer1.FirstName = "Burton";

Hm thnh phn l cc thnh phn cung cp chc nng x l d liu cho lp i tng. Chng c th l cc phng thc (method), thuc tnh (property), hm khi dng (constructor), hm hy b (destructor), hoc indexer. Phng thc (method) l cc hm c khai bo trong lp i tng. Chng c th l phng thc lm vic vi th hin c th ca lp, hoc l phng thc ch hot ng mc lp (phng thc tnh static method). Thuc tnh (property) l tp cc hm c th c truy xut theo cch ging nh trng d liu public ca lp i tng. C# cung cp cc c php c bit nh ngha cc thuc tnh ch c, ch ghi hay c truy xut t do. Hm khi dng (constructor) l cc hm c bit, c gi mi khi i tng ca lp c to mi. Cc hm khi dng phi c trng tn vi tn lp i tng. Hm hy b (destructor) l cc hm c gi khi i tng b hy. Cc hm ny c tn ca lp v c bt u bng k t ~ (du ng). Danh sch y cc b t truy cp cc hm thnh phn ca lp c cho bng di y:
B t truy cp new public protected internal private static virtual abstract override sealed extern M t n phng thc c cng khai bo c k tha t lp cha Phng thc c th c truy cp t mi ni Phng thc c th c truy cp bn trong lp khai bo n hoc t mt kiu d liu khc c dn xut t lp khai bo n. Phng thc c th c truy xut trong phm vi cng assembly. Phng thc ch c th truy xut trong lp khai bo n. Phng thc hot ng mc lp, khng hot ng vi mt i tng c th. Phng thc c th c ghi (override) trong lp dn xut. Phng thc ch ng vai tr nh ngha c php, khng ci t. Phng thc ghi phng thc c nh ngha l virtual hoc abstract lp cha. Phng thc ghi phng thc virtual, nhng khng th c ghi bi bt c lp no khi dn xut thm. Phng thc c ci t t bn ngoi, c th l bng ngn ng khc.

Gio trnh Visual Studio .NET

26

2.5.2 Kiu d liu cu trc struct C php khai bo kiu d liu cu trc trong C# hon ton tng t nh khai bo lp i tng, ch thay t kha class bng t kha struct. Chng hn, y l khai bo kiu cu trc PhoneCustomer:
struct PhoneCustomer{ public const int DayOfSendingBill = 1; public int CustomerID; public string FirstName; public string LastName; }

im khc bit gia kiu cu trc v lp i tng l cch m chng c lu tr v truy xut. Lp i tng l kiu d liu tham chiu, c lu tr trong vng nh heap, trong khi , cu trc l kiu d liu gi tr, c lu tr trong vng nh stack. Ngoi ra, cu trc khng th c k tha nh lp i tng. 2.6 Phng thc 2.6.1 Khai bo phng thc C php nh ngha mt phng thc trong C# tng t nh C++. im khc bit l, trong C#, mi phng thc c u c khai bo tm truy xut ca n (public, private, protected) v nh ngha lun phn thn phng thc. Ngha l, khng c s dng t kha public: gp nhm nhiu nh ngha phng thc public. Di y l c php nh ngha mt phng thc:
[modifiers] return_type MethodName([parameters]) { // Method body }

V d, on code di y nh ngha hai phng thc IsSquare() v Move():


public bool IsSquare(Rectangle rect) { return (rect.Height == rect.Width); } protected void Move(int dX, int dY) { this.x += dX; this.y += dY;

Gio trnh Visual Studio .NET

27

2.6.2 Truyn tham s cho phng thc Cc i s c th c truyn cho phng thc theo tham chiu hoc gi tr. Bin c truyn theo tham chiu n mt phng thc th s b nh hng bi mi thay i nu c trong thn phng thc, trong khi , bin c truyn theo gi tr th khng b nh hng bi nhng thay i din ra trong thn phng thc. Di y l minh ha vic s dng cc i s trong phng thc:
using System; namespace MinhHoaDoiSo { class ParameterTest { static void SomeFunction(int[] ints, int i) { ints[0] = 100; i = 100; } public static int Main() { int i = 0; int[] ints = { 0, 1, 2, 4, 8 }; // Hien thi danh sach gia tri truoc khi goi phuong thuc Console.WriteLine("i = " + i); Console.WriteLine("ints[0] = " + ints[0]); Console.WriteLine("Thuc hien goi phuong thuc SomeFunction()..."); // Sau khi goi phuong thuc, gia tri trong mang ints duoc thay doi, // nhung gia tri cua i thi khong! SomeFunction(ints, i); Console.WriteLine("i = " + i); Console.WriteLine("ints[0] = " + ints[0]); return 0; } } }

Mt minh ha kt qu console l nh sau:


i = 0 ints[0] = 0 Thuc hien goi phuong thuc SomeFunction()... i = 0 ints[0] = 100

Gio trnh Visual Studio .NET

28

thay i gi tr ca i s i, chng ta phi truyn n nh l mt i s kiu tham chiu. Vic nh ngha mt i s l kiu tham chiu c thc hin bng cch thm t kha ref vo u nh ngha i s, nh v d sau:
static void SomeFunction(int[] ints, ref int i) { ints[0] = 100; i = 100; }

V khi thc hin li gi phng thc, t kha ref cng phi c thm vo trc bin truyn cho phng thc:
SomeFunction(ints, ref i);

Mt im cn lu l, bin c s dng truyn cho phng thc phi c khi to trc khi thc hin li gi phng thc. truyn mt i s lm nhim v cha gi tr u ra ca mt phng thc, chng ta s dng t kha out. Bin c truyn theo kiu nh th ny th khng nht thit phi c khi to trc khi thc hin li gi phng thc, tuy nhin, nu trong thn hm i s khng c gn mt gi tr no th trnh bin dch s bo li. Cch s dng i s kiu out l nh v d di y:
static void SomeFunction(out int i) { i = 100; //phai thuc hien thay doi gia tri cua doi so i trong than phuong thuc!!! } public static int Main() { int i; // chi khai bao bien i, chua can KHOI TAO GIA TRI cho no SomeFunction(out i); Console.WriteLine(i); return 0; }

2.7 D liu kiu array 2.7.1 C php khai bo array Array trong C# c khai bo bng cch gn cp du ngoc vung vo sau kiu d liu c s, theo c php di. 29

Gio trnh Visual Studio .NET

type[] arrayName;

V d:
int[] daySo; //khai bao daySo la mot array (co the chua cac so int)

khi to array, chng ta s dng t kha new, sau ch nh c th kch thc trong cp du ngoc vung. Sau khi khi to, mi phn t trong array c truy xut thng qua tn array cng vi s hiu ca n (c nh s t 0 tr i)
// Khoi tao mot array voi 32 phan tu du lieu kieu int int kichThuoc = 10 + 20; int[] daySo = new int[kichThuoc]; // luu y co the dung BIEN de xac dinh kich thuoc!!! daySo[0] = 35; // gan gia tri cho phan tu dau tien trong daySo daySo[31] = 432; // gan gia tri cho phan tu thu 32 trong daySo

Lu rng, chng ta c th s dng gi tr ca bin khi nh ngha kch thc cho array. V, mt khi khi to xong array vi kch thc c th, chng ta khng th thay i kch thc ca array . lm c iu ny, chng ta cn mt kiu d liu khc ArrayList. Chng ta cng c th khai bo v nh ngha mt array theo cch ch ra cc phn t c th ca n nh sau:
string[] myArray = {"first element", "second element", "third element"};

2.7.2 Lm vic vi array ly kch thc ca array, chng ta s dng thuc tnh Length ca n. Mt s phng thc thng dng i vi d liu kiu array l: - Array.Sort(arr): hm tnh, s dng sp xp array arr; arr l array ca cc phn t c kiu c nh ngha sn trong C#. - Array.Reverse(arr): hm tnh, s dng o ngc v tr ca cc phn t c trong array arr. V d sau minh ha vic khai bo mt array gm cc string, sp xp theo th t ABC, o ngc cc phn t, ri in cc phn t ra Console:
string[] hoTen = {"Nguyen Van Trung", "Nguyen Hoang Ha", "Tran Nguyen Phong"}; // in danh sach cac phan tu trong array for (int i = 0; i < hoTen.Length; i++)

Gio trnh Visual Studio .NET

30

Console.WriteLine(hoTen[i]); Array.Sort(hoTen); Array.Reverse(hoTen); // in danh sach cac phan tu trong array su dung cu phap foreach foreach (string stHoTen in hoTen) Console.WriteLine(stHoTen);

2.7.3 Array nhiu chiu C# h tr hai kiu array nhiu chiu: kiu ma trn (chng hn nh mt ma trn hai chiu l mt array trong mi dng s c cng s ct) v array kiu rng ca. V d di y minh ha cch khai bo v khi to mt array kiu ma trn hai chiu:
string[,] beatleName = { {"Lennon","John"}, {"McCartney","Paul"}, {"Harrison","George"}, {"Starkey","Richard"} };

Lu rng chng ta s dng du phy phn cch cc chiu trong khai bo array, ngay c khi chng ta cha thc s xc nh kch thc ca mi chiu. khai bo mt array 3 chiu gm cc string, chng ta lm nh sau:
string[,,] my3DArray;

Array, sau khi khai bo c th tin hnh khi to gi tr cho cc phn t bn trong, nh sau:
double [, ] matrix = new double[5, 10]; for (int i = 0; i < 5; i++) { for (int j=0; j < 10; j++) matrix[i, j] = i*j; }

Sau khi khi to array, chng ta c th xc nh kch thc ca tng chiu bng phng thc GetLength(). Chng hn,
double [, ] matrix = new double[5, 10]; Console.WriteLine(Kich thuoc chieu thu nhat: {0}, matrix.GetLength(0)); // 5 Console.WriteLine(Kich thuoc chieu thu nhat: {0}, matrix.GetLength(1)); // 10

Kiu array nhiu chiu th hai l array kiu rng ca, trong kch thc ca mi chiu l c th khc nhau. Chnh xc, y l kiu d liu array ca cc array. on code di
Gio trnh Visual Studio .NET

31

y minh ha cch nh ngha mt array kiu rng ca:


int[][] a = new int[3][]; a[0] = new int[4]; a[1] = new int[3]; a[2] = new int[1];

Tng phn t ca array kiu rng ca s c truy xut nh l mt array mt chiu nh thng thng. Chng trnh di y cho thy r hn cch thc s dng ca array kiu rng ca. Chng trnh ny c nhim v nhn vo mt s nguyn n, sau thnh lp tam gic Pascal ri in tam gic ny ra mn hnh.
using System; namespace MinhHoaArray { class TamGiacPascal { Console.Write("n = "); int n = int.Parse(Console.ReadLine()); long[][] C = new long[n+1][]; // khoi tao C la 1 array gom n+1 phan tu for (int i = 0; i <= n; i++) { C[i] = new long[i+1]; // phan tu thu i cua C la 1 array gom (i+1) phantu C[i][0] = C[i][i] = 1; for (int j = 1; j < i; j++) C[i][j] = C[i-1][j] + C[i-1][j-1]; } for (int i = 0; i < C.Length; i++) { for (int j = 0; j < C[i].Length; j++) Console.Write("{0, 5}", C[i][j]); // in so voi do rong la 5 Console.WriteLine(); } Console.ReadLine(); } }

Mt minh ha kt qu in ra ca chng trnh l:


n = 5 1 1 1 1

1 2 3

1 3

Gio trnh Visual Studio .NET

32

1 1

4 5

6 10

4 10

1 5

2.8 Cc ton t C# h tr cc kiu ton t sau y: Loi ton t S hc Logic Cng chui Tng v gim Dch bit So snh Php gn Truy xut thnh phn (cho object v struct) Indexing (cho array v cc indexers) p kiu iu kin To i tng Thng tin v kiu iu khin Overflow exception Truy xut a ch v gin tip K hiu
+ - * / % & | ^ ~ && || ! + ++ -<< >> == != < > <= >= = += -= *= /= %= &= |= ^= <<= >>= . [] () ?: new sizeof is typeof as checked unchecked * -> & []

Cng ging nh cc ngn ng ta C, chng ta cn phn bit php gn vi php so snh. Chng hn
x = 3; // gn gi tr 3 cho x

trong khi , mun so snh x vi 3, chng ta phi ghi nh th ny


if (x == 3)

2.8.1 Cc ton t tt Di y l cc ton t vit tt ca C# Ton t tt x++, ++x x--, --x x += y


Gio trnh Visual Studio .NET

Tng ng vi x=x+1 x=x-1 x=x+y 33

Ton t tt x -= y x *= y x /= y x %= y x >>= y x <<= y x &= y x |= y x ^= y

Tng ng vi x=xy x=x*y x=x/y x=x%y x = x >> y x = x << y x=x&y x=x|y x=x^y

2.8.2 Ton t tam nguyn (ternary operator) Cng nh cc ngn ng ta C, C# cng cung cp ton t tam nguyn:
condition ? true_value : false_value

2.8.3 Ch dn checked v unchecked Xem xt on m lnh sau


byte b = 255; b++; Console.WriteLine(b.ToString());

D liu kiu byte ch c th nm gi c cc gi tr trong vng t 0 n 255, v th, vic tng gi tr ca b s lm xut hin li overflow. Vic qun l cc li kiu nh th ny rt quan trng, v th C# cung cp mt c php cho php pht hin ra kiu li ny. Xem on m lnh
byte b = 255; checked { b++; } Console.WriteLine(b.ToString());

Khi thc thi on m lnh ny, chng ta s nhn c thng bo li dng


Unhandled Exception: System.OverflowException: Arithmetic operation resulted in an overflow. at MinhHoa.Main(String[] args)

Nu mun b qua li overflow, chng ta nh du on m lnh tng ng l unchecked


Gio trnh Visual Studio .NET

34

byte b = 255; unchecked { b++; } Console.WriteLine(b.ToString());

Trong trng hp ny, khng c ngoi l no c pht sinh, nhng chng ta s b mt d liu! Lu rng, unchecked l trng thi mc nh! 2.8.4 Ton t is Ton t is cho php kim tra mt object c tng thch vi mt kiu d liu no hay khng. Trong phn lp trnh hng i tng, chng ta s c dp s dng ton t ny. 2.8.5 Ton t sizeof Ton t sizeof cho php xc nh kch thc (tnh bng byte) c yu cu bi mt kiu d liu gi tr trn vng nh stack . Xem v d minh ha sau:
string s = "A string"; unsafe { Console.WriteLine(sizeof(int)); // in ra kich thuoc cua 1 int, la 4 }

Lu rng, ton t sizeof ch c s dng vi m lnh khng an ton (unsafe code). 2.9 Enumerations Kiu lit k Mt kiu lit k l mt kiu d liu nguyn do ngi s dng t nh ngha. Khi khai bo mt kiu lit k, chng ta xc nh mt tp cc gi tr c th nhn c thng qua cc tn gi c tnh gi nh. Chng ta c th nh ngha mt kiu lit k nh v d sau:
public enum TimeOfDay { Morning = 0, Afternoon = 1, Evening = 2 }

Vic s dng kiu d liu lit k s cho php vit cc on m lnh d c, d qun l li logic hn
class EnumExample {

Gio trnh Visual Studio .NET

35

public static int Main() { WriteGreeting(TimeOfDay.Morning); return 0; } static void WriteGreeting(TimeOfDay timeOfDay) { switch(timeOfDay) { case TimeOfDay.Morning: Console.WriteLine("Good morning!"); break; case TimeOfDay.Afternoon: Console.WriteLine("Good afternoon!"); break; case TimeOfDay.Evening: Console.WriteLine("Good evening!"); break; default: Console.WriteLine("Hello!"); break; } } }

Mt c tnh c bit ca kiu lit k cn lu l kh nng chuyn i qua li gia n vi kiu d liu string.
//enum string TimeOfDay time = TimeOfDay.Afternoon; Console.WriteLine(time.ToString()); // chuoi in ra la Afternoon //string enum TimeOfDay time2 = (TimeOfDay) Enum.Parse(typeof(TimeOfDay), "afternoon", true); Console.WriteLine((int)time2);

Vic ly chui tng ng ca mt bin gi tr lit k c th tin hnh n gin bng cch s dng phng thc ToString() ca bin. Trong khi , ly gi tr kiu lit k t mt chui tng ng th phc tp hn, chng ta phi s dng phng thc tnh Parse ca lp Enum. Cn c nhiu phng thc khc ca lp Enum; chi tit tham kho bn xem ti liu MSDN. 2.10 Namespace Namespace l n v gp nhm mang tnh logic. Khi nh ngha mt lp i tng trong mt file C#, chng ta c th a n vo trong mt namespace no . Sau , khi nh
Gio trnh Visual Studio .NET

36

ngha lp khc c chc nng lin quan vi lp i tng trc , chng ta c th gp n vo trong cng namespace, qua to ra mt nhm logic, cho cc nh pht trin bit rng cc lp i tng trong cng namespace l c lin quan vi nhau.
namespace BusinessLayer { public struct Student { // Ma lenh dinh nghia struct Student... } }

Kiu d liu thuc v mt namespace s c tn y c xc nh bng


namespace.tenKieuDuLieu

Nh v d trn, tn y ca lp Student s l
BusinessLayer.Student

Student cn c gi l tn ngn gn ca kiu d liu. Chng ta cng c th lng cc namespace bn trong cc namespace khc, qua to ra cu trc phn lp cho cc kiu d liu.
namespace HueUni { namespace COSciences { namespace DoIT { class Student { // Ma lenh dinh nghia lop doi tuong Student... } } } }

Tn namespace bao gm cc tn namespace cha n, phn cch nhau bng du chm, bt u bng namespace ngoi cng nht, v kt thc bng chnh tn ngn gn ca n. V d, tn y ca namespace DoIT l HueUni.COSciences.DoIT Chng ta cng c th dng c php nh sau t chc cc namespace:
namespace HueUni.COSciences.DoIT

Gio trnh Visual Studio .NET

37

{ class Student { // Ma lenh dinh nghia lop doi tuong Student... } }

Namespace khng tng ng vi assembly. Hon ton c th c cc namespace khc nhau trong cng mt assembly, hay ngc li, c th nh ngha cc kiu d liu cho cng mt namespace nhiu assembly khc nhau. 2.10.1 Khai bo s dng namespace Vic s dng kiu d liu vi tn y r rng l khng thun tin lm, c bit l khi kiu d liu c nh ngha trong mt namespace mc qu su. C# cho php s dng tn ngn xc nh kiu d liu bng cch xc nh trc namespace ca kiu d liu ny vi t kha using u file m ngun. Chng hn, nu c khai bo
using HueUni.COSciences.DoIT

u file m ngun th trong file , chng ta c th s dng tn ngn ca lp i tng Student thay cho tn y ca n l HueUni.COSciences.DoIT.Student Trong trng hp tn ngn ca hai kiu d liu thuc v hai namespace cng tham kho l trng nhau, khi s dng kiu d liu, chng ta phi ch r vi namespace c th. Chng hn, gi s lp i tng c tn Student c nh ngha trong c hai namespace HueUni.COSciences.DoiT v HueUni.COSciences.DoP; khi chng ta cn xc nh lp Student bng mt ci tn di hn, DoIT.Student hoc DoP.Student ty theo tng tnh hung.
using HueUni.COSciences.DoIT; using HueUni.COSciences.DoP; class Test { public static int Main() { DoIT.Student nvtrung = new DoIT.Student(); DoP.Student nhha = new DoP.Student(); return 0; } }

2.10.2 B danh cho Namespace Mt cch s dng khc ca t kha using l gn b danh cho cc lp i tng v cc Gio trnh Visual Studio .NET 38

namespace. C php ca cch s dng ny l nh sau:


using alias = NamespaceName;

V d sau y minh ha cch thc s dng b danh namespace:


using System; using KhoaCNTT = HueUni.COSciences.DoIT; class Test { public static int Main() { KhoaCNTT.Student nvtrung = new KhoaCNTT.Student(); Console.WriteLine(nvtrung.GetNamespace()); return 0; } } namespace HueUni.COSciences.DoIT { class Student { public string GetNamespace() { return this.GetType().Namespace; } } }

2.11 Bi thc hnh

Bi thc hnh 1.1. Chng trnh u tin Tm tt Bi thc hnh ny gip bn lm quen vi mi trng Visual Studio 2005 v cc thao tc nhp xut c bn thng qua giao din bn phm. C th, chng trnh yu cu ngi s dng nhp hai s, sau in ra mn hnh tng, tch v thng ca hai s ny. K thut c trnh by - Lm quen vi mi trng Visual Studio 2005. Cu trc mt solution, project v cc ti nguyn c lin quan - Cch thc s dng th vin MSDN tra cu, hng dn - S dng thao tc nhp xut c bn
Gio trnh Visual Studio .NET

39

Trnh t thc hin 1. Khi ng Microsoft Visual Studio 2005. Nhn Ctrl + Shift + N hoc chn menu tng ng l File New Project to mi mt project

2. Chn loi ng dng cn pht trin l Visual C# Console Application. Chn th mc cha project v t tn cho project. V mt thc cht, Visual Studio coi project thuc v mt solution no , v mt solution c th cha nhiu project. Tuy nhin, trong nhiu bi ton n gin (nh v d ca chng ta chng hn), mt solution ch c 1 project. 3. t tn cho project ca chng ta thnh firstApp. Sau khi nhn nt OK, hy kho st xem cu trc ca th mc cha solution ca chng ta. Bn phi lun nm chc v ngha ca cc tp tin, th mc c to ra trong qu trnh lm vic. 4. G m lnh nh minh ha vo trong phn m ngun ca tp tin Program.cs

Gio trnh Visual Studio .NET

40

5. S dng MSDN tra cu cc thng tin bn cha bit v: a. Console v cc phng thc ReadLine(), WriteLine() ca n b. Cch chuyn i kiu chui thnh s, v d nh int.Parse() 6. Nhn Ctrl + F5 thc hin chy chng trnh. Sau quan st cu trc th mc ca solution, cho bit s thay i ca n so vi khi mi c to ra bc 3. 7. Th thay i kt cu lnh thnh float thuong = (float)x / y; float thuong = x / y; ri chy chng trnh, quan st kt qu v rt ra kt lun. 8. S dng thm cc cu trc lnh khc tinh chnh hot ng ca chng trnh (x l php chia cho 0, )

Gio trnh Visual Studio .NET

41

Bi thc hnh 1.2. Module ha chng trnh Tm tt Vit chng trnh nhp vo mt s nguyn N t bn phm. Sau a. In ra mn hnh gi tr N!. b. Nhp thm mt s nguyn K t bn phm. Sau in ra CKN = N!/(K!*(N-K)!) K thut c trnh by - Cu trc, cch qun l logic v vt l, cch lm vic ca solution v project - Thc hin chia nh ng dng thnh chuyn mn ha cc phn - C bn v cc kiu phng thc trong mt lp Trnh t thc hin 1. M solution lm Bi thc hnh 1.1. Chnh sa tn ca solution t firstApp thnh day1 cho c ngha. Xem cu trc th mc ca solution sau khi thay i.

2. Thm mt project vo solution ny bng menu lnh File Add New project . Tng t nh cch to mi project bi thc hnh trc, chn th loi project l Console Application. t tn cho project mi l modular.
Gio trnh Visual Studio .NET

42

3. Quan st cu trc cy th mc ca solution trong ca s Solution Explorer v c trong Windows Explorer. rng, trong ca s Solution Explorer, project firstApp c t m. iu ny c ngha, firstApp ng vai tr l Startup project. Khi nhn Ctrl + F5 th project ny s c gi thc thi ch khng phi l project modular m ta mi to ra. Trong ca s Solution Explorer, nhp phi chut ln modular. Trong menu hin ra, chn menu lnh Set as Startup project thit lp li startup project cho solution. 4. Vic nhp n, tnh n! ri in kt qu bn hon ton c th thc hin c bng cc cu lnh n gin. Tuy nhin, tng tnh r rng v ti s dng, bn nn to ra mt phng thc h tr vic tnh ton n!. Xem m lnh bn di

5. Chy th chng trnh xem kt qu. Hy rng, khai bo phng thc giaiThua l static long giaiThua(int n). Th xa static trong khai bo ny ri chy li chng trnh. Li nhn c cho bit ch cc phng thc static mi c triu gi, s dng ln nhau 6. Bng cch to ra phng thc long giaiThua() nh trn, chng ta c th gii quyt
Gio trnh Visual Studio .NET

43

c vn tnh Ckn mt cch d dng. Li gi tnh Ckn nh sau: GiaiThua(n)/(GiaiThua(n-k)*GiaiThua(k)) 7. Hy to ra mt phng thc tnh t hp chp k ca n phn t (bn t quyt nh cc tham s v kiu d liu tr v).

Gio trnh Visual Studio .NET

44

Bi thc hnh 1.3. To th vin s dng chung Tm tt Trong thc t, mt ng dng c th l c kh nng thc thi (executable) hoc ch n thun l th vin cha cc chc nng, lp i tng. Bi thc hnh ny hng dn bn to th vin cha cc phng thc thng dng. Vi mc ch minh ha, th vin ny ch cha 2 hm tin ch gip tnh giai tha v t hp chp. Sau khi bin dch, bn s c c mt file nh vi phn m rng l DLL. Th vin ny, khi cn, s c tham chiu n trong cc ng dng khc. K thut c trnh by - To loi ng dng loi th vin Trnh t thc hin 1. To mi mt project, t tn l commonUtils (common utilities - cc tin ch dng chung). Ch chn loi ng dng cn to l Class Library 2. Mc nh Visual Studio 2005 s to ra trong namespace CommonUtils mt lp tn l Class1. i tn lp ny li thnh Math. Sau ci t cc phng thc nh sau:

3. R rng, y khng phi l mt chng trnh chy nh cc ng dng bn vit


Gio trnh Visual Studio .NET

45

trc - class Math khng c phng thc static public Main() tc l bn khng th nhn Ctrl + F5 chy chng trnh. Bin dch project ny bng menu lnh Build Build commonUtils. Kt qu, bn s c mt th vin commonUtils.dll trong th mc bin\Release hoc bin\Debug ca project ty theo cch chn ch bin dch. Th vin ny s c dng tham chiu n trong cc ng dng cn n. M rng B sung cc phng thc thng dng khc vo th vin, chng hn nh phng thc xc nh xem mt s c phi l nguyn t hay khng, phng thc hon i gi tr ca hai s cho trc,

Gio trnh Visual Studio .NET

46

Bi thc hnh 1.4. Tam gic Pascal Tm tt Vit chng trnh nhp mt s nguyn N t bn phm, sau in ra mn hnh N dng u tin ca tam gic Pascal. K thut c trnh by - S dng th vin c sn Trnh t thc hin 1. To mi mt ng dng kiu Console Application. t tn project l pascalTriangle1 2. Thc hin b sung tham kho n th vin commonUtils bng cch: - Nhp phi chut vo project pascalTriangle1 trong ca s Solution Explorer - Trong menu hin ra, chn Add Reference

Trong tab Browse ca hp thoi Add Reference, tm n th vin Gio trnh Visual Studio .NET 47

commonUtils.dll to ra trc . D thy rng th vin c tham kho n khng ch c dng DLL m c th c cc dng khc, bao gm EXE, OCX, 3. Hon thin phn m ngun c s dng tham chiu n th vin va b sung nh hnh di:

M rng Hy t rt ra nhng ghi ch cn thit v vic: - Khai bo phng thc C(int n, int k) trong commonUtils l public static long C(int n, int k) static, public y c ngha g, c th thay th hoc b i? - Tng t cho phng thc giaiThua(int n); Ti sao trong qu trnh s dng phng thc C() li phi ghi y l
Gio trnh Visual Studio .NET

48

commonUtils.Math.C()? Ch cn ghi Math.C() c c khng?

Gio trnh Visual Studio .NET

49

Bi thc hnh 1.5. Tam gic Pascal array version Tm tt S dng array xy dng tam gic Pascal nh Bi thc hnh 1.4. K thut c trnh by - S dng array Trnh t thc hin
1. To mi mt project kiu Console Application vi tn l pascalTriangle2 2. S dng cc tnh cht C00 = Ckk = 1, Cnk = Cn-1k-1 + Cn-1k , ta s xy dng mt jagged

array t nh n ln. Chi tit nh phn m ngun pha di:

Gio trnh Visual Studio .NET

50

M rng C th dng array nhiu chiu trong trng hp ny khng? Nu c th c s khc nhau no so vi dng jagged array?

Gio trnh Visual Studio .NET

51

CHNG 3 LP TRNH HNG I TNG VI C#


Trong phn trc chng ta thy cch s dng ca lp i tng. y, chng ta s nhc li mt s khi nim v tnh cht ca lp i tng trc khi ni v tnh hng i tng. Lp i tng c nh ngha theo c php:
class MyClass { private int someField; public string SomeMethod(bool parameter) { } }

Lp i tng cha cc thnh vin thnh vin l thut ng c s dng ni n d liu hoc hm c nh ngha trong lp. Thut ng hm (funciton) c dng ni n bt k thnh vin no c cha m lnh, bao gm phng thc (method), thuc tnh (property), hm khi dng (constructor), hm np chng ton t (operator overload). Lp i tng trong C# l kiu d liu tham chiu. iu ny c ngha l khi bn khai bo mt bin c kiu d liu lp th xem nh bn c mt bin c th cha tham chiu n mt th hin ca lp i tng . Bn cng cn phi khi to ra i tng bng cch dng ton t new.
MyClass myObject; myObject = new MyClass();

C hai thao tc khai bo v khi to i tng c th c lm mt ln nh th ny:


MyClass myObject = new MyClass();

Do l d liu kiu tham chiu, nn php gn hai bin tham chiu c ngha l cho hai bin d liu tham chiu n cng mt i tng.
MyClass myObjectRef = myObject;

Tc l myObjectRef s cng tham chiu n cng i tng m myObject ang tham chiu n. Cc phng thc ca i tng c tham chiu n c th c triu gi t
Gio trnh Visual Studio .NET

52

c myObjectRef v myObject. 3.1 n k tha trong C# C# h tr n k tha cho tt c cc lp i tng, tc l mt lp ch c th dn xut trc tip nhiu nht l t mt lp i tng khc. Lp c s nht trong C# l lp System.Object
class MyDerivedClass : MyBaseClass { // functions and data members here }

Cng nh mt s ngn ng lp trnh hng i tng, C# c mt s b t truy cp quy nh phm vi m lnh c php truy xut mt thnh vin trong lp i tng. Mc truy cp public internal protected protected internal private M t Bin hoc phng thc c th c truy xut t bt c ni no Bin hoc phng thc ch c th truy xut trong phm vi cng assembly Bin hoc phng thc ch c th truy xut t bn trong kiu d liu m n thuc v, hoc cc kiu d liu dn xut Bin hoc phng thc c th c truy xut trong phm vi assembly hin ti, hoc t cc kiu d liu dn xut t kiu d liu cha n Bin hoc phng thc ch c th c truy xut t bn trong kiu d liu m n thuc v

3.2 Np chng phng thc (Method Overloading) C# h tr np chng phng thc, cho php c nhiu phin bn cho mt phng thc c cc ch k khc nhau. Khi nim ch k ca phng thc y c hiu l tn phng
Gio trnh Visual Studio .NET

53

thc, s lng i s, kiu i s c s dng trong phng thc. Chng hn, lp i tng Student di y c hai phng thc np chng Display():
class Student { // void Display(string stMessage) { // implementation } void Display() { // implementation } }

3.3 Ghi phng thc v che du phng thc Bng cch khai bo mt hm lp c s l virtual, chng ta c th ghi hm lp dn xut ca lp ny.
class MyBaseClass { public virtual string VirtualMethod() { return "Phuong thuc nay la virtual trong MyBaseClass"; } }

iu ny c ngha l chng ta c th ci t li phng thc VirtualMethod() (vi cng ch k phng thc) trong lp dn xut ca MyBaseClass. Khi chng ta gi phng thc ny t mt th hin ca lp dn xut th phng thc ca lp dn xut s c triu gi ch khng phi l phng thc ca lp c s.
class MyDerivedClass: MyBaseClass { public override string VirtualMethod() { return "Phuong thuc nay duoc dinh nghia de` trong MyDerivedClass"; } }

on m lnh di y minh ha hiu ng ca vic ghi phng thc:


MyBaseClass obj;

Gio trnh Visual Studio .NET

54

obj = new MyBaseClass(); obj.VirtualMethod(); // in ra Phuong thuc nay l virtual trong MyBaseClass obj = new MyDerivedClass(); obj.VirtualMethod(); // in ra Phuong thuc nay duoc dinh nghia de` trong // MyDerivedClass

on m lnh trn, chng ta thy rng, vic quyt nh phin bn no ca phng thc VirtualMethod ( lp MyBaseClass hay MyDerivedClass) c s dng l ty thuc vo ni dung hin ti ca i tng m obj tham chiu n. Ni cch khc, vic quyt nh phin bn phng thc triu gi c quyt nh trong thi gian thc thi chng trnh ch khng phi l trong lc bin dch chng trnh! c tnh ny cn c gi l tnh gn kt mun (late-binding) trong k thut lp trnh. Trong lp i tng, cc trng d liu hoc cc hm tnh khng c khai bo l virtual. Nu mt phng thc vi ch k c khai bo trong c lp c s v lp dn xut, nhng cc phng thc khng c khai bo tng ng l virtual v override, th phin bn phng thc lp dn xut c gi l che du phin bn lp c s. Trong tnh hung ny, phin bn ca phng thc c s dng hot ng s ty thuc vo kiu d liu ca bin c s dng tham chiu n i tng th hin ch khng phi l chnh i tng th hin. iu ny c th hin trong cch thc hot ng ca on m lnh di y:
class MyBaseClass { public string VirtualMethod() // KHONG DUOC KHAI BAO LA virtual NUA!!! { return "Phuong thuc nay la virtual trong MyBaseClass"; } } class MyDerivedClass: MyBaseClass { public string VirtualMethod() // KHONG DUOC KHAI BAO LA override NUA!!! { return "Phuong thuc nay duoc dinh nghia de` trong MyDerivedClass"; } } MyBaseClass obj; // obj la bien kieu MyBaseClass phien ban VirtualMethod() duoc // su dung DUOC QUYET DINH NGAY LUC BIEN DICH la cua MyBaseClass obj = new MyBaseClass(); obj.VirtualMethod(); // in ra Phuong thuc nay l virtual trong MyBaseClass

Gio trnh Visual Studio .NET

55

obj = new MyDerivedClass(); obj.VirtualMethod(); // van in ra Phuong thuc nay l virtual trong MyBaseClass!!!

Trn thc t, khi bin dch on m lnh tng t nh trn, trnh bin dch s a ra cnh bo v vic phng thc b che giu. trnh khi cnh bo nh vy, bn khai bo phng thc c nh ngha li trong lp dn xut thm vi t kha new. 3.4 Gi phng thc vi phin bn ca lp c s C# c mt c php c bit cho php trong lp dn xut c th triu gi phng thc vi phin bn c ci t lp c s: base.<MethodName>(). V d:
class Student { public virtual void Dispaly() { Console.WriteLine(Thong tin chung cua sinh vien...); } } class ITStudent: Student { public override void Display() { base.Display(); Console.WriteLine(Thong tin rieng doi voi sinh vien CNTT....); } }

Lu rng cch gi phng thc base.<MethodName>() gi mi phng thc ca lp c s l c th c s dng cho bt k phng thc no trong lp dn xut, ch khng nht thit l trong cng phng thc c ghi . 3.5 Lp tru tng v hm tru tng C# cho php c lp i tng v hm c khai bo l abstract (tru tng). Mt lp tru tng th khng th c to th hin, trong khi , mt hm tru tng th khng th c phn ci t, v phi c ghi bi mt hm khng tru tng trong lp dn xut (hm tru tng mc nhin c xem l virtual trong lp c s). Trong mt lp tru tng, ch c th c khai bo trng d liu thnh phn v cc ch k ca phng thc, khng c phn ci t ca phng thc.
abstract class SinhVien {

Gio trnh Visual Studio .NET

56

private bool damaged = false; public abstract decimal DiemTrungBinh(); }

// field // abstract method

3.6 Lp b nim phong v phng thc b nim phong C# cho php c lp i tng v phng thc c khai bo l nim phong. Lp b nim phong (sealed class) l lp khng c dn xut thm. Phng thc b nim phong (sealed method) l phng thc khng th c ghi lp dn xut. V d v lp b nim phong:
sealed class FinalClass { // cai dat cho lop FinalClas } class DerivedClass : FinalClass { //// } // LOI KHI BIEN DICH!!!

V d v phng thc b nim phong:


class MyClass { public sealed override void FinalMethod() { // cai dat cho phuong thuc bi niem phong } } class DerivedClass : MyClass { public override void FinalMethod() { } }

// LOI KHI BIEN DICH

3.7 Np chng ton t C# cung cp c ch np chng ton t, cho php ci t m lnh quyt nh cch thc mt lp i tng lm vic vi ton t thng thng. C php np chng mt ton t l nh sau:
public static <return type> operator <op> (parameter list) { cai dat ma lenh o day}

Gio trnh Visual Studio .NET

57

Cc quy tc cn tun th khi ci t v s dng phng thc np chng ton t: Bt buc phi c b t truy cp public v static. Kiu d liu tr v l kiu lp i tng khi lm vic vi cc lp i tng. Kiu d liu tr v khng c l void. op l ton t hai ngi, mt ngi (unary), hoc ton t quan h. C hai ton t == v != phi c ci t theo cp. Cc ton t hai ngi yu cu hai i s, ton t mt ngi ch yu cu mt i s.. V d di y xy dng mt lp m phng kiu d liu s phc vi cch s dng cc php ton +, - n gin:
public class ComplexNumber { private int real; private int imaginary; public ComplexNumber() : this(0, 0) { } public ComplexNumber(int r, int i) { real = r; imaginary = i; } // constructor

// constructor

// Ghi de phuong thuc ToString() de hien thi so ao theo dang thong thuong: public override string ToString() { return(System.String.Format("{0} + {1}i", real, imaginary)); } // Nap chong toan tu '+': public static ComplexNumber operator+(ComplexNumber a, ComplexNumber b) { return new ComplexNumber(a.real + b.real, a.imaginary + b.imaginary); } // Nap chong toan tu '-': public static ComplexNumber operator-(ComplexNumber a, ComplexNumber b) { return new ComplexNumber(a.real - b.real, a.imaginary - b.imaginary); } } class TestComplexNumber {

Gio trnh Visual Studio .NET

58

static void Main() { ComplexNumber a = new ComplexNumber(10, 12); ComplexNumber b = new ComplexNumber(8, 9); System.Console.WriteLine("a = {0}", a.ToString()); System.Console.WriteLine("b = {0}", b.ToString()); ComplexNumber c = a + b; System.Console.WriteLine("c = a + b = {0}", c.ToString()); ComplexNumber d = a - b; System.Console.WriteLine("d = a - b = {0}", d.ToString()); } }

Nh chng trnh minh ha, sau khi np chng ton t + v -, bn c th s dng hai php ton + v i vi d liu ComplexNumber mt cch trc tip. y, kt qu nhn c s l:
a b c d = = = = 10 + 12i 8 + 9i a + b = 18 + 21i a - b = 2 + 3i

3.8 Bi thc hnh Bi thc hnh 3.1: Qun l sinh vin Tm tt Vit chng trnh qun l sinh vin ca mt trng. Sinh vin c th hc cc chuyn ngnh Cng ngh Thng tin, Vt l, Ng vn. Mi chuyn ngnh tng ng c cc mn hc khc nhau. Sinh vin khoa Cng ngh Thng tin phi hc 3 mn Pascal, C# v SQL. Sinh vin khoa Vt l phi hc 4 mn: C hc, in hc, Quang hc, Vt l ht nhn. Sinh vin khoa Vn phi hc 2 mn Vn hc c in v Vn hc Hin i Chng trnh cho php nhp danh sch sinh vin, sau in danh sch sinh vin cng vi im trung bnh ca h ra mn hnh. In ra danh sch nhng sinh vin c im trung bnh cao trn 5.0 ra mn hnh. Thng tin hin th c dng H tn, Chuyn ngnh o to, im trung bnh.
Gio trnh Visual Studio .NET

59

K thut c trnh by - Truy xut tp tin c nh dng cho trc - S dng mt phng thc ca lp String - Cc k thut hng i tng c s dng trong bi ton thc t Trnh t thc hin 1. Trc khi tin hnh ci t, ta kho st qua s lp c s dng. Vi nhng m t kh r rng trong yu cu bi ton, ta c c ci nhn tng quan v cc lp nh sau:

Lu rng, phng thc dtb() c ci t l virtual chng ta c th override mt cch c th, chi tit hn trong cc lp k tha t class SinhVien. Phng thc ToString() c ci t override t lp object s dng trong vic in ni dung ca i tng. 2. To mi mt project kiu Console Application vi tn l studentManager 3. Ti cy phn cp Solution Explorer nhp phi chut v chn Add New Item Trong hp thoi hin ra, chn to mi class SinhVien.cs
Gio trnh Visual Studio .NET

60

4. Ci t cc thnh phn c bn cho lp SinhVien

Gio trnh Visual Studio .NET

61

5. B sung thm cc class SinhVienCNTT, SinhVienVan, SinhVienVL theo phn tch thit k lp t trc. Di y l phn m t ci t cho lp SinhVienVan. Hai lp cn li SinhVienCNTT, SinhVienVL c ci t mt cch tng t.

Gio trnh Visual Studio .NET

62

6. Trong phn chng trnh (tp tin Program.cs) chng ta thc hin yu cu bi ton nh sau:

Gio trnh Visual Studio .NET

63

Yu cu thm - In ra 3 sinh vin c im trung bnh cao nht trng. - Chnh sa ngi s dng c th nhp danh sch m khng bit trc s lng sinh vin (s dng vng lp while, do, ) - Chnh sa c th nhp d liu cc sinh vin t file.

Gio trnh Visual Studio .NET

64

3.2 Bi thc hnh trn Winform Bi thc hnh 3.2.1 helloWinForms K thut c trnh by - Cu trc ca v c ch hot ng ca mt project Windows Form Application. - C ch x l s kin ca cc Control trong mt Windows Form - Mt s phng thc, thuc tnh, s kin quan trng ca cc iu khin trong mt Windows Form. Trnh t thc hin 1. To mi mt ng dng kiu Windows Form Application vi tn l 01-helloWindowsForm nh hnh v

2. Theo mc nh, mt solution vi mt project c to ra. Project ny c mt lp Form1. Kho st ni dung ca project trong Windows Explorer, chng ta s thy cu trc
Gio trnh Visual Studio .NET

65

ca th mc v cc tp tin tng t nh hnh di:

C th thy, mi Form c to ra tng ng vi 3 tp tin c tip u ng l ging nhau, ly v d l Form1 Form1.Designer.cs: cha cc m lnh do Form Designer t sinh ra tng ng vi cc thao tc do ngi s dng ko th cc Control t ToolBox vo b mt Form hay thc hin cc thit lp i vi cc Control. Form1.cs: cha phn m lnh v khai bo thm do ngi s dng ci t. Form1.resx: cha cc m t, khai bo v cc ti nguyn c s dng trong Form. 3. Chng ta cng c th quan st cu trc ca solution hay project bng cch kho st ca s Solution Explorer:

Gio trnh Visual Studio .NET

66

4. T ca s Solution Explorer, i tn tp tin Form1.cs thnh FormMain.cs. rng, c ba tp tin lin quan n Form1 u c thay i theo mt cch ng b. 5. Thit k giao din cho FormMain nh hnh v

Gio trnh Visual Studio .NET

67

6. Bc tip theo, chng ta s thc hin ci t phng thc x l s kin Click ca nt bm btnCurrentTime: a. Chn iu khin nt bm btnCurrentTime trong ca s thit k Form. b. trang Event trong ca s Properties Windows, nhp p chut vo s kin Click (xem hnh v di). Form Designer s sinh ra phng thc x l s kin c tn mc nh l btnCurrentTime_Click(). (Phng thc x l s kin c mc nh t tn l <tniuKhin>_<TnSKin>)

Gio trnh Visual Studio .NET

68

Son tho phn m lnh cho phng thc ny nh sau:

7. Thc hin chy chng trnh, khi nhn vo nt bm btnCurrentTime, mt hp thng bo c hin th ra nh hnh v

8. Thc ra chng ta c th t t tn cho phng thc x l s kin. Chng hn, ci t phng thc x l s kin MouseEnter cho nt bm btnCurrentTime, trong ca s Properties trang Events, tm n mc MouseEnter v: Gio trnh Visual Studio .NET 69

a. Nhp vo tn phng thc x l s kin: btn_MouseEnter b. Nhn Enter c. FormDesigner s to ra phng thc vi tn tng ng

d. Tin hnh ci t m lnh cho phng thc x l s kin trn nh sau: private void btn_MouseEnter(object sender, EventArgs e) { btnCurrentTime.ForeColor = Color.Red; } 9. Tng t, chng ta ci t tip phng thc x l s kin MouseLeave cho nt bm btnCurrentTime nh sau private void btn_MouseLeave(object sender, EventArgs e) { btnCurrentTime.ForeColor = SystemColors.ControlText; } 10. Chy chng trnh v quan st kt qu: iu khin nt bm btnCurrentTime s c hiu ng mouse hover kh n tng: khi r con tr chut vo nt bm btnCurrentTime, mu ch ca n s i sang mu ; mu ch ca nt bm tr
Gio trnh Visual Studio .NET

70

thnh bnh thng (mu ControlText) khi con tr chut r ra khi nt bm. 11. tm hiu k hn bn cht ca vic gn kt phng thc x l s kin, chng ta nhp p chut vo FormMain.Designer.cs trong ca s Solution Explorer xem phn ni dung c sinh ra bi Form Designer:

Gio trnh Visual Studio .NET

71

Gio trnh Visual Studio .NET

72

Ch nhng phn c t sng trong hnh v ni trn; t suy ra c bn cht ca vic gn kt phng thc x l s kin trong khi thit k. 12. ng file ni dung FormMain.Designer.cs li. Cc bc tip theo s minh ha cch thc dng chung mt phng thc x l s kin cho nhiu i tng khc nhau. 13. Trong ca s thit k ca FormMain, thc hin a. Chn c hai i tng btnClose v btnAbout b. Trong trang Events ca ca s Properties, g tn phng thc x l s kin Click cho c hai iu khin nt bm ny l btnTask_Click ri nhn Enter (xem hnh v)

14. Thc hin ci t m lnh cho phng thc ny nh sau:

Gio trnh Visual Studio .NET

73

private void btnTask_Click(object sender, EventArgs e) { if (sender == btnClose) this.Close(); else if (sender == btnAbout)1 MessageBox.Show("Day la chuong trinh minh hoa", "Thong bao"); } Trong phng thc trn, chng ta s dng i s sender nhn bit iu khin no pht sinh s kin. Chng ta cng c th thc hin nh th ny: private void btnTask_Click(object sender, EventArgs e) { string stTask = (sender as Button).Text; 2 if (stTask == "Close") this.Close(); else if (stTask == "About") MessageBox.Show("Day la chuong trinh minh hoa", "Thong bao"); } 15. By gi, chng ta tinh chnh thm chng trnh h tr hiu ng mouse hover cho tt c cc iu khin trong form: a. Sa li phn m ngun cho 2 phng thc x l s kin btn_MouseEnter v btn_MouseLeave nh sau: private void btn_MouseEnter(object sender, EventArgs e) { (sender as Control).ForeColor = Color.Red; } private void btn_MouseLeave(object sender, EventArgs e) { (sender as Control).ForeColor = SystemColors.ControlText;

Thc ra khng nht thit phi c nhnh else if, ch cn else l , bi v y chng ta ch p dng phng thc ny cho hai iu khin btnClose v btnAbout!. 2 Php chuyn kiu (sender as Button) trong cu lnh ny l thnh cng v c btnClose v btnAbout u l cc iu khin kiu Button

Gio trnh Visual Studio .NET

74

} b. Trong phn FormDesigner, chn tt c cc i tng trn b mt Form. c. Trong ca s Properties, chn phng thc x l s kin MouseLeave cho tt c cc i tng ang chn l btn_MouseLeave (xem hnh v)

d. Lm tng t gn phng thc x l s kin MouseEnter cho tt c cc iu khin ni trn l btn_Enter. e. Chy chng trnh xem hiu ng: khi r con tr chut qua cc iu khin, font ch ca chng s c i thnh mu . 16. Trong bc 11, chng ta bit c cch thc a mt thnh phn iu khin vo giao din ca mt Windows Form thng qua m lnh (bng cch tm hiu phn m sinh ra bi Form Designer). By gi, chng ta s p dng thc hin thm cc iu khin vo Form v gn phng thc x l s kin cho chng trong thi gian thc thi chng trnh a. B sung vo Form mt nt bm btnCreateButton

Gio trnh Visual Studio .NET

75

b. Ci t phng thc x l s kin Click cho nt bm ny nh sau:

Gio trnh Visual Studio .NET

76

c. Chy chng trnh v quan st kt qu.

Gio trnh Visual Studio .NET

77

M rng - Hy tm hiu ngha ca vic ci t m lnh bc 15.a: (sender as Control). C th s dng php p kiu no khc khng? Ti sao? - iu chnh trong giao din chng trnh, trong c mt s iu khin (Label, TextBox, RadioButton, CheckBox hoc Button) s dng mu khc vi mu mc nh (l SystemColors.ControlText). Khi , hiu ng mouse hover hot ng khng ng na. Hy chnh sa chng trnh khc phc pht sinh ny.

Gio trnh Visual Studio .NET

78

Bi thc hnh 3.2.2 usingControls Tm tt Xy dng chng trnh in thng tin c nhn nh minh ha

K thut c trnh by Gii thiu mt ng dng WinForms c bn Cch thc lu file vi ni dung ting Vit Cc thnh phn iu khin c bn: Button, Label, TextBox, PictureBox, Timer, Np mt nh t file

Trnh t thc hin 1. To mi mt project loi Windows Application, t tn l usingControls 2. Theo mc nh, mt lp Form1 c sinh ra. Chnh sa cc thuc tnh ca Form1 vi cc gi tr nh bng di: Thuc tnh Name Gi tr FormMain Ghi ch

Gio trnh Visual Studio .NET

79

Text

Hello WinForms

Tiu ca ca s Kch thc ca ca s s khng c thay i khi chy chng trnh V hiu ha nt Maximize ca ca s

FormBorderStyle FixedSingle

MaximizeBox

False

Ch rng, nhng thuc tnh c thay i gi tr so vi mc nh s c hin th trong ca s Properties di dng ch in m 3. Thit k giao din ca form nh minh ha. Lu , vi mi iu khin bn a vo form, nu d nh truy xut n trong phn m ngun khi lp trnh th hy t tn n thay v nh tn mc nh.

Chnh sa thuc tnh ca mt s i tng nh sau: iu khin Thuc tnh Gi tr 80

Gio trnh Visual Studio .NET

dtpDOB

Format CustomFormat

Custom dd/MM/yyyy False Chn font thch hp, in m StretchImage Transparent (Web) 120

txtOther lblInfo picImage lblName tmrScroll

Enable Font SizeMode BackColor Interval

4. Nhn Ctrl + S lu ni dung project. Do chng ta c s dng k t ting Vit trong Form nn Visual Studio c hin th hp thoi yu cu ch nh bng m lu k t:

Nhn nt Save With Other Encoding chn bng m thch hp sau bn c th chn cch lu theo UTF8 nh hnh di (cng c th chn ty chn Unicode Codepage 1200):

Gio trnh Visual Studio .NET

81

5. Ci t phn m lnh cho s kin Click ca nt bm btnSelectImage nh sau:

Khi ngi s dng nhn vo nt ny, mt hp thoi s hin ra cho php chn nh. Ch cc tp tin c phn m rng l BMP, JPG, GIF mi c hin th la chn. iu ny c thit lp thng qua thuc tnh Filter ca i tng dlgOpen (thuc lp OpenFileDialog). 6. Khi ngi s dng g tn ca h vo txtName th ni dung ca lblName cng thay i theo. Mun vy, ta ci t m lnh cho s kin TextChanged ca txtName nh (1) xem minh ha code di 7. i tng txtOther ch c s dng (Enabled) khi m chkOther c check vo, do ta cng ci t m lnh cho s kin CheckChanged ca chkOther nh (2) 8. Khi nhn nt Cp nht th ni dung ca lblInfo c cp nht theo nh phn m lnh ci t cho s kin Click ca btnUpdate (3) 9. Ngi s dng c th bt tt ch cun ni dung dng ch lblInfo bng cch nhn chut vo n. Ci t m lnh cho s kin Click ca lblInfo nh (5)
Gio trnh Visual Studio .NET

82

10. cun ni dung dng ch, ci t m lnh cho s kin Tick ca tmrScroll nh (4)

Gio trnh Visual Studio .NET

83

CHNG 4. X L D LIU VI ADO.NET


X l d liu l nhim v ph bin v quan trng ca nhiu chng trnh ng dng. D liu c truy xut, x l ca mt chng trnh ng dng c th l mt tp tin vn bn, tp tin cc bn ghi, hay l mt ngun d liu t CSDL no . .NET Framework cung cp mt lng ln cc thnh phn giao din (Win Forms, Web Forms) h tr cho vic trnh by, kt buc (bind) d liu. Cng vi l nn tng x l d liu ADO.NET cung cp cch thc lm vic vi nhiu loi ngun d liu khc nhau mt cch linh ng. Do tnh cht quan trng ca vic x l d liu trong mt ng dng cng vi s phc tp ca ADO.NET, trc khi bt tay vo thc hin cc bi tp thc hnh, chng ta kho st qua mt s im l thuyt c bn. 4.1 Kin trc tng quan ca ADO.NET Kin trc ca ADO.NET c m t nh hnh di, bao gm hai thnh phn chnh: Thnh phn truy cp ngun d liu v thnh phn lu tr x l d liu.

Thnh phn th nht:.NET Framework Data Provider c thit k thc hin cc thao tc kt ni, gi cc lnh x l n CSDL (thnh phn ny cn c gi vi mt tn khc l lp kt ni Connectectivity Layer). Trong ADO.NET, c 4 i tng chnh vi cc chc nng c bn nh sau:
Gio trnh Visual Studio .NET

84

Connection: gip thc hin kt ni n cc CSDL Command: gip truy cp n CSDL v thc hin cc pht biu SQL hay th tc lu tr sn (stored procedure) ca CSDL DataReader: dng c nhanh ngun d liu, ch c duyt tun t theo chiu tin ca cc record DataAdapter: dng chuyn d liu truy vn c cho cc i tng lu tr v x l (DataSet, DataTable). DataAdapter ch yu thc hin cc thao tc nh SELECT, INSERT, UPDATE, DELETE V mt thc cht, thnh phn .NET Framework Data Provider cung cp giao din lp trnh chung lm vic vi cc ngun d liu. Mi nh cung cp 3 c th s a ra mt loi data provider ring. Di y l bng m t giao din lp trnh cng vi cc lp c bn ca cc data provider m ADO.NET cung cp sn: SQL Server Provider SqlConnection IDbConnection IDbDataAdapter SqlDataAdapter SqlCommand IDbCommand IDbDataReader SqlDataReader Interface Oracle Provider OracleConnection OracleDataAdapter OracleCommand OracleDataReader OLEDB Provider OledbConnection OledbDataAdapter OledbCommand OledbDataReader ODBC Provider OdbcConnection OdbcDataAdapter OdbcCommand OdbcDataReader

s dng data provider no, chng ta phi tin hnh khi bo using namspace tng ng. Chng hn, using System.Data.SqlClient; Ngoi nhng data provider m t bng trn, chng ta c th reference n cc data provider khc khng c tch hp sn bi ADO.NET trong Visual Studio .NET, chng hn nh data provider dng cho MySQL, Postgre, Thnh phn th hai trong kin trc ADO.NET DataSet c xem nh l container dng lu tr i tng lin quan n d liu nh DataTable, DataRelation, DataView. Thnh phn ny cn c gi l lp khng kt ni (disconected layer).

Nh cung cp y c hiu theo ngha c v loi ngun d liu ln cch thc truy xut ngun d liu. V d, ngoi data provider SqlClient do Microsoft cung cp, cng c th c mt t chc khc pht trin mt provider khc truy xut loi ngun d liu ny.

Gio trnh Visual Studio .NET

85

DataSet nh l mt CSDL thu nh ti my client, c th cha cc i tng table, view, constaint, ralationship gia cc table, Tt c d liu t ngun d liu thc s c np vo DataSet di dng cc DataTable, l mt snapshot ca ngun d liu thc. Khi d liu ny s c chnh sa c lp, sau nu cn s c cp nht tr li ngun d liu thc. Theo nguyn tc ny, chng ta khng cn duy tr kt ni lin tc mt cch khng cn thit vi ngun d liu thc trong sut qu trnh thao tc vi n. 4.2 Tng quan v cc m hnh x l d liu trong ADO.NET 4.2.1 M hnh Kt ni Trong m hnh kt ni ca ADO.NET, c mt connection hot ng c duy tr gia i tng DataReader ca ng dng v mt data source (ngun d liu). Mt dng d liu (data row) c tr v t data source mi khi phng thc Read ca i tng DataReader c thc thi. im quan trng nht ca m hnh kt ni l d liu c ly t tp d liu (cc record c tr v bi mt lnh SQL no ) theo kiu tng record mt cho mt ln c, ch c (read-only), v ch theo mt hng tin (forward-only). Hnh di y m t cch s dng DataReader trong ch kt ni.

Cc bc in hnh lm vic vi i tng DataReader l nh sau: 1. To i tng Connection bng cch truyn mt chui Connection string cho hm khi dng ca n. 2. Khi to mt bin chui v gn cho cu lnh SQL da theo d liu mun np v. 3. Khi to mt i tng Command t vi ni dung cu lnh SQL xc nh trn. 4. To i tng DataReader bng cch thc thi phng thc Command.ExecuteReader(). i tng ny sau s c dng c kt qu ca cu truy vn mi dng mt ln. on code sau minh ha cc bc trn vi Data Provider SqlClient. on code s c Gio trnh Visual Studio .NET 86

danh sch h tn cc sinh vin trong mt bng SinhVien ca c s d liu v hin th ln mt iu khin ListBox. Chi tit v cc i tng DataReader, Command, Connection s c cp chi tit sau. using System.Data.SqlClient; ... // (1) Tao Connection SqlConnection cn = new SqlConnection(chuoiKetNoi); cn.Open(); // (2) Chuoi SQL thuc hien lay danh sach ten cac sinh vien xep tang dan theo NgaySinh string sql = "SELECT HoTen FROM SinhVien ORDER BY NgaySinh"; // (3) Tao doi tuong Command SqlCommand cmd = new SqlCommand(sql, conn); DbDataReader rdr; // (4) Tao doi tuong DataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); while (rdr.Read()) listBox1.Items.Add(rdr["HoTen"]); // Fill ListBox rdr.Close(); // Dong datareader sau khi da su dung xong Tham s c s dng trong phng thc ExecuteReader xc nh i tng Connection s c ng sau khi DataReader c ng. 4.2.2 M hnh Ngt Kt ni Trit l ca m hnh Ngt kt ni l: D liu c np s dng mt lnh SQL t ngun d liu bn ngoi vo b nh m ti my client; tp kt qu c x l ti my cc b; mi cp nht sau s c truyn t d liu trong b nh ngc tr li ngun d liu. M hnh c gi l ngt kt ni bi v i tng kt ni ch c m lu c d liu t ngun d liu v tin hnh cc thao tc cp nht. Bng cch a d liu v pha my client, ti nguyn ca server chng hn nh thng tin d liu Connection, b nh, thi gian x l s c gii phng bt. Tuy vy, m hnh ny cng c nhc im v thi gian cn np tp d liu v b nh dng cha d liu ti my client. Nh hnh di y minh ha, cc thnh phn chnh ca m hnh ngt kt ni l DataApdapter v DataSet. DataAdapter lm nhim v nh l cu ni gia ngun d liu v DataSet, np d liu vo cc bng ca DataSet v y cc thay i ngc tr li ngun
Gio trnh Visual Studio .NET

87

d liu. Mt DataSet ng vai tr nh l mt c s d liu quan h nm trong b nh, cha mt hay nhiu DataTables, gia cc DataTable ny cng c th c cc mi quan h vi nhau nh trong mt c s d liu quan h thc. Mt DataTable cha cc dng v cc ct d liu thng c ly t c s d liu ngun.

Trong s cc phng thc v thuc tnh ca DataAdapter th Fill() v Update() l hai phng thc quan trng nht. Fill() chuyn mt query n c s d liu v lu tp kt qu tr v trong mt DataTable no ; phng thc Update() thc hin mt thao tc thm, xa, cp nht da trn nhng thay i ca i tng DataSet. Cc lnh cp nht thc s c cha trong cc thuc tnh ca DataAdapter. Chi tit v DataAdapter s c cp phn sau. minh ha cch thc lm vic vi DataAdapter v DataSet, on code di y gii thiu cch to ra mt i tng DataTable, np d liu t mt c s d liu, v a n vo mt DataSet. string sql = "SELECT MaSinhVien, HoTen, NgaySinh FROM SinhVien"; string connStr = "Data Source=MYSERVER;Initial Catalog=qlsinhvien; User Id=k28;Password=k28;"; // (1) Tao doi tuong data adapter SqlDataAdapter da = new SqlDataAdapter(sql, connStr); // (2) Tao doi tuong dataset DataSet ds = new DataSet(); // (3) Tao mot Table co ten SinhVien trong dataset va nap du lieu cho no da.Fill(ds, "SinhVien"); // (4) Hien thi danh sach ten sinh vien ra list box DataTable dt = ds.Tables["SinhVien"]; for (int i=0; i< dt.Rows.Count;i++) { DataRow row = dt.Rows[i]; listBox1.Items.Add(row["HoTen"]); }
Gio trnh Visual Studio .NET

88

Bc u tin l to ra mt th hin ca SqlDataAdapter bng cch truyn mt cu lnh SELECT v chui kt ni cho phng thc khi dng ca lp ny. DataAdapter s lo n vic to ra i tng Connection cng nh vic m, ng Connection khi cn thit. Sau khi mt DataSet rng s c to ra, phng thc Fill() ca DataAdapter s to ra mt DataTable c tn l SinhVien trong DataSet v np cc dng d liu vo DataTable ny (bng cu ln SQL dng SELECT ca DataAdapter). Mi column ca DataTable s tng ng vi mt column trong bng ca c s d liu ngun. D liu trong bng d liu sau c a vo mt ListBox bng cch duyt qua danh sch cc dng ca DataTable. 4.3 Lm vic vi m hnh Kt ni trong ADO.NET Nh m t tng quan trong phn trc, m hnh Kt ni c da trn vic thit lp mt Connection n CSDL v sau s dng cc Command thc hin vic thm, xa, sa, hay c d liu t data source (ngun d liu) c kt ni. c im phn bit ca m hnh ny l cc Command c pht sinh, lm vic vi data source thng qua mt Connection ang hot ng Connection ny s m cho n khi cc thao tc c hon tt. Cho d l lm vic vi m hnh Kt ni hay Ngt kt ni, bc u tin trong qu trnh truy xut mt data source l to ra mt i tng Connection lm ng truyn gia ng dng vi data source. 4.3.1 Lp Connection C nhiu lp Connection trong ADO.NET mi lp tng ng vi mt Data Provider bao gm SqlConnection, OracleConnection, OleDbConnection, OdbcConnection. Mc d mi lp c th gm nhng c tnh ring, nhng cc lp ny u phi implement interface IDbConnection. Bng di y tm tt cc thnh phn c nh ngha bi interface ny. Loi Tn M t Get/Sets chui kt ni n data source. Property ConnectionString Property ConnectionTimeout Khong thi gian ti a tnh bng giy ch thc hin vic kt ni n data source Tn CSDL ng vi Connection hin ti Property Database Trng thi hin ti ca Connection. Tr v mt gi tr Property State kiu lit k (enumeration): Broken, Closed, Connecting, Executing, Fetching, hoc Open

Gio trnh Visual Studio .NET

89

Loi Method

Tn Open Close

Method Method

BeginTransaction ChangeDatabase

Method

CreateCommand

M t M mt Connection. Roll back mi thao tc ang lm d. ng Connection tr Connection cho Connection Pool nu nh c s dng Connection Pool Khi to mt database transaction Thay i CSDL hin ti cho Connection ang m. Chui m t tn CSDL mi c truyn cho phng thc ny To ra mt i tng Command ng vi Connection

4.3.1.1 Connection string Thuc tnh ConnectionString xc nh data source v cc thng tin cn thit truy xut data source, chng hn nh User ID v Password, Ngoi nhng thng tin c bn ny, Connection string cn c th cha cc gi tr cho cc trng d liu c trng cho data provider. V d, Connection string cho Ms Sql Server c th cha cc gi tr quy nh Connection Timeout v Packet Size. Di y l cc v d v cch thnh lp chui kt ni cho cc data provider thng gp. Danh sch y v cch thnh lp cc chui kt ni c cho Error! Reference source not found.. SqlConnection s dng c ch xc thc kiu SQL Server: server=(1);database=(2);uid=(3);pwd=(4) hoc Data Source=(1);Initial Catalog=(2);User ID=(3);Password=(4) SqlConnection s dng c ch xc thc kiu Windows: Server=(1);Database=(2);Trusted_Connection=yes y, (1) l tn/my ch cha CSDL, (2) l tn CSDL, (3) l tn ng nhp, (4) l mt khu tng ng. V d: server=192.168.0.1;database=qlnhanvien;uid=k28;pwd=spider
Gio trnh Visual Studio .NET

90

hoc Server=192.168.0.1;Database=qlnhanvien;Trusted_Connection =yes OleDbConnection s dng kt ni CSDL Access phin bn trc 2003: Provider=Microsoft.Jet.OLEDB.4.0;DataSource= V d: o string stConnection = string.Format(Provider=Microsoft.Jet.OLEDB.4.0;DataSou rce={0}, @c:\program files\qlnhanvien.mdb); o S dng trong ng dng Internet: string stConnection = string.Format(Provider=Microsoft.Jet.OLEDB.4.0;DataSou rce={0}, Server.MapPath(/data/qlnhanvien.mdb); ODBC: DSN= vi DSN=qlnhanvien l Data Source Name (DSN), v d

Cc Connection string c dng to ra i tng Connection. Cch thc hin thng thng l truyn chui ny cho hm khi dng nh v d di y: string stConnection = "Data Source=192.168.0.1; + Initial Catalog=films; + User Id=k28;+ Password=spider"; SqlConnection cn = new SqlConnection(stConnection); cn.Open(); //Open connection 4.3.1.2 Connection Pooling To mt Connection l mt qu trnh tn nhiu thi gian trong mt s trng hp, vic ny thm ch cn tn thi gian hn vic thc thi cc Command. loi b iu ny, ADO.NET cung cp mt khi nim gi l connection pool. Connection pool qun l cc Connection c trng Connection string ti u ha s ln thit lp, hp l ha thng tin kt ni.
Gio trnh Visual Studio .NET

91

Cc quy tc quy nh connection pool cn bit: - C ch Connection pooling c kch hot theo mc nh. C ch ny c tt bng cch thm vo Connection string Pooling=false i vi SqlConnection hoc OLE DB Services=-4 i vi OleDbConnection. - Mi connection pool c ng vi mt connection string duy nht. Khi c mt Connection c yu cu, pool handler (b qun l pool) s so snh connection string vi nhng connection string trong cc pools ang tn ti. Nu c mt Connection trng khp th Connection tng ng s c xc nh trong pool. - Nu tt c cc connection trong pool ang c s dng khi li c yu cu v connection th yu cu s c xp vo hng i cho n khi c mt connection rnh. Cc connection s c gii phng khi phng thc Close hay Dispose ca i tng connection c gi. - Connection pool c ng khi tt c cc connection trong n c gii phng v ht thi gian (time out). i vi SQL Server, bn c th iu khin hnh vi ca conneciton pooling bng cch gp cc cp key-value vo connection string. Cc key ny c th c s dng thit lp s lng nh nht v ln nht cc connection trong pool cng nh xc nh xem mt connection c cn phi reset khi n c ly t pool ra hay khng. Mt key c bit ch l key c tn Lifetime, xc nh thi gian m connection c th tn ti trc khi n b hy b. Gi tr ny c kim tra khi mt connection c tr v cho pool. Nu connection c m trc , v lu hn gi tr Lifetime th n s b hy. on code di y minh ha cc dng cc key ny cho SqlClient: string stConnection = "Server=192.168.0.1; + Trusted_Connection=yes; + database=qlnhanvien;" + "connection reset=false;" + "connection Lifetime=60;" + // Seconds "min pool size=1;" + "max pool size=50"; // Default=100 SqlConnection cn = new SqlConnection(cnString); 92

Gio trnh Visual Studio .NET

4.3.2 i tng Command Sau khi mt i tng connection c to ra, bc tip theo trong qu trnh truy xut CSDL i vi m hnh Kt ni l to ra mt i tng Command gi mt query (select) hay mt action command (thm, xa, sa) n data source. C nhiu loi lp Command ng vi cc data provider; cc lp ny u implement interface IDbCommand. 4.3.2.1 To i tng Command Bn c th dng mt trong nhiu hm khi dng to i tng Command mt cch trc tip hoc s dng cch tip cn ProviderFactory. on code di y minh ha cc to ra mt i tng Command v thit lp cc thuc tnh ca n. SqlConnection conn = new SqlConnection(connstr); conn.open(); string sql =
"INSERT INTO SinhVien (MaSinhVien, HoTen) VALUES (@pMaSinhVien, @pHoTen)";

SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.commandText = sql; cmd.Parameters.AddWithValue ("@pMaSinhVien", 12); cmd.Parameters.AddWithValue ("@pHoTen", "tnv spider"); Trong trng hp ng dng c th phi s dng nhiu data provider, bn nn s dng cch tip cn provider factory. Factory c to ra bng cch truyn chui data provider cho hm khi dng ca n. Tip n, phng thc CreateCommand c gi tr v mt i tng command. string provider = "System.Data.SqlClient"; DBProviderFactory factory = DbProviderFactories.GetFactory(provider); DbCommand cmd = factory.CreateCommand(); // DbCommand l mt lp tru tng cmd.CommandText = sql; // sql l mt chui query hay command cmd.Connection = conn; // conn l mt Connection 4.3.2.2 Thc thi mt Command Lnh SQL c gn trong thuc tnh CommandText ca i tng Command s c thc thi bng mt trong cc phng thc c ch ra bng di y Phng thc M t 93

Gio trnh Visual Studio .NET

ExecuteNonQuery

Thc thi truy vn hnh ng (action query) v tr v s lng dng d liu b nh hng bi truy vn : cmd.CommandText = "DELETE SinhVien WHERE MaSinhVien=12"; int soLuong = cmd.ExecuteNonQuery();

ExecuteReader

Thc thi mt query v tr v i tng DataReader c th truy cp tp kt qu ca query . Phng thc ny nhn mt tham s ty chn kiu CommandBehavior c th tng hiu nng thc thi query. cmd.CommandText = "SELECT * FROM SinhVien + WHERE YEAR(NgaySinh) > 1981; SqlDataReader rdr= cmd.ExecuteReader();

ExecuteScalar

Thc thi mt query v tr v gi tr ca ct u tin trong dng u tin ca tp kt qu. cmd.CommandText="SELECT COUNT(MaSinhVien) FROM SinhVien"; int soSinhVien = (int)cmd.ExecuteScalar();

ExecuteXmlReader Ch c cho data provider SQL Server. Tr v mt i tng XmlReader dng truy xut tp d liu. Tham kho thng tin v XmlReader trong MSDN ExecuteReader l phng thc quan trng nht trong cc phng thc k trn. Phng thc ny tr v mt i tng DataReader gip truy xut n cc dng d liu tr v bi query. Xem v d di y: dr = cmd.ExecuteReader(sql, ); y, l mt gi tr kiu CommandBehavior ch nh behavior (hnh vi) thc thi ca query. Mt s data providers s dng ti u qu trnh thc thi query. Danh sch
Gio trnh Visual Studio .NET

94

cc gi tr v tc dng ca tham s c m t chi tit nh di y:


SingleRow. Ch nh rng query ch tr v 1 dng d liu. Behavior mc nh l tr v nhiu tp kt qu. SingleResult. Query tr v mt gi tr tuyn tnh n nht (single scalar value). KeyInfo. Tr v thng tin v column v primary key. Behavior ny c s dng vi phng thc GetSchema ca DataReader ly thng tin v cc column trong lc (schema). SchemaOnly. Dng ly v tn ca cc ct trong tp d liu tr v: V d dr = cmd.ExecuteReader(CommandBehavior.SchemaOnly); string col1 = dr.GetName(0); // tn ct u tin

SequentialAccess. Cho php d liu trong dng tr v c th c truy xut tun t theo column. Behavior ny c dng cho cc trng d liu BLOB hay TEXT. CloseConnection. ng connection khi DataReader c ng.

3.3.2.3 Thc thi Stored Procedure (th tc lu tr sn) vi i tng Command Mt stored procedure l mt on code SQL c lu sn trong CSDL v c th c thc thi nh l mt script. ADO.NET h tr vic thc thi cc stored procedure cho cc data provider OleDb , SqlClient, ODBC, v OracleClient. Cc bc thc thi mt stored procedure: - Thit lp thuc tnh SqlCommand.CommandText thnh tn ca procedure; - Thit lp thuc tnh CommandType l CommandType.StoredProcedure; - Thit lp cc Parameter (nu c) cho procedure - Thc thi phng thc ExecuteNonQuery. Th tc di y cho php cc mu tin ly v t bng SinhVien c phn thnh tng nhm cc trang, mi trang 10 record. u vo ca ca procedure l @pTrang (s hiu trang cn ly); u ra ca procedure l s trang tng cng ca tp d liu. on code minh ha pha di thc hin vic thit lp ly v trang d liu u tin. SqlCommand cmd = new SqlCommand(); cmd.CommandText = "spListSinhVien"; // tn procedure
Gio trnh Visual Studio .NET

95

cmd.CommandType = CommandType.StoredProcedure; cmd.Parameters.Add(@pTrang", SqlDbType.Int); cmd.Parameters.Add(@pTongSoTrang", SqlDbType.Int); cmd.Parameters[0].Direction= ParameterDirection.Input; cmd.Parameters[0].Value= 1; // thit lp ly v trang u tin cmd.Parameters[1].Direction=ParameterDirection.Output; cmd.CommandTimeout=10; // Cho command ti a 10s thc thi SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { // x l tp d liu y } dr.Close(); // DataReader phi c ng trc khi c tham s u ra int tongSoTrang = cmd.Parameters[1].Value; V d ny s dng data provider SqlClient. C th chnh sa mt phn nh th n cng c th hot ng vi OleDb. im khc bit mu cht gia SqlClient v OleDb l cch qun l cc parameter. SqlClient yu cu tn parameter phi ng vi tn parameter ca stored procedure; trong khi OleDb li truyn cc parameter cho stored procedure da vo v tr, v vy tn parameter l khng quan trng. Nu procedure tr v gi tr kt qu, OleDb phi thit k parameter u tin trong danh sch lm nhim v ny. Vi SqlClient, chng ta ch cn thm mt parameter vi mt tn no v xc nh hng tr v (direction) ca parameter ny l Return Value. Phn code ca stored procedure l nh sau: CREATE PROCEDURE spListSinhVien @pTrang int, @pTongSoTrang int output AS /* Th tc tr v mt tp kt qu gm cc SinhVien xp theo HoTen. Tp kt qu c phn thnh cc trang, mi trang 10 SinhVien. */ SET NOCOUNT ON SELECT @pSoTrang = CEILING(COUNT(*)/10) FROM SinhVien if @pTrang = 1 or @pTrang <1 begin SELECT TOP MaSinhVien, HoTen FROM SinhVien ORDER BY HoTen set @pTrang = 1
Gio trnh Visual Studio .NET

96

return 0 end if @pTrang > @pTongSoTrang begin SET @pTrang = @pTongSoTrang declare @RowCount int set @RowCount = (@pTrang * 10) exec ( 'SELECT * FROM ( SELECT TOP 10 a.* FROM ( SELECT TOP ' + @RowCount + ' * FROM SinhVien ORDER BY HoTen )a ORDER BY HoTen desc )b ORDER BY HoTen' ) return 0 end 4.3.2.4 S dng Parameter trong cc Command khng phi l Stored Procedures Trong cc query c thnh lp trc tip (ch khng phi l stored procedure nh trn), chng ta cng c th s dng cc Parameter. V d di y minh ha cch thc b sung mt record vo bng SinhVien: string sql =
"INSERT INTO SinhVien (MaSinhVien, HoTen) VALUES (@pMaSinhVien, @pHoTen)";

SqlCommand cmd = new SqlCommand(); cmd.Connection = conn; cmd.commandText = sql;

Gio trnh Visual Studio .NET

97

cmd.Parameters.AddWithValue("@pMaSinhVien", 12); cmd.Parameters.AddWithValue("@pHoTen", "tnv spider"); Mt cch khc thc hin vic b sung record nh trn l s dng php ni chui4 nh th ny: int iMaSinhVien = 12; string stHoTen = "tnv spider"; sql = string.Format(INSERT INTO SinhVien (MaSinhVien, HoTen) VALUES ({0}, {1}), iMaSinhVien, stHoTen); SqlCommand cmd = new SqlCommand(sql, conn); 4.3.3 i tng DataReader Nh thy trong cc v d trc, mt DataReader cho php ly cc dng v ct d liu ca d liu tr v khi thc thi mt query. Vic truy xut dng c nh ngha bi interface IDataRecord. Di y l cc member quan trng ca interface ny. 4.3.3.1 Truy xut cc dng d liu vi DataReader DataReader ly v tng dng n (single row) t mt tp d liu tr v mi khi phng thc Read ca n c thc thi. Nu khng c dng d liu no th phng thc ny tr v gi tr false. DataReader phi c ng sau khi cc thao tc x l cc dng c hon tt gii phng ti nguyn h thng. Bn c th s dng thuc tnh DataReader.IsClosed bit c DataReader c ng hay cha. Mc d DataReader l ng vi mt Command n, nhng Command ny li c th cha nhiu query trong , do c th tr v nhiu tp d liu kt qu. on code di y minh ha cch x l cc dng d liu tr v bi 2 query trong mt Command. string q1 = "SELECT * FROM SinhVien WHERE YEAR(NgaySinh) < 1981"; string q2 = "SELECT * FROM SinhVien WHERE YEAR(NgaySinh) > 1990";

Trong thc t, gii php ni chui t khi c s dng v l do an ton d liu. Hy hnh dung trong on code ny, nu stHoTen c gn gi tr l tnv spider); DELETE * FROM SinhVien;--. Khi query c thc thi s l
INSERT INTO SinhVien (MaSinhVien, HoTen) VALUES (12, tnv spider); DELETE * FROM SinhVien;--)

L hng kiu ny thng c gi vi tn SQL Injection.

Gio trnh Visual Studio .NET

98

cmd.CommandText = q1 + ";" + q2; // hai query c ngn cch nhau bi du ; DbDataReader rdr = cmd.ExecuteReader(); bool readNext = true; while (readNext) { while (rdr.Read()) MessageBox.Show(rdr.GetString(1)); readNext = rdr.NextResult(); // kiem tra xem con tap du lieu nao nua khong } rdr.Close(); conn.Close(); DataReader khng c thuc tnh hay phng thc no cho bit s lng dng d liu tr v trong tp d liu ca n (do c tnh forward-only ca DataReader), tuy nhin, chng ta c th s dng thuc tnh HasRows (kiu Boolean) ca DataReader xc nh xem n c 1 hay nhiu dng c hay khng. 4.3.3.2 Truy xut gi tr ca column C nhiu cch truy xut d liu cha trong cc columns ca dng hin ti ca DataReader: - Truy xut nh l mt array dng s th t column (bt u t 0) hoc dng tn column - S dng phng thc GetValue bng cch truyn cho phng thc ny s th t ca column - S dng mt trong cc phng thc nh kiu GetXXX, bao gm GetString, GetInt32, GetDateTime, GetDouble, on code di y minh ha cc thc truy xut gi tr d liu ca cc column. cmd.CommandText = "SELECT MaSinhVien, Hoten, GioiTinh, NgaySinh FROM SinhVien + WHERE YEAR(NgaySinh) = 1981"; dr = cmd.ExecuteReader(); dr.Read(); // Cc cch ly d liu kiu string ct th 2 (HoTen) string stHoTen; stHoTen = dr.GetString(1); stHoTen = (string)dr.GetSqlString(1); // SqlClient provider stHoTen = (string)dr.GetValue(1);
Gio trnh Visual Studio .NET

99

stHoTen = (string)dr["HoTen"]; stHoTen = (string)dr[1]; // Ly d liu kiu DateTime ct th 4 (NgaySinh) c kim tra gi tr NULL if (!dr.IsDbNull(3)) DateTime dtNgaySinh = dr.GetDateTime(3); Phng thc GetString c im thun li trong vic nh x ni dung d liu t CSDL sang kiu d liu ca .NET. Cc cch tip cn khc u tr v cc kiu i tng c yu cu php chuyn kiu. V l do ny, bn nn s dng cc phng thc GetXXX cho cc kiu d liu xc nh. Cng lu rng, phng thc GetString khng yu cu php chuyn kiu, nhng bn thn n khng thc hin bt c php chuyn i no; chnh v th, nu d liu l khng ng nh kiu d liu trng i s c Exception c tr ra. Nhiu ng dng ph thuc vo tng x l d liu cung cp DataReader. Vi nhng trng hp nh th, ng dng c th s dng metadata (siu d liu) xc nh tn column, kiu d liu ca column, v cc thng tin khc v column. on code sau y minh ha vic in ra danh sch cc tn v kiu d liu ca cc column m i tng DataReader ang qun l: // In ra danh sch cc tn column ca mt i tng DataReader c tn dr for (int i = 0; i < dr.FieldCount; i++) Console.WriteLine(Column {0} co kieu du lieu {1}, dr.GetName(i), dr.GetDataTypeName(i)); // Column name C mt cch khc ton din hn qun l ton b thng tin v lc (schema) ca tp d liu kt qu tr v, l s dng phng thc GetSchemaTable. Phng thc ny tr v mt i tng DataTable m mi dng trong DataTable ny s biu din mt column trong tp d liu kt qu. on code di y minh ha cch truy xut tt c cc thng tin v cc column ca mt tp d liu tr v. DataTable schemaTable = dr.GetSchemaTable(); int stt = 0; foreach (DataRow r in schemaTable.Rows) { foreach (DataColumn c in schemaTable.Columns) { Console.WriteLine(stt.ToString() + " " + c.ColumnName + ": " + r[c]); stt++; }
Gio trnh Visual Studio .NET

100

} Kt qu hin th: 0 ColumnName: movie_ID 1 ColumnOrdinal: 0 //khng lit k 12 DataType: System.Int32 //khng lit k 4.3.4 Bi thc hnh Gi s ta c c s d liu quanlythuvien trong SQL Server c quan h nh sau:

Bi thc hnh v i tng Connection, Command v DataReader Thit k Form to mi 1 ti khon nh sau (lm vic trn bng nhanvien):

Gio trnh Visual Studio .NET

101

ListView1

Frmtaomoitk s dng cc trng, phng thc v s kin sau:

Gio trnh Visual Studio .NET

102

Cc iu khin Tn iu khin Thuc tnh Form Name: Frmtaomoitk Text:To mi mt ti khon s dng chng trnh listView Name:listView1 Columns: Add thm 4 ct: H tn, a ch, Tn ng nhp v Quyn hn View: Details GridLines:True groupBox Name:groupBox1 Text: Thng tin c bn Label To ra 5 label hin th: M nhn vin, H tn, a ch, Tn ng nhp v quyn hn. TextBox To ra 4 TextBox ln lt vi cc tn: txtmanv, txthoten, txtdiachi, txttendangnhap Button To 8 button ln lt vi cc tn butdau, butlui, buttien, butcuoi, buttaomoi, buttimkiem, butxoabo,butthoat Cc trng: Tn trng Cn cmdSelect cmdInsert cmdXoa I ngha Dng kt ni n c s d liu quanlythuvien sqlCommand s dng cu lnh select hin th v tm kim sqlCommand s dng cu lnh Insert to thm 1 ti khon sqlCommand s dng cu lnh Delete xa 1 ti khon Ti khon th i

Cc phng thc + Hm dng Frmtaomoitk to giao din public Frmtaomoitk() { InitializeComponent(); } + Phng thc Moketnoi(): Kim tra ng kt ni, nu ang m th ng li, sau m li ng kt ni private void Moketnoi() { if (cn.State == ConnectionState.Open)
Gio trnh Visual Studio .NET

103

cn.Close(); cn.Open(); } + Phng thc LoadListView: Ly d liu ca bng nhanvien np d liu ln listView1. Phng thc ny c gi khi thay i d liu trong bng nhn vin nh nhp thm hoc xa i 1 nhn vin. S dng 2 i tng SqlCommand, SqlDataReader private void LoadListView() { Moketnoi(); cmdSelect = new SqlCommand("select * from nhanvien", cn); SqlDataReader r = cmdSelect.ExecuteReader(); listView1.Items.Clear(); // Xa tt c d liu trong listView1 while (r.Read()) { string[] st = new string[5]; st[0] = r[0].ToString(); st[1] = r[1].ToString(); st[2] = r[2].ToString();// Khng hin th mt khu, nn khng c r[3] st[3] = r[4].ToString(); st[4] = r[5].ToString(); ListViewItem lv = new ListViewItem(st); listView1.Items.Add(lv); } cmdSelect.Dispose(); } + Phng thc LoadItem: Ly d liu t dng th i ca listView1 a vo txtmanv, txthoten, txtdiachi, txttendangnhap v comboBox1. Phng thc ny c gi khi di chuyn qua li thng tin ca cc nhn vin. private void LoadItem(int i) { txtmanv.Text = listView1.Items[i].Text; txthoten.Text = listView1.Items[i].SubItems[1].Text; txtdiachi.Text = listView1.Items[i].SubItems[2].Text; txttendangnhap.Text = listView1.Items[i].SubItems[3].Text; comboBox1.Text = listView1.Items[i].SubItems[4].Text; } + Phng thc LoadCombox: a d liu vo cho comboBox1. Gi s ch c 3 quyn hn: admin, sinhvien v Thuthu. Phng thc ny c gi khi va np Form ln
Gio trnh Visual Studio .NET

104

private void LoadCombox() { comboBox1.Items.Add("Admin"); comboBox1.Items.Add("Sinhvien"); comboBox1.Items.Add("ThuThu"); comboBox1.Text = "Admin"; } + Phng thc XoaTextBox: Xa ht d liu trong cc textBox, phng thc ny c goi khi nhp thm 1 ti khon. private void XoaTextBox() { txtmanv.Clear(); txthoten.Clear(); txtdiachi.Clear(); txttendangnhap.Clear(); txtmanv.Focus(); } + Phng thc KiemTraMa: Kim tra xem c m nhn vin no bng vi ma hay khng. Phng thc ny c gi khi nhp thm 1 ti khon private int KiemTraMa(string ma) { Moketnoi(); cmdSelect = new SqlCommand("select count(*) from nhanvien where manhanvien='"+ma.Trim()+"'"); cmdSelect.Connection = cn; return (int)cmdSelect.ExecuteScalar(); } + S kin Frmtaomoitk_Load: To v m ra ng kt ni n c s d liu quanlythuvien, tn my ch nhha, s dng c ch xc thc kiu Windows, no d liu vo cho cc iu khin. private void Frmtaomoitk_Load(object sender, EventArgs e) { try { cn = new SqlConnection("Data Source=nhha;Initial Catalog=quanlythuvien; Trusted_Connection=yes"); cn.Open(); }
Gio trnh Visual Studio .NET

105

catch (Exception loi) { MessageBox.Show("Khng th kt ni c"); } LoadListView(); //Np d liu vo cho listView1 i = 0; LoadItem(i);// Np d liu vo cho cc textBox v comboBox1 LoadCombox(); } + S kin butdau_Click: Np d liu ca dng u tin t listView1 vo cho cc textBox v comboBox private void butdau_Click(object sender, EventArgs e) { i = 0; LoadItem(i); } + S kin buttien_Click: Np d liu ca dng tip theo t listView1 vo cho cc textBox v comboBox private void buttien_Click(object sender, EventArgs e) { i++; if (i == listView1.Items.Count) i = listView1.Items.Count - 1; LoadItem(i); } + S kin butlui_Click: private void butlui_Click(object sender, EventArgs e) { i--; if (i < 0) i = 0; LoadItem(i); } + S kin butcuoi_Click: private void butcuoi_Click(object sender, EventArgs e) { i = listView1.Items.Count - 1; LoadItem(i); } + S kin butTaomoi_Click: c s dng thm 1 ti khon (1 nhn vin), nt butTaomoi c 2 trng thi to mi v lu. Nu ngi s dng kch vo nt To mi s
Gio trnh Visual Studio .NET

106

chuyn sang trng thi l lu v ngc li. private void butTaomoi_Click(object sender, EventArgs e) { if (butTaomoi.Text.Equals("To mi")) { XoaTextBox(); butTaomoi.Text = "Luu"; } else // Kim tra xem m nhn vin ny c hay cha ? if (KiemTraMa(txtmanv.Text)==1) { MessageBox.Show("M ny c"); txtmanv.Clear(); txtmanv.Focus(); } else { string ma = txtmanv.Text; string hoten = txthoten.Text; string diachi = txtdiachi.Text; string tendangnhap = txttendangnhap.Text; string matkhau = "";// Khi to 1 ti khon th mt khu ban u l rng string quyenhan = comboBox1.Text; Moketnoi(); string sql="insert into nhanvien values("+"'"+ma+"','"+hoten+"','"+diachi +"','" +tendangnhap+"','"+matkhau+"','"+quyenhan +"')"; cmdInsert = new SqlCommand(sql,cn); cmdInsert.ExecuteNonQuery(); MessageBox.Show(" lu thnh cng"); LoadListView(); //Np li d liu mi vo listView1 butTaomoi.Text = "To mi"; cmdInsert.Dispose(); } } + S kin buttimkiem_Click: Khi ngi s dng g 1 m nhn vin vo txtmanv v kch vo nt buttimkiem, nu tm thy m nhn vin ny s hin th kt qu ln cc textBox v comboBox private void buttimkiem_Click(object sender, EventArgs e) {
Gio trnh Visual Studio .NET

107

Moketnoi(); string sql = "select * from nhanvien where manhanvien='" + txtmanv.Text + "'"; cmdSelect = new SqlCommand(sql,cn); SqlDataReader dr = cmdSelect.ExecuteReader(); if (dr.Read())// tm thy { txtmanv.Text = dr[0].ToString(); txthoten.Text = dr[1].ToString(); txtdiachi.Text = dr[2].ToString(); txttendangnhap.Text = dr[4].ToString(); comboBox1.Text = dr[5].ToString(); } else MessageBox.Show("Khng tm thy"); } + S kin butXoabo_Click: Xa nhn vin c m nhn vin txtmanv private void butXoabo_Click(object sender, EventArgs e) { DialogResult dr = MessageBox.Show("Chc chn xa hay khng ?", "Thng bo", MessageBoxButtons.YesNo); if (dr == DialogResult.Yes) // Nu ngi s dng chn nt yes { Moketnoi(); string Sql = "delete from nhanvien where manhanvien='" + txtmanv.Text + "'"; cmdXoa = new SqlCommand(Sql,cn); if (cmdXoa.ExecuteNonQuery() == 1) { MessageBox.Show("Xa thnh cng"); LoadListView(); LoadItem(0); } else MessageBox.Show("Khng tn ti m nhn vin " + txtmanv.Text); cmdXoa.Dispose(); } } 4.4 Lm vic vi m hnh Ngt kt ni: DataSet v DataTable M hnh Ngt Kt ni ca ADO.NET da trn c s s dng i tng DataSet nh l mt vng nh m. Mt i tng DataAdapter lm nhim v trung gian gia DataSet v
Gio trnh Visual Studio .NET

108

data source (ngun d liu) np d liu vo vng nh m. Sau khi DataAdapter hon thnh nhim v np d liu, n s tr i tng Connection v pool, v th n ngt kt ni khi ngun d liu. 4.4.1 Lp DataSet DataSet ng vai tr ca mt CSDL in-memory (CSDL nm trong b nh). Thuc tnh Tables ca DataSet l mt tp hp cc DataTable cha d liu v lc d liu (data schema) m t d liu trong DataTable. Thuc tnh Relations cha tp hp cc i tng DataRelation xc nh cch thc lin kt cc i tng DataTable ca DataSet. Lp DataSet cng h tr vic sao chp, trn, v xa DataSet thng qua cc phng thc tng ng l Copy, Merge, v Clear. DataSet v DataTable l phn li ca ADO.NET v chng khng l c trng ca mt data provider no (ging nh cc lp Connection, DataReader, DataAdapter). Mt ng dng c th nh ngha v np d liu t ngun bt k (ch khng nht thit l t mt CSDL) vo DataSet. Bn cnh cc DataTable v cc DataRelation, mt DataSet cn c th cha cc thng tin ty bin khc c nh ngha bi ng dng. Hnh di y m t c lp chnh trong DataSet. Trong s cc thuc tnh ny, ch thuc tnh PropertyCollection; l cc thuc tnh c lu tr di dng mt hash table (bng bm), thng cha mt gi tr time stamp hay cc thng tin c t nh cc yu cu hp l ha (validation requirements) cho column trong cc DataTable trong DataSet.

Gio trnh Visual Studio .NET

109

4.4.1.1 DataTable Thuc tnh DataSet.Tables cha cc i tng DataTable. Mi i tng trong tp hp ny c th c truy xut bng ch s hoc bng tn. Cc DataTable trong tp hp DataSet.DataTables m phng cc Table trong CSDL quan h (cc row, column, ). Cc thuc tnh quan trng nht ca lp DataTable l Columns v Rows nh ngha cu trc v ni dung bng d liu. 4.4.1.2 DataColumn Thuc tnh DataTable.Columns cha mt tp cc i tng DataColumn biu din cc trng d liu trong DataTable. Bng di y tm tt cc thuc tnh quan trng ca lp DataColumn. Phng thc ColumnName DataType MaxLength ReadOnly M t Tn column Kiu ca d liu cha trong column ny V d: col1.DataType = System.Type.GetType("System.String") di ti a ca mt text column. -1 nu khng xc nh di ti a Cho bit gi tr ca column c c chnh sa hay khng 110

Gio trnh Visual Studio .NET

Phng thc AllowDBNull Unique Expression Caption DataTable

M t Gi tr Boolean cho bit column ny c c cha gi tr NULL hay khng Gi tr Boolean cho bit column ny c c cha cc gi tr trng nhau hay khng Biu thc nh ngha cch tnh gi tr ca mt column V d: colTax.Expression = "colSales * .085"; Tiu hin th trong thnh phn iu khin giao din ha Tn ca i tng DataTable cha column ny

Cc column ca DataTable c to ra mt cch t ng khi table c np d liu t kt qu ca mt database query hoc t kt qu c c mt file XML. Tuy nhin, chng ta cng c th vit code to ng cc column. on code di y s to ra mt i tng DataTable, sau to thm cc i tng DataColumn, gn gi tr cho cc thuc tnh ca column, v b sung cc DataColumn ny vo DataTable. DataTable tb = new DataTable("DonHang"); DataColumn dCol = new DataColumn("MaSo", Type.GetType("System.Int16")); dCol.Unique = true; // D liu ca cc dng column ny khng c trng nhau dCol.AllowDBNull = false; tb.Columns.Add(dCol); dCol = new DataColumn("DonGia", Type.GetType("System.Decimal")); tb.Columns.Add(dCol); dCol = new DataColumn("SoLuong",Type.GetType("System.Int16")); tb.Columns.Add(dCol); dCol= new DataColumn("ThanhTien",Type.GetType("System.Decimal")); dCol.Expression= "SoLuong*DonGia"; tb.Columns.Add(dCol); // Lit k danh sch cc Column trong DataTable foreach (DataColumn dc in tb.Columns) { Console.WriteLine(dc.ColumnName); Console.WriteLine(dc.DataType.ToString()); } rng column MaSo c nh ngha cha cc gi tr duy nht. Rng buc ny gip cho column ny c th c dng nh l trng kha thit lp relationship kiu parent-child vi mt bng khc trong DataSet. m t, kha phi l duy nht nh
Gio trnh Visual Studio .NET

111

trong trng hp ny hoc c nh ngha nh l mt primary key ca bng. V d di y m t cch xc nh primary key ca bng: DataColumn[] col = {tb.Columns["MaSo"]}; tb.PrimaryKey = col; Nu mt primary key cha nhiu hn 1 column chng hn nh HoDem v Ten bn c th to ra mt rng buc unique constraint trn cc nh v d di y: DataColumn[] cols = {tb.Columns["HoDem"], tb.Columns["Ten"]}; tb.Constraints.Add(new UniqueConstraint("keyHoVaTen", cols)); Chng ta s xem xt cch thc to relationship cho cc bng v trn d liu phn tip theo. 4.4.1.3 DataRows D liu c a vo table bng cch to mi mt i tng DataRow, gn gi tr cho cc column ca n, sau b sung i tng DataRow ny vo tp hp Rows gm cc DataRow ca table. DataRow row; row = tb.NewRow(); // To mi DataRow row["DonGia"] = 22.95; row["SoLuong"] = 2; row["MaSo"] = 12001; tb.Rows.Add(row); // B sung row vo tp Rows Console.WriteLine(tb.Rows[0]["ThanhTien"].ToString()); // 45.90 Mt DataTable c cc phng thc cho php n c th commit hay roll back cc thay i c to ra i vi table tng ng. thc hin c iu ny, n phi nm gi trng thi ca mi dng d liu bng thuc tnh DataRow.RowState. Thuc tnh ny c thit lp bng mt trong 5 gi tr kiu enumeration DataRowState sau: Added, Deleted, Detached, Modifed, hoc Unchanged. Xem xt v d sau: tb.Rows.Add(row); // Added tb.AcceptChanges(); // ...Commit changes Console.Write(row.RowState); // Unchanged tb.Rows[0].Delete(); // Deleted // Undo deletion tb.RejectChanges(); // ...Roll back
Gio trnh Visual Studio .NET

112

Console.Write(tb.Rows[0].RowState); // Unchanged DataRow myRow; MyRow = tb.NewRow(); // Detached Hai phng thc AcceptChanges v RejectChanges ca DataTable l tng ng vi cc thao tc commit v rollback trong mt CSDL. Cc phng thc ny s cp nht mi thay i xy ra k t khi table c np, hoc t khi phng thc AcceptChanges c triu gi trc . v d trn, chng ta c th khi phc li dng b xa do thao tc xa l cha c commit trc khi phng thc RejectChanges c gi. iu ng lu nht l, nhng thay i c thc hin l trn table ch khng phi l data source. ADO.NET qun l 2 gi tr - ng vi 2 phin bn hin ti v nguyn gc - cho mi column trong mt dng d liu. Khi phng thc RejectChanges c gi, cc gi tr hin ti s c t khi phc li t gi tr nguyn gc. iu ngc li c thc hin khi gi phng thc AcceptChanges. Hai tp gi tr ny c th c truy xut ng thi thng qua cc gi tr lit k DataRowVersion l: Current v Original: DataRow r = tb.Rows[0]; r["DonGia"]= 14.95; r.AcceptChanges(); r["DonGia"]= 16.95; Console.WriteLine("Current: {0} Original: {1} ", r["Price", DataRowVersion.Current], r["Price", DataRowVersion.Original]); Kt qu in ra: Current: 16.95 Original: 14.95 4.4.1.4 DataView. DataView ng vai tr nh tng hin th d liu lu tr trong DataTable. N cho php ngi s dng sp xp, lc v tm kim d liu. //Gi s c 1 dataset c tn l ds cha d liu ca bng DonHang DataView dv = new DataView(ds.Tables["DonHang]; // Lc ra tt c cc hng c gi t 10 n 100 dv.RowFilter = "soluong>=10 and soluong<=100"; //Sp xp tng dn theo s lng nu s lng bng nhau th sp xp gim dn thm n gi dv.Sort = "soluong, dongia DESC";

Gio trnh Visual Studio .NET

113

4.4.2 Np d liu vo DataSet Chng ta bit cch thnh lp mt DataTable v x l d liu theo kiu tng dng mt. Phn ny s trnh by phng php d liu v lc d liu c np t ng t CSDL quan h vo cc table trong DataSet. 4.4.2.1 Dng DataReader np d liu vo DataSet i tng DataReader c th c s dng lin hp i tng DataSet hay DataTable trong vic np cc dng d liu kt qu (ca query trong DataReader). cmd.CommandText = "SELECT * FROM nhanvien"; DBDataReader rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); DataTable dt = new DataTable("nhanvien"); dt.Load(rdr); // Np d liu v lc vo table Console.WriteLine(rdr.IsClosed); // True i tng DataReader c t ng ng sau khi tt c cc dng d liu c np vo table. Do s dng tham s CommandBehavior.CloseConnection trong phng thc ExecuteReader nn connection c ng sau khi DataReader c ng. Nu table c d liu, phng thc Load s trn d liu mi vi cc dng d liu ang c trong n. Vic trn ny xy ra ch khi cc dng d liu c chung primary key. Nu khng c primary key c nh ngha, cc dng d liu s c ni vo sau tp d liu hin ti. Chng ta c th s dng phng thc np chng khc ca phng thc Load quy nh cch thc lm vic. Phng thc Load vi tham s kiu enumeration LoadOption gm 1 trong 3 gi tr OverwriteRow, PreserveCurrentValues, hoc UpdateCurrentValues tng ng vi ty chn ghi nguyn dng, gi li cc gi tr hin ti, hoc cp nht cc gi tr hin ti. on code di y minh ha cch trn d liu vo cc dng hin ti theo kiu ghi cc gi tr hin ti: cmd.CommandText = "SELECT * FROM nhanvien WHERE diachi=a"; DBDataReader rdr = cmd.ExecuteReader(); DataTable dt = new DataTable("nhanvien"); dt.Load(rdr); Console.Write(dt.Rows[0]["HoTen"]); // gi s gi tr nhn c l tnv spider // Gn kha chnh DataColumn[] col = new DataColumn[1]; col[0] = dt.Columns["Manv"];
Gio trnh Visual Studio .NET

114

dt.PrimaryKey = col; DataRow r = dt.Rows[0]; // ly dng u tin r["HoTen"] = "ten moi"; // thay i gi tr ca ct HoTen // Do reader b ng sau khi np vo data table nn phi gi phi fill li rdr = cmd.ExecuteReader(CommandBehavior.CloseConnection); // Trn d liu vi cc dng hin ti. Ghi cc gi tr hin ti dt.Load(rdr, LoadOption.UpdateCurrentValues); // Gi tr cp nht b ghi !!! Console.Write(dt.Rows[0]["HoTen"]); // tnv spider 4.4.2.2 Np d liu vo DataSet bng DataAdapter i tng DataAdapter c th c dng np mt table hin c vo mt table khc, hoc to mi v np d liu cho table t kt qu ca mt query. Bc u tin l to ra mt i tng DataAdapter tng ng vi data provider c th. Di y l cc v d to ra i tng DataAdapter: (1) To t Connection string v cu truy vn SELECT: String sql = "SELECT * FROM nhanvien"; SqlDataAdapter da = new SqlDataAdapter(sql, connStr); (2) To t i tng Connection v cu truy vn SELECT: SqlConnection conn = new SqlConnection(connStr); SqlDataAdapter da = new SqlDataAdapter(sql, conn); (3) Gn i tng Command cho thuc tnh SelectCommand SqlDataAdapter da = new SqlDataAdapter(); SqlConnection conn = new SqlConnection(connStr); da.SelectCommand = new SqlCommand(sql, conn); Sau khi i tng DataAdapter c to ra, phng thc Fill ca n c thc thi np d liu vo table (ang tn ti hoc to mi). v d di y, mt table mi c to ra vi tn mc nh l Table: DataSet ds = new DataSet(); // To ra mt DataTable, np d liu vo DataTable, v a DataTable vo DataSet int nRecs = da.Fill(ds); // tr v s lng record c np vo DataTable // Nu mun t tn cho DataTable trong DataSet thay v ly tn mc nh // th s dng code nh th ny
Gio trnh Visual Studio .NET

115

int nRecs = da.Fill(ds, "nhanvien ") Vi mt table ang tn ti, tc dng ca lnh Fill ty thuc vo table c primary hay khng. Nu c, nhng dng d liu c kha trng vi dng d liu mi s c thay th. Cc dng d liu mi khng trng vi d liu hin c s c ni vo sau DataTable. 4.4.3 Bi thc hnh Bi thc hnh v DataAdapter v DataSet V d ny s dng c s d liu quanlythuvien nh trong bi thc hnh 4.3.4 Thit k form frmtimkiemsach tm theo tn sch hoc tn tc gi nh sau:

DataGridView1

frmtimkiemsach s dng cc trng, phng thc v s kin sau:

Gio trnh Visual Studio .NET

116

Cc iu khin Tn iu khin Thuc tnh Form Name: frmtimkiemsach Text:Tm kim theo nhan hoc tn tc gi Label Text: Nhp tn sch hoc tn tc gi cn tm TextBox Name: txttimkiem dataGridView Name: dataGridView1 statusStrip Name: thanhtrangthai Items: Add thm 2 statusLabel: vi tn ketquatim v tngoluong Cc trng: Tn trng Cn cmd da ds ngha Dng kt ni n c s d liu quanlythuvien sqlCommand s dng cu lnh select hin th v tm kim sch SqlDataAdapter cha cmd v cn DataSet cha d liu ca bng sch hoc cha kt qu tm kim

Cc phng thc + Hm dng frmtimkiemsach to giao din


Gio trnh Visual Studio .NET

117

public frmtimkiemsach() { InitializeComponent(); } + Phng thc Tongsoluong: c s dng tnh tng s lng sch ca cc sch lu trong Dataset ds. private int Tongsoluong() { int s=0; foreach (DataRow r in ds.Tables["sach"].Rows) { s += (int)r["soluong"]; } return s; } + Phng thc Tongsoluongtk tnh tng s lng sch trong DataView dv, dv cha thng tin cc sch tm kim c. private int Tongsoluongtk(DataView dv) { int s = 0; foreach (DataRow r in dv.ToTable("sach").Rows ) { s += (int)r["soluong"]; } return s; } + S kin frmtimkiemsach_Load:Np thng tin ca 4 quyn sch u tin theo th t gim dn ca ngaynhap vo DataSet ds vi tn bng trong DataSet l sach, sau hin th thng tin ca bng sach trong DataSet vo dataGridView1, a tng s sch v tng s lng sch trong DataSet vo thanh trng thi private void frmtimkiemsach_Load(object sender, EventArgs e) { cn.Open(); // M kt ni cmd.CommandText = "select top 4 * from sach order by ngaynhap desc" ; cmd.Connection = cn; da.SelectCommand = cmd; da.Fill(ds, "sach"); // Np d liu vo DataSet dataGridView1.DataSource = ds.Tables["sach"]; // Np d liu vo dataGridView1 // Np d liu vo thanh trng thi thanhtrangthai.Items[0].Text = "Tng s sch:" + ds.Tables["sach"].Rows.Count.ToString(); Gio trnh Visual Studio .NET 118

thanhtrangthai.Items[1].Text = "Tng s lng:" + Tongsoluong().ToString(); } + S kin txttimkiem_KeyPress: Khi ngi s dng nhn Enter trn txttimkiem th vic tm kim tng i bt u: To ra 1 DataView dv cha d liu ca bng sch trong DataSet ds, lc trong DataView dv ra thng tin ca cc quyn sch gn ging vi d liu nhp trn txttimkiem, sau a kt qu lc ra trn dataGridView1 v thanh trng thi. private void txttimkiem_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == 13) { DataView dv = new DataView(ds.Tables["sach"]); //Np d liu vo DataView //bt u lc d liu dv.RowFilter = "nhande like '%" + txttimkiem.Text + "%' or tacgia like '%" + txttimkiem.Text + "%'"; dataGridView1.DataSource = dv; //Np kt qu lc trong dv vo dataGridView1
// a s quyn sch v tng s lng sch lc c vo thanh trang thi

thanhtrangthai.Items[0].Text = "S kt qu tm thy c: " + dv.Count.ToString() + "/" + ds.Tables["sach"].Rows.Count.ToString(); thanhtrangthai.Items[1].Text = "Tng s lng tm thy c:" + Tongsoluongtk(dv).ToString() + "/" + Tongsoluong().ToString(); } } 4.4.4 Cp nht CSDL bng DataAdapter Sau khi DataAdapter np d liu vo table, connection s c ng, v cc thay i sau i sau to ra cho d liu s ch c nh hng trong DataSet ch khng phi l d liu ngun! thc s cp nht cc thay i ny ln ngun d liu, DataAdapter phi c s dng khi phc connection v gi cc dng d liu c thay i ln CSDL. Ngoi SelectCommand, DataAdapter c thm 3 thuc tnh Command na, gm InsertCommand, DeleteCommand v UpdateCommand, lm nhim v thc hin cc thao tc tng ng vi tn thuc tnh ca chng (chn, xa, cp nht). Cc Command ny c thc thi khi phng thc Update ca DataAdapter c triu gi. Kh khn nm ch to ra cc query command phc tp ny (c php ca cu lnh SQL tng ng cng di dng v phc tp khi s lng column nhiu ln). Rt may l cc data provider u c ci t mt lp gi l CommandBuilder dng qun l vic to cc Command ni trn
Gio trnh Visual Studio .NET

119

mt cch t ng. 4.4.4.1 CommandBuilder Mt i tng CommandBuilder s sinh ra cc Command cn thit thc hin vic cp nht ngun d liu to ra bi DataSet. Cch to i tng CommandBuilder l truyn i tng DataAdapter cho phng thc khi dng ca n; sau , khi phng thc DataAdapter.Update c gi, cc lnh SQL s c sinh ra v thc thi. on code di y minh ha cch thc thay i d liu mt DataTable v cp nht ln CSDL tng ng bng DataAdapter: //Gi s c 1 DataSet ds cha d liu ca bng khoa DataTable dt= ds.Tables["khoa"]; // (1) Dng commandBuilder sinh ra cc Command cn thit update SqlCommandBuilder sb = new SqlCommandBuilder(da); // (2) Thc hin thay i d liu: thm 1 khoa mi DataRow drow = dt.NewRow(); drow["Makhoa"] = 12; drow["tenkhoa"] = "abc"; dt.Rows.Add(drow); // (3) Thc hin thay i d liu: xa 1 khoa dt.Rows[4].Delete(); // (4) Thc hin thay i d liu: thay i gi tr 1 dng d liu dt.Rows[5]["tenkhoa"] = "this must be changed"; // (5) Tin hnh cp nht ln CSDL int nUpdate = da.Update(ds, "khoa"); MessageBox.Show("S dng c thay i: " + nUpdate.ToString()); // 3 C mt s hn ch khi s dng CommandBuilder: Command Select ng vi DataAdapter ch c tham chiu n 1 table, v table ngun trong CSDL phi bao gm mt primary key hoc mt column cha cc gi tr duy nht. Column ny (hay t hp cc columns) phi c bao gm trong command Select ban u. 4.4.4.2 ng b ha d liu gia DataSet v CSDL Nh minh ha trong v d ny, vic s dng DataAdapter lm n gin ha v t ng ha qu trnh cp nht CSDL hoc bt k data source no. Tuy nhin, c mt vn y: multi-user (nhiu ngi s dng). M hnh Ngt kt ni c da trn c ch Optimistic Concurrency, mt cch tip cn m trong cc dng d liu data source khng b kha (lock) gia thi gian m chng c c v thi gian m cc cp nht c p dng cho data source. Trong khong thi gian ny, user khc c th cng cp
Gio trnh Visual Studio .NET

120

nht data source. Nu c thay i xy ra k t ln c trc th phng thc Update s nhn bit c v khng cho p dng thay i i vi cc dng d liu . C hai phng n c bn gii quyt li concurrency (tng tranh) khi c nhiu cp nht c p dng: roll back tt c cc thay i nu nh xut hin xung t (violation), hoc p dng cc cp nht khng gy ra li v xc nh nhng cp nht c gy ra li c th x l li. 4.4.4.3 S dng Transactions Roll Back nhiu cp nht Khi thuc tnh DataAdapter.ContinueUpdateOnErrors c thit lp l false, mt ngoi l s c nm ra khi mt thay i dng d liu khng th thc hin c. iu ny s ngn cc cp nht tip theo c thc thi, nhng li khng nh hng n cc cp nht xut hin trc ngoi l . Do nhng cp nht c th c lin quan vi nhau, ng dng thng l cn chin lc hoc l tt c, hoc l khng (all-or-none). Cch d nht thc thi chin lc ny l to ra mt transaction trong tt c cc command update s c thc thi. thc hin iu ny, to ra mt i tng SqlTransaction v gn n vi SqlDataAdapter.SelectCommand bng cch truyn n cho hm khi dng ca n. Nu c ngoi l xy ra, phng thc Rollback s c thc thi undo mi thay i trc ; nu khng c ngoi l no xut hin, phng thc Commit c thc thi p dng tt c cc command update. Di y l mt v d: SqlDataAdapter da = new SqlDataAdapter(); SqlCommandBuilder sb = new SqlCommandBuilder(da); SqlTransaction tran; SqlConnection conn = new SqlConnection(connStr); conn.Open(); // Connection phi c dng vi Transaction // (1) To ra mt transaction SqlTransaction tran = conn.BeginTransaction(); // (2) Gn SelectCommand vi transaction da.SelectCommand = new SqlCommand(sql, conn, tran); DataSet ds = new DataSet(); da.Fill(ds, "docgia"); // // Code phn ny thc hin cc cp nht ln cc dng d liu DataSet try { int updates = da.Update(ds, "docgia"); MessageBox.Show("Cp nht: " + updates.ToString()); }
Gio trnh Visual Studio .NET

121

// (3) Nu c ngoi l xut hin, roll back mi cp nht trong transaction catch (Exception ex) { MessageBox.Show(ex.Message); // Li khi cp nht if (tran != null) { tran.Rollback(); // Roll back mi cp nht tran = null; MessageBox.Show("Tt c cc cp nht b roll back."); } } finally { // (4) Nu khng c li, commit tt c cc cp nht if (tran != null) { tran.Commit(); MessageBox.Show("Tt c c cp nht thnh cng. "); tran = null; } } conn.Close(); 4.4.4.4 Xc nh cc dng gy ra li cp nht Khi thuc tnh DataAdapter.ContinueUpdateOnErrors c thit lp l True, cc x l s khng ngng nu c mt dng d liu khng th cp nht c. Thay vo , DataAdapter s cp nht tt c cc dng d liu khng gy ra li. Sau , lp trnh vin c th xc nh cc dng d liu khng cp nht c v quyt nh cch x l chng. Cc dng d liu khng cp nht c c th d dng c xc nh qua thuc tnh DataRowState ca chng ( c trnh by trong phn m t DataRow). Cc dng d liu c cp nht thnh cng s c trng thi Unchanged; trong khi cc dng d liu khng cp nht thnh cng s mang trng thi Added, Deleted hoc Modified. on code di y minh ha cch lp qua cc dng d liu v xc nh cc dng cha c cp nht. // SqlDataAdapter da np d liu ca bng docgia da.ContinueUpdateOnError = true; DataSet ds = new DataSet(); try
Gio trnh Visual Studio .NET

122

{ da.Fill(ds, "docgia"); DataTable dt = ds.Tables["docgia"]; SqlCommandBuilder sb = new SqlCommandBuilder(da); // ... Cc thao tc cp nht dt.Rows[29].Delete(); // Delete dt.Rows[30]["HoTen"] = "try to change"; // Update dt.Rows[30][Madocgia] = 1234; // Update dt.Rows[31]["HoTen"] = "XYZ"; // Update DataRow drow = dt.NewRow(); drow["HoTen"] = "tnv spider"; drow["Madocgia"] = 25; dt.Rows.Add(drow); // insert // Submit updates int updates = da.Update(ds, "docgia"); if (ds.HasChanges()) { // Load rows that failed into a DataSet DataSet failures = ds.GetChanges(); int rowsFailed = failures.Rows.Count; Console.WriteLine("S dng khng th cp nht: " + rowsFailed); foreach (DataRow r in failures.Tables[0].Rows ) { string state = r.RowState.ToString()); // Phi hy b thay i hin th dng b xa if (r.RowState == DataRowState.Deleted) r.RejectChanges(); string iMadocgia= ((int)r["Madocgia"]).ToString(); string msg = state + " Madocgia: " + iMadocgia; Console.WriteLine(msg); } } Lu rng ngay c khi thao tc xa xut hin trc, n cng khng c tc dng i vi cc thao tc khc. Cu lnh SQL xa hay cp nht mt dng d liu c da theo gi tr ca primary key ch khng lin quan n v tr ca n. Ngoi ra cc cp nht trn cng mt dng c kt hp v m nh l 1 cp nht cho dng bi phng thc Update. v d trn, cc cp nht cho dng 30 c tnh nh l 1 cp nht. 4.4.5 nh ngha Relationships gia cc Table trong DataSet
Gio trnh Visual Studio .NET

123

Mt DataRelation l mt mi quan h parent-child gia hai i tng DataTables. N c nh ngha da trn vic so khp cc columns trong 2 DataTable. C php hm khi dng l nh sau: public DataRelation( string relationName, DataColumn parentColumn, DataColumn childColumn) Mt DataSet c mt thuc tnh Relations gip qun l tp hp cc DataRelation c nh ngha trong DataSet. S dng phng thc Relations.Add thm cc DataRelation vo tp hp Relations. V d di y thit lp mi quan h gia hai bng khoa v docgia c th lit k danh sch cc docgia ca mi khoa.
string connStr="Data Source=tn my ch;Initial Catalog=quanlythuvien; Trusted_Connection=yes";

DataSet ds = new DataSet(); // (1) Fill bng docgia string sql = "SELECT * FROM docgia; SqlConnection conn = new SqlConnection(connStr); SqlCommand cmd = new SqlCommand(); SqlDataAdapter da = new SqlDataAdapter(sql, conn); da.Fill(ds, "docgia"); // (2) Fill bng khoa sql = "SELECT * FROM khoa; da.SelectCommand.CommandText = sql; da.Fill(ds, "khoa"); // (3) nh ngha relationship gia 2 bng khoa v docgia DataTable parent = ds.Tables["khoa"]; DataTable child = ds.Tables["docgia"]; DataRelation relation = new DataRelation("khoa_docgia", parent.Columns["makhoa"], child.Columns["makhoa"]); // (4) a relationship vo DataSet ds.Relations.Add(relation); // (5) Lit k danh sch cc c gi ca tng khoa foreach (DataRow r in parent.Rows) { Console.WriteLine(r["tenkhoa"]); // Tn khoa foreach (DataRow rc in r.GetChildRows("khoa_docgia")) { Console.WriteLine(" " + rc["HoTen"]); Gio trnh Visual Studio .NET 124

} } /* V d kt qu: Khoa Tin Nguyn Vn Trung Ng Anh Tun L Thanh Hoa Khoa Ton Nguyn Th Hoa Trn Vn Phc */ Khi mt relationship c nh ngha gia 2 tables, n cng s thm mt ForeignKeyConstraint vo tp hp Constraints ca DataTable con. Constraint ny quyt nh cch m DataTable con b nh hng khi cc dng d liu pha DataTable cha b thay i hay b xa. Trong thc t, iu ny c ngha l khi bn xa 1 dng trong DataTable cha, cc dng con c lin quan cng b xa hoc cng c th l cc key b t li gi tr thnh NULL. Tng t nh th, nu mt gi tr key b thay i trong DataTable cha, cc dng d liu c lin quan trong DataTable con cng c th b thay i theo hoc b i gi tr thnh NULL. Cc lut nh trn c xc nh bi cc thuc tnh DeleteRule v UpdateRule ca constraint. Cc lut ny c nhn cc gi tr lit k sau y: - Cascade. Xa/Cp nht cc dng d liu c lin quan trong DataTable con. y l gi tr mc nh. - None. Khng lm g. - SetDefault. Thit lp cc gi tr kha trong cc dng d liu c lin quan ca DataTable con thnh gi tr mc nh ca column tng ng. - SetNull. Thit lp cc gi tr kha trong cc dng d liu c lin quan ca DataTable con thnh null.

Xem xt v d di y: // (1) Thm mt dng vi kha mi vo DataTable con DataRow row = child.NewRow(); row["Makhoa"] = 999; // gi s trong bng khoa khng c record no c Makhoa = 999 child.Rows.Add(row); // Khng c do 999 khng tn ti trong DataTable cha
Gio trnh Visual Studio .NET

125

// (2) Xa mt dng trong DataTable cha row = parent.Rows[0]; row.Delete(); // Xa cc dng trong DataTable con c kha ny // (3) Tm thi v hiu ha constraints v th thm dng mi ds.EnforceConstraints = false; row["Makhoa"] = 999; child.Rows.Add(row); // c chp nhn!!! ds.EnforceConstraints = true; // Kch hot constraint tr li
// (4) Thay i constraint t cc dng d liu thnh null nu DataTable thay i

((ForeignKeyConstraint)child.Constraints[0]).DeleteRule = Rule.SetNull; Lu rng thuc tnh EnforeceConstraint c t thnh false s lm v hiu ha tt c cc constraint iu ny trong thut ng CSDL gi l b qua tnh ton vn tham chiu. iu ny cho php mt khoa c b sung vo thm ch khi c column Makhoa khng tng ng vi dng no trong bng khoa. N cng cho php mt dng khoa c xa ngay c khi c nhiu dng tng ng vi n trong bng docgia. 4.5 S dng Data Binding Chng ta cp n cc iu khin thit k giao din nh TextBox, ListBox, RadioButton, ComBoBox v cc cc iu khin ca ADO.NET nh DataSet, DataTable v DataView. Cc iu khin ny lm vic mt cch c lp vi nhau, tuy nhin trong mt s tnh hung chng cn kt hp li vi nhau. V d ta cn hin th tn khoa t c s d liu ra 1 TextBox, khi ta cn to ra 1 DataSet cha d liu ca bng khoa v 1 TextBox, sau lin kt d liu trong DataSet vo TextBox. S kt hp gia hai iu khin ny c th s dng DataBinding. 4.5.1 Cc loi ca Binding ADO.NET cung cp 2 loi Binding: - DataBinding n gin (Simple DataBinding): Ti mt thi im, mt gi tr n trong DataSet c th b buc vo bt k mt iu khin. V d: gi s c 1 DataSet ds cha d liu ca bng Khoa, cn buc tn khoa vo TextBox txttenkhoa: txttenkhoa.DataBindings.Add("Text", ds, "khoa.tenkhoa"); Khi mi thay i trn DataSet ds s nh hng n TextBox txtdocgia v ngc li. - DataBinding phc tp (Complex DataBinding): Cc d liu trong DataSet b buc vo mt iu khin thay v ch mt gi tr n. Ch c DataGidView v ComboBox h tr chc nng DataBinding phc tp.
Gio trnh Visual Studio .NET

126

V d: gi s c 1 DataSet ds cha d liu ca bng Khoa, cn buc tn khoa vo ComboBox cmbkhoa v buc ton b d liu ca bng khoa vo DataSet ds:
//Buc tenkhoa ca bng khoa trong DataSet ds vo cmbkhoa

cmbkhoa.DataSource = ds; cmbkhoa.DisplayMember = "khoa.tenkhoa";


//Buc ton b d liu ca bng khoa trong DataSet ds vo DataGridView dgvkhoa

dgvKhoa.DataSource = ds; dgvKhoa.DataMember = "khoa"; 4.5.2 Cc ngun d liu ca DataBinding Nhiu thnh phn c th hot ng nh ngun d liu ca DataBinding. Bt k cc thnh phn c ci t t giao din Ilist c th xem l nh ngun d liu ca DataBinding. Cc v d sau minh ha bng cch no s dng DataTable, DataView, DataSet v Mng nh l ngun d liu ci t DataBinding n gin v phc tp. - DataTable: Loi d liu ny lu tr d liu ca mt bng trong c s d liu. DataTable t = ds.Tables["khoa"]; //DataBinding n gin txttenkhoa.DataBindings.Add("Text", t, "tenkhoa"); //DataBinding phc tp cmbkhoa.DataSource = t; cmbkhoa.DisplayMember = "tenkhoa"; dgvKhoa.DataSource = t; - DataView: DataView dv =new DataView (ds.Tables["khoa"]); //DataBinding n gin txttenkhoa.DataBindings.Add("Text", dv, "tenkhoa"); //DataBinding phc tp cmbkhoa.DataSource = dv; cmbkhoa.DisplayMember = "tenkhoa"; dgvKhoa.DataSource = dv; - DataSet: nh v d phn 3.5.1 - Mng: int[] t = new int[4] { 12, 2, 3, 4 }; //DataBinding n gin txttenkhoa.DataBindings.Add("Text", t, "");
Gio trnh Visual Studio .NET

127

//DataBinding phc tp cmbkhoa.DataSource = t; 4.5.3 BindingContext S bn di ch ra cch buc d liu t ngun d liu vo cc iu khin trn Form. Phn ny ch yu tho lun v cc lp BindingContext, CurrencyManager v ch ra bng cch no chng tng tc khi d liu b buc vo mt hoc nhiu iu khin trn Form:

BindingContext Mi Windows Form u c mt thuc tnh BindingContext. Mt BindingContext c mt tp hp cc BindingManagerBase, cc i tng ny c to ra khi d liu buc vo mt iu khin. Nu ngun d liu bao gm mt danh sch cc i tng nh a DataTable, DataView hoc bt k i tng no ci t trn giao din Ilist khi CurrencyManager s c s dng. Mt CurrencyManager c th duy tr mt v tr hin thi (current position ) bn trong ngun d liu. Nu ngun d liu ch tr v mt gi tr n khi PropertyManager s c lu tr bn trong BindingContext . Mt CurrencyManager hoc PropertyManager ch c to ra mt ln cho mt ngun d liu. Nu hai TextBox b buc vo 1 dng ca DataTable khi ch c m
Gio trnh Visual Studio .NET

128

CurrencyManager c to ra trong BindingContext Khi to ra mt iu khin trn form, iu khin ny s c lin kt vi b qun l buc d liu trn form ( form's binding manager). Khi to ra mt iu khin th thuc tnh BindingContext ca n bng null. buc d liu vo mt iu khin ta dng thuc tnh DataBindings nh v d bn di buc m khoa v tn khoa trong DataSet ds vo TextBox1 v textBox2 . textBox1.DataBindings.Add("Text", ds, "khoa.makhoa"); textBox2.DataBindings.Add("Text", ds, "khoa.tenkhoa"); CurrencyManager and PropertyManager Khi buc d liu vo 1 iu khin trn form khi mt CurrencyManager hoc mt PropertyManager tng ng s c to ra. Mc ch ca lp ny l xc nh v tr ca mu tin hin thi bn trong ngun d liu v khi v tr ny thay i th d liu trn cc iu khin b buc trn form s t ng thay i theo. Cc thuc tnh ca BindingContext: Thuc tnh Bindings Count Current Position M t Tp hp cc i tng Binding c qun l bi CurrencyManager S dng c qu l trong CurrencyManager Gi tr ca cc i tng hin thi trong ngun d liu Gets hoc sets i tng hin thi trong danh sch cc i tng c qun l trong CurrencyManager

4.5.4 Bi thc hnh Bi thc hnh v DataSet v DataBinding V d ny s dng c s d liu quanlythuvien nh trong bi thc hnh 4.3.4 Thit k form frmkhoa nhp, xa, lu v duyt qua cc mu tin trong bng khoa nh sau:

Gio trnh Visual Studio .NET

129

dataGridView1

frmkhoa s dng cc trng, phng thc v s kin sau:

Cc iu khin
Gio trnh Visual Studio .NET

130

Tn iu khin Thuc tnh Form Name: frmKhoa Text: Thng tin v bng Khoa Label To ra 4 lable vi cc Text: M Khoa, Tn Khoa, a ch, S in thoi TextBox To ra 4 TextBox vi cc Name: txtMakhoa, txtTenKhoa, txtDiachi, txtSodienthoai Button To ra 7 Button vi cc Name: butBosung, butLuu, butXoa, butFirst, butPre, butNext, butLast dataGridView Name: dataGridView1 Cc phng thc + Hm dng frmKhoa to giao din: public frmKhoa() { InitializeComponent(); } + Phng thc BuocCacDieuKhien(): Buc d liu vo dataGridView1 v cc textBox private void BuocCacDieuKhien() { //Buc d liu vo dataGridView1 dataGridView1.DataSource = ds;dataGridView1.DataMember = "khoa"; // Buc d liu vo cc textBox txtMaKhoa.DataBindings.Add("Text", ds, "khoa.makhoa"); txtTenKhoa.DataBindings.Add("Text", ds, "khoa.tenkhoa"); txtdiachi.DataBindings.Add("Text", ds, "khoa.diachi"); txtSodienthoai.DataBindings.Add("Text", ds, "khoa.sdt"); } + S kin: frmKhoa_Load() c s dng kt ni d liu, to ra DataSet ds cha ton b d liu ca bng khoa, buc d liu vo cho cc iu khin v to ra 1SqlCommandBuilder cb qun l vic nhp thm, xa v lu d liu ca SqlDataAdapter dakhoa . private void frmKhoa_Load(object sender, EventArgs e) { cn.Open(); // Kt ni d liu cmdkhoa = new SqlCommand("select * from khoa", cn); dakhoa = new SqlDataAdapter(cmdkhoa); dakhoa.Fill(ds, "khoa"); BuocCacDieuKhien(); cb = new SqlCommandBuilder(dakhoa); } + S kin: butFirst_Click: Di chuyn con tr v mu tin u tin private void butFirst_Click(object sender, EventArgs e) { this.BindingContext[ds, "khoa"].Position = 0; Gio trnh Visual Studio .NET 131

} + S kin: butPre_Click: Di chuyn con tr v mu tin trc mu tin hin thi private void butPre_Click(object sender, EventArgs e) { this.BindingContext[ds, "khoa"].Position--; } + S kin: butNext_Click: Di chuyn con tr n mu tin k tip private void butNext_Click(object sender, EventArgs e) { this.BindingContext[ds, "khoa"].Position++; } + S kin: butLast_Click: Di chuyn con tr v mu tin cui cng private void butLast_Click(object sender, EventArgs e) { int ViTriMauTinCuoiCung = this.BindingContext[ds, "khoa"].Count - 1; this.BindingContext[ds, "khoa"].Position = ViTriMauTinCuoiCung; } + S kin: butBosung_Click: To mi mt dng private void butBosung_Click(object sender, EventArgs e) { this.BindingContext[ds, "khoa"].AddNew(); } + S kin: butLuu_Click: Di chuyn con tr v mu tin cui cng, nu c thay i trong DataSet ds th cp nht li d liu, vic cp nht nh vo SqlCommandBuilder cb. Cc thao tc b sung v xa ch c cp nht vo c s d liu khi ngi s dng kch chut vo nt Lu private void butLuu_Click(object sender, EventArgs e) { this.BindingContext[ds, "khoa"].EndCurrentEdit(); if (ds.HasChanges() == true) { try { dakhoa.Update(ds, "khoa"); MessageBox.Show("Da cap nhat"); } catch (Exception ll) { MessageBox.Show(ll.Message); } } } + S kin: butXoa_Click: Ly v tr ca con tr hin thi, sau xa i mu tin ny.
Gio trnh Visual Studio .NET

132

private void butXoa_Click(object sender, EventArgs e) { int donghientai; donghientai = this.BindingContext[ds, "khoa"].Position; this.BindingContext[ds, "khoa"].RemoveAt(donghientai); } Bi thc hnh v t quan h gia cc bng, DataSet v DataBinding V d ny s dng c s d liu quanlythuvien nh trong bi thc hnh 4.3.4. V d ny lin quan n hai bng d liu: Khoa v docgia Thit k form frmKhoa_Docgia nhp, xa, lu, phc hi v duyt qua cc mu tin trong bng docgia cho tng khoa nh sau:

dataGridView1

frmkhoa s dng cc trng, phng thc v s kin sau:

Gio trnh Visual Studio .NET

133

Cc iu khin Tn iu khin Thuc tnh ListBox Name: lstKhoa Form Name: frmKhoa_Docgia Text: Khoa v c gi Label To ra 6 lable vi cc Text: M c gi, H v tn, Ngy sinh, a ch, Ngy lp th v M khoa TextBox To ra 6 TextBox vi cc Name: txtMadocgia, txtHoten, txtNgaysinh, txtDiachi, txtNgaylapthe, txtMakhoa Button To ra 8 Button vi cc Name: butBosung, butLuu, butXoa, butPhuchoi, butFirst (|<), butPre (<<), butNext (>>), butLast (>|) dataGridView Name: Cc phng thc + Hm dng frmKhoa_Docgia() to giao din: public frmKhoa_Docgia() { InitializeComponent(); } + Phng thc Datquanhe bao gm cc tham s: bng chnh, bng ph, kha chnh, kha
Gio trnh Visual Studio .NET

134

ph v tn quan h. Phng thc ny np d liu ca 2 bng: bng chnh v bng ph vo DataSet DataSet ds, sau t quan h gia 2 bng trong DataSet DataSet ds. private void Datquanhe(string bangchinh, string bangphu, string khoachinh, string khoaphu,string tenquanhe) { cn.Open(); cmdkhoa = new SqlCommand ("select * from "+ bangchinh, cn); dakhoa = new SqlDataAdapter(cmdkhoa); cmddocgia = new SqlCommand("select * from " + bangphu, cn); dadocgia = new SqlDataAdapter(cmddocgia); ds = new DataSet(); dakhoa.Fill(ds, bangchinh); dadocgia.Fill(ds, bangphu); DataColumn chinh=ds.Tables[bangchinh].Columns[khoachinh]; DataColumn phu=ds.Tables[bangphu].Columns[khoaphu]; DataRelation r = new DataRelation(tenquanhe,chinh ,phu ); ds.Relations.Add(r); } + Phng thc BuocCacDieuKhien(): Buc d liu vo lstKhoa, dataGridView1 v cc textBox private void BuocCacDieuKhien() { lstKhoa.DataSource = ds; lstKhoa.DisplayMember = "khoa.tenkhoa"; dataGridView1.DataSource = ds; dataGridView1.DataMember = "khoa.khoa_docgia"; //khoa_docgia l tn quan h ca 2 bng khoa v docgia trong DataSet ds txtMadocgia.DataBindings.Add("Text", ds, "khoa.khoa_docgia.madocgia"); txtHoten.DataBindings.Add("Text", ds, "khoa.khoa_docgia.hoten"); txtNgaysinh.DataBindings.Add("Text", ds, "khoa.khoa_docgia.ngaysinh"); txtdiachi.DataBindings.Add("Text", ds, "khoa.khoa_docgia.diachi"); txtNgaylapthe.DataBindings.Add("Text", ds, "khoa.khoa_docgia.ngaylapthe"); txtMakhoa.DataBindings.Add("Text", ds, "khoa.khoa_docgia.makhoa"); } + S kin frmKhoa_Docgia_Load: t quan h gia 2 bng khoa v docgia trong DataSet DataSet ds, to ra 1 SqlCommandBuilder qun l vic lu d liu vo c s d liu ,buc d liu vo cc iu khin trn form: private void frmKhoa_Docgia_Load(object sender, EventArgs e) { Datquanhe("khoa", "docgia", "makhoa", "makhoa", "khoa_docgia"); cb = new SqlCommandBuilder(dadocgia); Gio trnh Visual Studio .NET 135

BuocCacDieuKhien(); } + S kin: butFirst_Click: Di chuyn con tr v mu tin u tin private void butFirst_Click(object sender, EventArgs e) { this.BindingContext[ds, "khoa.khoa_docgia"].Position = 0;; } + S kin: butPre_Click: Di chuyn con tr v mu tin trc mu tin hin thi private void butPre_Click(object sender, EventArgs e) { this.BindingContext[ds, "khoa.khoa_docgia"].Position--; } + S kin: butNext_Click: Di chuyn con tr n mu tin k tip private void butNext_Click(object sender, EventArgs e) { this.BindingContext[ds, "khoa.khoa_docgia"].Position++; } + S kin: butLast_Click: Di chuyn con tr v mu tin cui cng private void butLast_Click(object sender, EventArgs e) { int ViTri = this.BindingContext[ds"khoa.khoa_docgia"].Count - 1; this.BindingContext[ds, "khoa"].Position = ViTri; } + S kin: butBosung_Click: To mi mt dng private void butBosung_Click(object sender, EventArgs e) { this.BindingContext[ds, "khoa.khoa_docgia"].].AddNew(); } + S kin: butLuu_Click: Di chuyn con tr v mu tin cui cng, nu c thay i trong DataSet ds th cp nht li d liu, vic cp nht nh vo SqlCommandBuilder cb. Cc thao tc b sung v xa ch c cp nht vo c s d liu khi ngi s dng kch chut vo nt Lu private void butLuu_Click(object sender, EventArgs e) { this.BindingContext[ds, "khoa.khoa_docgia"].EndCurrentEdit(); if (ds.HasChanges() == true) { try { dakhoa.Update(ds, "docgia"); Gio trnh Visual Studio .NET 136

MessageBox.Show("Da cap nhat"); } catch (Exception ll) { MessageBox.Show(ll.Message); } } } + S kin: butXoa_Click: Ly v tr ca con tr hin thi, sau xa i mu tin ny. private void butXoa_Click(object sender, EventArgs e) { int donghientai; donghientai = this.BindingContext[ds, "khoa.khoa_docgia"].Position; this.BindingContext[ds, "khoa.khoa_docgia"].RemoveAt(donghientai); } + S kin: buttPhuchoi_Click: Phc hi li cc thao tc B sung v xa, d liu ch c phc hi khi cha lu vo c s d liu private void buttPhuchoi_Click(object sender, EventArgs e) { this.BindingContext[ds, "khoa.khoa_docgia"].CancelCurrentEdit(); ds.RejectChanges(); } 4.6 La chn gia m hnh Kt ni v m hnh Ngt kt ni DataReader v DataSet a ra hai cch tip cn khc nhau x l d liu. DataReader cho php truy xut kiu forward-only, read-only. Bng cch x l tng dng mt, cch tip cn ny gip tit kim b nh. DataSet, ngc li, cho php truy xut theo kiu read/write, nhng li yu cu phi c b nh qun l bn sao d liu np v t data source. Nh vy, bn c th suy ra mt s quy tc chung: Nu ng dng khng cn tnh nng cp nht d liu v hu nh ch hin th v chn lc d liu, DataReader l la chn thch hp; nu ng dng cn cp nht d liu, gii php s dng DataSet nn c xem xt. Tt nhin, cng c mt s tnh hung i ngc li vi cc quy tc chung ni trn. Chng hn, nu data source cha mt s lng ln cc record, khi DataSet phi yu cu qu nhiu ti nguyn b nh; hoc nu d liu ch yu cu mt vi thao tc cp nht, th s kt hp gia DataReader v Command thc thi cp nht s c th c ngha hn.

Gio trnh Visual Studio .NET

137

Tm li, mt DataSet l mt la chn tt khi: - D liu cn c serialize (tun t ha) v/hoc gi i bng HTTP. - Cc iu khin read-only trn Form Win Form c kt buc (bind) vi data source. - Mt iu khin Win Form nh GridView hay DataView c kt buc vi mt data source c kh nng cp nht c. - Mt ng dng desktop cn thm, xa, sa cc dng d liu. Trong khi , DataReader l la chn cho nhng trng hp: - Cn qun l mt s lng ln cc record, ln n mc m b nh v thi gian np d liu cho DataSet l phi thc t. - D liu l read-only v c kt buc vi mt iu khin loi danh sch (list control) ca Win Form hoc Web Form. - CSDL l khng n nh v thay i thng xuyn.

Gio trnh Visual Studio .NET

138

CHNG 5. XY DNG NG DNG VI WEB VI WEBFORM


Cng ngh .NET c dng xy dng cc ng dng Web l ASP.NET, n cung cp hai vng tn kh mnh v y phc v cho vic to cc ng dng Web l System.Web v System.Web.UI. Trong chng ny chng ta s tp trung ch yu vo vic dng ngn ng C# lp trnh vi ASP.NET. B cng c Web Form cng c thit k h tr m hnh pht trin nhanh (RAD). Vi Web Form, ta c th ko th cc iu khin trn Form thit k cng nh c th vit m trc tip trong tp tin .aspx hay .aspx.cs. ng dng Web s c trin khai trn my ch, cn ngi dng s tng tc vi ng dng thng qua trnh duyt. .NET cn h tr ta b cung c to ra cc ng dng tun theo m hnh n - lp (tng - n tier), gip ta c th qun l c ng dng c d dng hn v nh th nng cao hiu sut pht trin phn mm. 5.1 Tm hiu v Web Forms Web Form l b cng c cho php thc thi cc ng dng m cc trang Web do n to ng ra c phn phi n trnh duyt thng qua mng Internet. Vi Web Forms, ta to ra cc trang HTML vi ni dung tnh v dng m C# chy trn Server x l d liu tnh ny ri to ra trang Web ng, gi trang ny v trnh duyt di m HTML chun. Web Forms c thit chy trn bt k trnh duyt no, trang HTML gi v s c nh dng sao cho thch hp vi phin bn ca trnh duyt. Ngoi ngn ng C#, ta cng c th dng ngn ng VB.NET to ra cc ng dng Web tng t. Web Forms chia giao din ngi dng thnh hai phn: phn thy trc quan ( hay UI ) v phn trang m pha sau ca UI. Quan im ny th tng t vi Windows Form, nhng vi Web Forms, hai phn ny nm trn hai tp tin ring bit. Phn giao din UI c lu tr trong tp tin c phn m rng l .aspx, cn m c lu tr trong tp tin c phn m rng l .aspx.cs. Vi mi trng lm vic c cung cp bi b Visual Studio .NET, to cc ng dng Web n gin ch l m Form mi, ko th v vit m qun l s kin thch hp. Web Forms c tch hp thm mt lot cc iu khin thc thi trn Server, c th t kim tra s hp l ca d liu ngay trn my khch m ta khng phi vit m m t g c. 5.2 Cc s kin ca Web Forms Mt s kin (Events) c to ra khi ngi dng nhn chn mt Button, chn mt mc trong ListBox hay thc hin mt thao tc no trn UI. Cc s kin cng c th c
Gio trnh Visual Studio .NET

139

pht sinh h thng bt u hay kt thc. Phng thc p ng s kin gi l trnh qun l s kin, cc trnh qun l s kin ny c vit bng m C# trong trang m (code-behind) v kt hp vi cc thuc tnh ca cc iu khin thuc trang. Trnh qun l s kin l mt Delegate, phng thc ny s tr v kiu void, v c hai i s. i s u tin l th hin ca i tng pht sinh ra s kin, i s th hai l i tng EventArg hay mt i tng khc c dn xut t i tng EventArgs. Cc s kin ny c qun l trn Server. 5.2.1 S kin PostBack v Non-PostBack PostBack l s kin s khin Form c gi v Server ngay lp tc, chng hn s kin trnh mt Form vi phng thc Post. i lp vi PostBack l Non- PostBack, s kin ny khng gi Form nn Server m n lu s kin trn vng nh Cache cho ti khi c mt s kin PostBack na xy ra. Khi mt iu khin c thuc tnh AutoPostBack l true th s kin PostBack s c tc dng trn iu khin :mc nhin thuc tnh AutoPostBach ca iu khin DropDownList l false, ta phi t li l true th s kin chn mt mc khc trong DropDownList ny mi c tc dng. 5.2.2 Trng thi ca ng dng Web (State) Trng thi ca ng dng Web l gi tr hin hnh ca cc iu khin v mi bin trong phin lm vic hin hnh ca ngi dng. Web l mi trng khng trng thi, ngha l mi s kin Post ln Server u lm mt i mi thng tin v phin lm vic trc . Tuy nhin ASP.NET cung cp c ch h tr vic duy tr trng thi v phin ca ngi dng. Bt k trang no khi c gi ln my ch Server u c my ch tng hp thng tin v ti to li sau mi gi xung trnh duyt cho my khch. ASP.NET cung cp mt c ch gip duy tr trng thi ca cc iu khin pha my ch (Server Control ) mt cch t ng. V th nu ta cung cp cho ngi dng mt danh sch d liu ListBox, v ngi dng thc hin vic chn la trn ListBox ny, s kin chn la ny s vn c duy tr sau khi trang c gi ln my ch v gi v cho trnh duyt cho my khch. 5.2.3 Chu trnh sng ca mt Web-Form Khi c yu cu mt trang Web trn my ch Web s to ra mt chui cc s kin my ch , t lc bt u cho n lc kt thc mt yu cu s hnh thnh mt chu trnh sng ( Life-Cycle ) cho trang Web v cc thnh phn thuc n. Khi mt trang Web c yu cu, my ch s tin hnh m ( Load ) n v khi hon tt yu cu my ch s ng trang ny li, kt xut ca yu cu ny l mt trang HTML tng ng s c gi v cho trnh duyt. Di y s lit k mt s s kin, ta c th bt cc s kin x l thch hp hay Gio trnh Visual Studio .NET 140

b qua ASP.NET x l mc nh. Khi to (Initialize) L s kin u tin trong chu trnh sng ca trang, ta c th khi to bt k cc thng s cho trang hay cc iu khin thuc trang. M trng thi vng quan st (Load View State) c gi khi thuc tnh ViewState ca iu khin c cng b hay gi. Cc gi tr trong ViewState s c lu tr trong mt bin n ( Hidden Field ), ta c th ly gi tr ny thng qua hm LoadViewState() hay ly trc tip. Kt thc (Dispose) Ta c th dng s kin ny gii phng bt k ti nguyn nguyn no: b nh hay hy b cc kt ni n c s d liu. V d: Hin th chui ln trang u tin ta cn chy Visual Studio .NET, sau to mt d n mi kiu WebApplication, ngn ng chn l C# v ng dng s c tn l ProgrammingCSharpWeb.Url mc nhin ca ng dng s c tn l http://localhost/ ProgrammingCSharpWeb. Visual Studio .NET s t hu ht cc tp tin n to ra cho ng dng trong th mcWeb mc nh trn my ngi dng, v d: D:\Inetpub\wwwroot\ProgrammingCSharpWeb. Trong .NET, mt gii php (Solution) c mt hay hiu d n (Project), mi d n s to ra mt th vin lin kt ng (DLL) hay tp tin thc thi (EXE). c th chy c ng dng Web Form, ta cn phi ci t IIS v FrontPage Server Extension trn my tnh. Khi ng dng Web Form c to, .NET to sn mt s tp tin v mt trang Web c tn mc nh l WebForm1.aspx ch cha m HTML v WebForm1.cs cha m qun l trang. Trang m .cs khng nm trong ca s Solution Explorer, hin th n ta chn Project\Show All Files, ta ch cn nhn p chut tri trn trang Web l ca s son tho m (Editor) s hin nn, cho php ta vit m qun l trang. chuyn t ca s thit k ko th sang ca s m HTML ca trang, ta chn hai Tab gc bn tri pha di mn hnh. t tn li cho trang Web bng cch nhn chut phi ln trang v chn mc Rename i tn trang thnh HelloWeb.aspx, .NET cng s t ng i tn trang m ca trang thnh HelloWeb.cs. .NET pht sinh ra mt s m ASP.NET: <%@ Page language="c#" Codebehind="HelloWeb.cs" AutoEventWireup="false"
Gio trnh Visual Studio .NET

141

Inherits="ProgrammingCSharpWeb.WebForm1" %> Thuc tnh language ch ra ngn ng lp trnh c dng trong trang m qun l trang, y l C#. Codebehide xc nh trang m qun l c tn HelloWeb.cs v thuc tnh Inherits ch trang Web c tha k t lp WebForm1 c vit trong HelloWeb.cs: public class WebForm1: System.Web.UI.Page Ta thy trang ny c tha k t lp System.Web.UI.Page, lp ny do ASP.NET cung cp, xc nh cc thuc tnh, phng thc v cc s kin chung cho cc trang pha my ch. M HTML pht sinh nh dng thuc tnh ca Form: <form id="Form1" method="post" runat="server"> Thuc tnh id lm nh danh cho Form, thuc tnh method c gi tr l POST ngha l Form s c gi ln my ch ngay lp tc khi nhn mt s kin do ngi dng pht ra ( nh s kin nhn nt ) v c IsPostBack trn my ch khi s c gi tr l true. Bin c ny c gi tr l false nu Form c trnh vi phng thc GET hay ln u tin trang c gi. Bt k iu khin no hay Form c thuc tnh runat=server th iu khin hay Form ny s c x l bi ASP.NET Framework trn my ch. Thuc tnh MS_POSITIONING =GridLayout trong th <Body>, cho bit cch b tr cc iu khin trn Form theo dng li. Hin gi Form ca ta l trng, hin th mt chui g ln mn hnh, ta g dng m sau trong th <body>: Hello World! It is now <% = DateTime.Now.ToString( ) %> Ging vi ASP, phn nm trong du <% %> c xem nh l m qun l cho trang, y l m C#. Du = ch ra mt gi tr nhn c t mt bin hay mt i tng no , ta cng c th vit m trn li nh sau vi cng chc nng: Hello World! It is now <% Response.Write(DateTime.Now.ToString( )); %> Thc thi trang ny ( Ctrl-F5 ), kt qu s hin trn trnh duyt nh sau: Hello World! It is now 26/02/08 9:28:56 AM thm cc iu khin cho trang, hoc l ta c th vit m trong ca s HTML hoc l
Gio trnh Visual Studio .NET

142

ko th cc iu khin trn b cng c ca Web Form vo ca s thit k trang. ASP.NET s t ng pht sinh ra kt qu t m HTML thnh cc iu khin cng nh t cc iu khin trn trang thit thnh m HTML tng ng. Cc iu khin ca ASP.NET, c thm ch asp: pha trc tn ca iu khin , c thit k mang tnh hng i tng nhiu hn. V d: <asp:RadioButton> <asp:CheckBox> <asp:Button> <asp:TextBox rows="1"> <asp:TextBox rows="5"> Ngoi cc iu khin ca ASP.NET, cc iu khin HTML chun cng c ASP.NET h tr. Tuy nhin cc iu khin khng to s d c trong m ngun do tnh i tng trn chng khng r rng, cc iu khin HTML chun ng vi nm iu khin trn l: <input type = "radio"> <input type="checkbox"> <input type="button"> <input type="text"> <textarea> 5.3 Mt s v d mu minh ha Mt cch thun tin nht hc mt cng ngh mi chnh l da vo cc v d, v vy trong phn ny chng ta s kho st mt vi v d minh ha cho phn l thuyt ca chng ta. Nh ta bit, ta c th vit m qun l theo hai cch: hoc l vit trong tp tin .cs hoc l vit trc tip trong trang cha m HTML. Trn v d 1, ta s vit m qun l trc tip trn trang HTML. 5.3.1 V d 1: Kt buc d liu khng thng qua thuc tnh DataSource ng dng ca chng ta n gin ch hin ln trang tn khch hng v s ha n bng cch dng hm DataBind(). Hm ny s kt buc d liu ca mi thuc tnh hay ca bt k i tng. <html>
Gio trnh Visual Studio .NET

143

<head> // m qun l C# s c vit trong th <script> ny <script language="C#" runat="server"> // trang s gi hm ny u tin, ta s thc hin kt buc // trc tip trong hm ny void Page_Load(Object sender, EventArgs e) { Page.DataBind(); } // ly gi tr ca thuc tnh thng qua thuc tnh // get string custID{ get { return "ABCD"; } } int orderCount{ get { return 11; } } </script> </head> <body> <h3><font face="Verdana"> Ket buoc khong dung DataSource </font></h3> <form runat=server> Khach hang: <b><%# custID %></b><br>
Gio trnh Visual Studio .NET

144

So hoa don: <b><%# orderCount %></b> </form> </body> </html> 5.3.2 V d 2. Yu cu: to 1 Web site cho sinh vin t ch mn sch trn th vin bao gm cc chc nng ng nhp, sa i ti khon, hin th cc thng tin v c gi, hin th, tm kim v mn sch vi giao din nh sau:

+ Khi c gi chn c sch cn mn th c gi phi n th vin gp ngi qun th ly sch. +V d ny s dng c s d liu quanlythuvien bi thc hnh 4.3.4. + To Project c tn l thuvien: File|New|Web site chn ASP.NET Web Site

Gio trnh Visual Studio .NET

145

+ To file cu hnh: Web site | Add New Item chn Web Configuration File

+ To ng kt ni n c s d liu quanlythuvien
Gio trnh Visual Studio .NET

146

M file Web.config v sa li:

5.3.1 Xy dng cc lp dng chung. s dng li cc thnh phn trong nhiu d n ta tin hnh xy dng cc lp dng chung trong cc ng dng ASP.NET vi c s d liu SQL SERVER nh sau: 5.3.1.1 Xy dng lp dng chung: KetNoiVaThaoTac.cs + kt ni n c s d liu, thc thi cc tc v trn d liu v truy vn d liu: + Kch chut phi ln App_Code ca s Solution Explored | Add New Item| Class v g tn lp:

+ Khi lp trnh Web s dng c s d liu SQL Server ta s dng cc th vin sau (cc th vin ny dng chung cho tt c cc lp trong v d ny):
using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security;

Gio trnh Visual Studio .NET

147

using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls;

using System.Data.SqlClient; using System.Web.Configuration; + Trong lp KetNoiVaThaoTac ta s dng cc trng, thuc tnh v cc phng thc dng chung nh sau:

+ Khi khai bo v khi to lp KetNoiVaThaoTac ta c th m kt ni n c s d liu:


public KetNoiVaThaoTac(string ChuoiKetNoi)

{
this.ChuoiKetNoi = ChuoiKetNoi;

MoDuongKetNoi();
}

Trong , phng thc MoDuongKetNoi();dng m kt ni n c s d liu SQL Server bng cch dng phng thc Open ca i tng SqlConnection:
Gio trnh Visual Studio .NET

148

public void MoDuongKetNoi()

{
if (cn == null || cn.State == ConnectionState.Closed)

{ cn = new SqlConnection(ChuoiKetNoi); cn.Open(); }

} + Khi khng c nhu cu kt ni n c s d liu, ta khai bo phng thc ng kt ni v gii phng i tng SqlConnection:
public void DongKetNoi()

{
if (cn.State == ConnectionState.Open)

{ cn.Close(); } cn.Dispose();
}

+ Thuc tnh CommandText ngi lp trnh c th truyn cu lnh SQL hoc tn th tc lu tr:
public string CommandText

{
set { commandText = value; } get { return commandText; }

} + ch nh ngi lp trnh s dng cu lnh SQL hay tn th tc lu tr ta khai bo


Gio trnh Visual Studio .NET

149

thuc tnh CommandType nh sau:


public CommandType CommandType

{
set { commandType = value; } get { return commandType; }

} + Nu cu lnh SQL hoc th tc lu tr c tham s, ta khai bo thuc tnh ParameterCollection truyn vo mng cc tham s nh sau:
public string[] ParameterCollection

{
set { parameterCollection = value; } get { return parameterCollection; }

} + Khi truyn vo mng cc tham s th ngi lp phi truyn mng gi tr tng ng thng qua thuc tnh ValueCollection:
public string[] ValueCollection

{
set { valueCollection = value; } get { return valueCollection; } }

+ khai bo tham s v gi tr cho tham s t hai thuc tnh ParameterCollection, ValueCollection va khai bo trn, ta khai bo phng thc AddParameters
public void AddParameters(SqlCommand cmd)

{ for (int i = 0; i < parameterCollection.Length; i++) {

Gio trnh Visual Studio .NET

150

cmd.Parameters.AddWithValue( parameterCollection[i], valueCollection[i]); } }

+ Trong ADO.NET phng thc thng thc hin cu lnh SQL hoc th tc lu tr l: ExecuteNonQuery. Ta c th xy dng li phng thc ExecuteNonQuery nh sau:
public int ExecuteNonQuery()

{ cmd = new SqlCommand(); cmd.CommandText = commandText; cmd.Connection = cn; cmd.CommandType = commandType;


if (ParameterCollection.Length > 0)

AddParameters(cmd);
int rows = cmd.ExecuteNonQuery();

cmd.Dispose();
return rows;// Tr v s mu tin thc thi }

+ Khi thc hin cu lnh SQL dng hnh ng hay th tc lu tr v ly ra gi tr dng i tng, ta s dng phng thc ExecuteScalar, thun tin cho vic s dng ta c th xy dng li phng thc ExecuteScalar nh sau:
public object ExecuteScalar()

{ cmd = new SqlCommand(); cmd.CommandText = commandText;

Gio trnh Visual Studio .NET

151

cmd.Connection = cn; cmd.CommandType = commandType;


if (ParameterCollection != null)

AddParameters(cmd);
object obj = cmd.ExecuteScalar();

cmd.Dispose();
return obj; }

+ Nu chng ta cn ly ra mt tp d liu gm nhiu i tng DataTable, ta c th s dng i tng DataSet :


public DataSet GetDataSet()

{ cmd = new SqlCommand(); cmd.CommandText = commandText; cmd.Connection = cn; cmd.CommandType = commandType;


if (ParameterCollection != null)

AddParameters(cmd); da = new SqlDataAdapter(cmd);


DataSet dataSet = new DataSet();

da.Fill(dataSet); cmd.Dispose(); da.Dispose();


return dataSet;

Gio trnh Visual Studio .NET

152

+ ly ra mt tp d liu, ta c th s dng i tng DataTable:


public DataTable GetDataTable()

{ cmd = new SqlCommand(); cmd.CommandText = commandText; cmd.Connection = cn; cmd.CommandType = commandType;


if (ParameterCollection != null)

AddParameters(cmd); da = new SqlDataAdapter(cmd);


DataTable dataTable = new DataTable();

da.Fill(dataTable); cmd.Dispose(); da.Dispose();


return dataTable; }

5.3.1.2 Xy dng lp dng chung: DuaDulieuVaoDieuKhien.cs + np d liu vo cho cc iu khin trong v d ny ta ch np d liu vo cho hai iu khin GridView v DataList: + Kch chut phi ln App_Code ca s Solution Explored | Add New Item| Class v g tn lp: DuaDulieuVaoDieuKhien.cs + Trong lp DuaDulieuVaoDieuKhien.cs ta s dng li lp KetNoiVaThaoTac bao gm cc trng, thuc tnh v cc phng thc dng chung nh sau:

Gio trnh Visual Studio .NET

153

+ Hm dng DuaDulieuVaoDieuKhien c dng to ra 1 lp KetNoiVaThaoTac


public DuaDulieuVaoDieuKhien(string cnstr)

{ LopChung = new KetNoiVaThaoTac(cnstr);


}

+ Tng t nh lp KetNoiVaThaoTac ta xy dng cc thuc tnh sau:


private string commandText = ""; public string CommandText

{
set { commandText = value; } get { return commandText; }

}
Gio trnh Visual Studio .NET

154

private CommandType commandType = CommandType.Text; public CommandType CommandType

{
set { commandType = value; } get { return commandType; }

}
private string[] parameterCollection; public string[] ParameterCollection

{
set { parameterCollection = value; } get { return parameterCollection; }

}
private string[] valueCollection; public string[] ValueCollection

{
set { valueCollection = value; } get { return valueCollection; } }

+ gn cc thuc tnh CommandText, CommandType, ParameterCollection, ValueCollection cho lp KetNoiVaThaoTac ta khai bo phng thc KhoiTao() nh sau:
public void KhoiTao()

{ LopChung.CommandText = commandText;

Gio trnh Visual Studio .NET

155

LopChung.CommandType = commandType; LopChung.ParameterCollection = parameterCollection; LopChung.ValueCollection = valueCollection; }

+ ng kt ni ta dng phng thc KetThuc() nh sau:


public void KetThuc()

{ LopChung.DongKetNoi(); }

+ ly c kt qu thng k ta xy dng hm:


public int DemDong()

{
int totalRecord = 0; object obj = LopChung.ExecuteScalar(); if (obj != null) totalRecord = (int)obj; return totalRecord;

+ Hm NapDuLieuVaoGridView c s dng a d liu vo iu khin GridView


public void NapDuLieuVaoGridView(GridView gridView)

{
DataTable dataTable = LopChung.GetDataTable(); if (dataTable != null)

Gio trnh Visual Studio .NET

156

gridView.DataSource = dataTable; }
else

gridView.DataSource = null; gridView.DataBind(); }

+ Trong trng cn phn trang, ta c th np chng hm NapDuLieuVaoGridView nh sau:


public void NapDuLieuVaoGridView( GridView gridView, int pageSize, int pageCount, PagerButtons pagerButtons)

gridView.AllowPaging = true;
DataTable dataTable = LopChung.GetDataTable(); if (dataTable != null)

{ gridView.DataSource = dataTable; gridView.PageSize = pageSize; gridView.PagerSettings.PageButtonCount = pageCount; gridView.PagerSettings.Mode = pagerButtons; }


else

gridView.DataSource = null; gridView.DataBind();


Gio trnh Visual Studio .NET

157

+ Tng t nh GridView ta c th np d liu vo cho iu khin DataList nh sau:


public int NapDuLieuVaoDataList(DataList dataList)

{
int totalRecord = 0; DataTable dataTable = LopChung.GetDataTable(); if (dataTable != null)

{ dataList.DataSource = dataTable; totalRecord = dataTable.Rows.Count; }


else

dataList.DataSource = null; dataList.DataBind();


return totalRecord;

+ Phng thc TaoLienKetTrongGridView dng to lin kt trn ct th TruongHienThi, khi chn lin kt s m url vi tham s l gi tr trn ct th TruongHienThi, khi r chut li lin kt s xut hin Thongbao
public void TaoLienKetTrongGridView(GridView GridView1, string url, int TruongHienThi, int TruongLienket, string Thongbao)

{
foreach (GridViewRow rows in GridView1.Rows)

Gio trnh Visual Studio .NET

158

HyperLink hyperLink = new HyperLink();

hyperLink.Text =rows.Cells[TruongHienThi].Text; hyperLink.NavigateUrl = url + rows.Cells[TruongLienket].Text ; hyperLink.ToolTip = Thongbao; rows.Cells[1].Controls.Add(hyperLink); }


}

5.3.2 Xy dng cc lp thao tc trn cc bng: Docgia, sach v phieumuon. 5.3.2.1 Xy dng lp Docgia + Kch chut phi ln App_Code ca s Solution Explored | Add New Item| Class v g tn lp: Docgia.cs + Trong lp Docgia.cs s dng cc trng v phng thc sau:

Trong : + Trng cnstr c s dng ly chui kt ni trong file cu hnh Web.config string cnstr = WebConfigurationManager.ConnectionStrings["thuvien"].ConnectionString; + Xy dng hm dng Docgia() rng + Phng thc KiemDangNhap kim tra xem m c gi v mt khu c gi nhp c ng khng.
public int KiemDangNhap(string UserName, string PassWord)

{
DuaDulieuVaoDieuKhien dl = new DuaDulieuVaoDieuKhien(cnstr);

dl.CommandText = "select count(*) from Docgia where madocgia=

Gio trnh Visual Studio .NET

159

@madg and matkhau=@pwd";

dl.CommandType = CommandType.Text; dl.ParameterCollection = new string[2] { "@madg","pwd" }; dl.ValueCollection = new string[2] { UserName,PassWord}; dl.KhoiTao();
int kq= dl.DemDong() ; return kq;

+ Phng thc GetDocGia a vo m c gi, tr v H tn v tn khoa ca c gi


public string[] GetDocGia(string madocgia)

{
string[] st = new string[2]; KetNoiVaThaoTac dl = new KetNoiVaThaoTac(cnstr);

dl.CommandText = "select madocgia,Hoten,tenkhoa from Docgia,khoa where" +" Docgia.makhoa=khoa.makhoa and madocgia=@madg"; dl.CommandType = CommandType.Text; dl.ParameterCollection = new string[1] { "@madg" }; dl.ValueCollection = new string[1] { madocgia }; dl.MoDuongKetNoi();
DataTable dt= dl.GetDataTable(); if (dt.Rows.Count != 0)

{ st[0] = dt.Rows[0][1].ToString();

Gio trnh Visual Studio .NET

160

st[1] = dt.Rows[0][2].ToString(); }
else

st = null;
return st;

+ Phng thc HienThiThongTin a tt c thng tin ca c gi c m c gi l madocgia vo 1 GridView theo th t gim dn theo ngy mn
public void HienThiThongTin(GridView gv,string madocgia)

{
DuaDulieuVaoDieuKhien dl = new DuaDulieuVaoDieuKhien(cnstr);

dl.CommandText = "select Docgia.madocgia,hoten,tenkhoa, "+


nhande,phieumuon.soluong, ngaymuon,trangthai from Docgia, sach, khoa, "+ "phieumuon where khoa.makhoa=docgia.makhoa and docgia.madocgia=" + "phieumuon.madocgia and sach.masach=phieumuon.masach and"+ "Docgia.madocgia=@madocgia order by ngaymuon DESC";

dl.CommandType = CommandType.Text; dl.ParameterCollection = new string[1] { "@madocgia" }; dl.ValueCollection = new string[1] { madocgia }; dl.KhoiTao(); dl.NapDuLieuVaoGridView(gv); }

+ Phng thc DoiMatKhau c s dng i mt khu c thnh mt khu mi cho c gi c m l madocgia


public int DoiMatKhau(string madg,string MatKhauCu,string MatKhauMoi)

Gio trnh Visual Studio .NET

161

{
if (KiemDangNhap(madg,MatKhauCu)==1)

{
KetNoiVaThaoTac dl = new KetNoiVaThaoTac(cnstr);

dl.CommandText = "update docgia set matkhau=@matkhaumoi where


matkhau=@matkhaucu and madocgia=@madg";

dl.CommandType = CommandType.Text; dl.ParameterCollection = new string[3] {


"@madg","@matkhaucu","@matkhaumoi" };

dl.ValueCollection = new string[3] { madg,MatKhauCu,MatKhauMoi}; dl.MoDuongKetNoi();


return dl.ExecuteNonQuery();

}
else return 0; }

5.3.2.2 Xy dng lp Sach + Kch chut phi ln App_Code ca s Solution Explored | Add New Item| Class v g tn lp: Sach.cs + Trong lp Sach.cs s dng cc trng v phng thc sau:

Trong :
Gio trnh Visual Studio .NET

162

+ Trng cnstr ging nh lp Docgia + Hm dng Sach() rng + Phng thc Getsach tr v nhan (tn sch) v tc gi ca sch c m l masach
public string[] GetSach(string masach)

{
string[] st = new string[2]; KetNoiVaThaoTac dl = new KetNoiVaThaoTac(cnstr);

dl.CommandText =
"select masach,nhande,tacgia from sach where masach=@masach";

dl.CommandType = CommandType.Text; dl.ParameterCollection = new string[1] { "@masach" }; dl.ValueCollection = new string[1] { masach }; dl.MoDuongKetNoi();
DataTable dt = dl.GetDataTable(); if (dt.Rows.Count != 0)

{ st[0] = dt.Rows[0][1].ToString(); st[1] = dt.Rows[0][2].ToString(); }


else

st = null;
return st;

+ Phng thc GiamSoLuong: gim s lng i 1 i vi sch c m l masach

Gio trnh Visual Studio .NET

163

public int GiamSoLuong(string masach)

{
KetNoiVaThaoTac dl = new KetNoiVaThaoTac(cnstr);

dl.CommandText = "update sach

set soluong=soluong-1 where masach=@masach and soluong>=1";

dl.CommandType = CommandType.Text; dl.ParameterCollection = new string[1] { "@masach" }; dl.ValueCollection = new string[1] { masach }; dl.MoDuongKetNoi();
return dl.ExecuteNonQuery() ; }

+ Phng thc TangSoLuong: tng s lng ln 1 i vi sch c m l masach


public int TangSoLuong(string masach) { KetNoiVaThaoTac dl = new KetNoiVaThaoTac(cnstr); dl.CommandText = "update sach set soluong=soluong+1 where masach=@masach"; dl.CommandType = CommandType.Text; dl.ParameterCollection = new string[1] { "@masach" }; dl.ValueCollection = new string[1] { masach }; dl.MoDuongKetNoi(); return dl.ExecuteNonQuery(); }

5.3.2.3 Xy dng lp PhieuMuon + Kch chut phi ln App_Code ca s Solution Explored | Add New Item| Class v g tn lp: PhieuMuon.cs + Trong lp PhieuMuon.cs s dng cc trng v phng thc sau:

Gio trnh Visual Studio .NET

164

Trong : + Trng cnstr ging nh lp Docgia + Hm dng PhieuMuon() rng + Phng thc KiemTraMuon kim tra xem c gi c m l madocgia tr sch hay cha. Ta da vo trng trangthai trong bng phieumuon: nu trng thai=0 th th c gi ny tr sch, trangthai=1 mn sch trn Web nhng cha ly sch, trangthai=2 ly sch.
public int KiemTraMuon(string Madocgia)

{
DuaDulieuVaoDieuKhien dl = new DuaDulieuVaoDieuKhien(cnstr);

dl.CommandText = "select count(*) from phieumuon where madocgia=@madg


and trangthai!=0";

dl.CommandType = CommandType.Text; dl.ParameterCollection = new string[1] { "@madg"}; dl.ValueCollection = new string[1] { Madocgia }; dl.KhoiTao();
return dl.DemDong();

+ Phng thc Capnhap c s dng a vo bng phieumuon 1 mu tin


public int CapNhat(string madg,DateTime ngaymuon,string masach, int sl,int trangthai )

Gio trnh Visual Studio .NET

165

{
Sach s = new Sach(); if (s.GiamSoLuong(masach) == 1)

{
KetNoiVaThaoTac dl = new KetNoiVaThaoTac(cnstr);

dl.CommandText = "insert into phieumuon(madocgia,ngaymuon,masach,


soluong,trangthai)values(@madg,@ngaymuon,@masach,@sl,@trangthai)";

dl.CommandType = CommandType.Text; dl.ParameterCollection = new string[5] { "@madg", "@ngaymuon", "@masach", "@sl", "@trangthai" }; dl.ValueCollection = new string[5] { madg,
ngaymuon.ToShortDateString() , masach,sl.ToString(), trangthai.ToString() };

dl.MoDuongKetNoi();
return dl.ExecuteNonQuery() ;

}
else return 0; }

+ Phng thc HuyDangCho c s dng c gi hy i 1 cun sch t, mi c gi ti 1 thi im chi mn c 1 quyn sch, nn ta cn c vo trangthai ca c gi xa i sch t (theo quy c trangthai=0 tr ht sch, =1 t sch nhng cha ly, =2 mn sch). Sau khi hy t ch ta phi tng s lng trong bng Sach ln 1.
public int HuyDatCho(string masach) { KetNoiVaThaoTac dl = new KetNoiVaThaoTac(cnstr); dl.CommandText = "delete phieumuon where trangthai=1"; dl.CommandType = CommandType.Text; dl.ParameterCollection = null

Gio trnh Visual Studio .NET

166

dl.ValueCollection = null dl.MoDuongKetNoi(); int kq= dl.ExecuteNonQuery(); if (kq == 1) { Sach s = new Sach(); s.TangSoLuong(masach); } return kq; }

5.3.3 Xy dng cc WebUserControl. - UserControl l thnh phn c sn ca ASP.NET, cho php ta thit k iu khin da trn cc k thut m ta lp trnh trn trang ASP.NET. - Khi s dng UserControl, ta phi nhng chng vo trang ASP.NET thay v thc thi mt mnh ging nh trang ASP.NET, phn m rng ca UserControl l ASCX. - Sau khi thit k xong UserControl ta chn chng t ca s Solution Explored v ko th vo trang ASP.NET + qun l ta to mt th mc lu cc WebUserControl: Web Site | New Folder| g tn th mc l UC + To ra 1 WebUserControl: Kch chut phi ln tn th mc UC | Add New Item | Web User Control | g tn WebUserControl | Add:

xy dng Web site nh v d ta cn xy dng cc WebUserControl: Top.ascx, TopMenu.ascx: Hin th cc mc trn menu nh: Home, Thng tin v c
Gio trnh Visual Studio .NET

167

gi,Left.ascx: Hin th cc loi sch. Right.ascx: Tm kim theo tn sch hoc tc gi. v Lietkesach.ascx nh sau:

Top.ascx

TopMeNu.ascx

Right.ascx

Left.asc x

LietKesach.ascx

5.3.3.1 Xy dng WebUserControl: Top.ascx

+ Chn HTML ca s ToolBox: To ra 1 Table: 2 dng 2 ct, sau trn 2 dng u tin thnh 1 + Chn Standard ca s ToolBox: To ra 3 Label: Lable1 hin th ngy, Label2 hin th thng, Label 3 hin th nm + Chn Standard ca s ToolBox: to ra 1 Image, a nh vo bng thuc tnh ImageUrl ca s Properties. + Kch chut phi ln tng chn Style to mu cho cc + Trn s kin Page_Load ta a ngy, thng nm vo cho cc Label.
protected void Page_Load(object sender, EventArgs e)

{ Label1.Text = DateTime.Now.Day.ToString(); Label2.Text = DateTime.Now.Month.ToString();


Gio trnh Visual Studio .NET

168

Label3.Text = DateTime.Now.Year.ToString();

} 5.3.3.2 Xy dng WebUserControl: TopMenu.ascx:

+ Chn HTML ca s ToolBox: To ra 1 Table: 2 dng 2 ct, sau trn 2 dng u tin thnh 1 + Chn Standard ca s ToolBox: To ra 5 LinkButton: ln lt vi tn LinkButton1, LinkButton2, LinkButton3, LinkButton4, LinkButton5, ti thuc tnh Text ca mi LinkButton ln lt g Home, ThongTinDocGia, Mn sch, i mt khu v ng nhp. Khi ngi s dng chn 1 LinkButton s lin kt n 1 trang Web no ta s dng i tng Response.Redirect(url), c th nh sau:
protected void LinkButton1_Click(object sender, EventArgs e)

Session["UserName"] = null; Response.Redirect("~/Default.aspx");

}
protected void LinkButton2_Click(object sender, EventArgs e)

{ Response.Redirect("~/ThongTinDocGia.aspx"); }
protected void LinkButton3_Click(object sender, EventArgs e)

{ Response.Redirect("~/MuonSach.aspx"); }
protected void LinkButton5_Click(object sender, EventArgs e)

{ Response.Redirect("~/DoiMatkhau.aspx");
Gio trnh Visual Studio .NET

169

}
protected void LinkButton5_Click(object sender, EventArgs e)

{ Response.Redirect("~/DangNhap.aspx"); }

5.3.3.3 Xy dng WebUserControl: Right.ascx + tm theo tn sch hoc tn tc gi vi giao din nh sau:

+ Chn Standard ca s ToolBox: To 1 Label vi thuc tnh text l Nhp tn sch hoc tc gi: To 1 TextBox vi tn Textbox1 To 1 Button vi thuc tnh Name: Button1 v Text: Tm kim, trn s kin click ca nt ny lin kt sang trang Default.aspx vi tn tham s l ma v gi tr ca tham s l: Textbox1.Text:
protected void Button1_Click(object sender, EventArgs e)

{ Response.Redirect("Default.aspx?ma=" + TextBox1.Text); }

5.3.3.4 Xy dng WebUserControl: Left.ascx + hin th ra tt c loi sch, khi ngi s dng chn 1 loi sch s hin th ra tt c sch thuc loi ny: + Chn Data ca s ToolBox: to ra 1 DataList | Edit Templates nh sau:

Gio trnh Visual Studio .NET

170

+ Chn Standard ca s ToolBox: To 1 HyperLink ItemTemplate

+ Vo Source sa li nh sau:

Trong : Text='<%# Bind("TenLoai") %>' s hin th tn lin kt l tn ca tt c loi sch NavigateUrl='<%# "~/Default.aspx?maloai="+Eval("maloai")+"&tenloai="+Eval("tenloai")%>' Khi chn tn loi s lin kt sang trang Default.aspx v truyn 2 tham s vi tn maloai v tenloai v gi tr ca hai tham s ny tng ng vi tn loi chn. + Trn s kin Page_Load ta np d liu vo cho DataList :
protected void Page_Load(object sender, EventArgs e)

{if (!IsPostBack) {

Gio trnh Visual Studio .NET

171

string cnstr = WebConfigurationManager.ConnectionStrings["thuvien"].ConnectionString; DuaDulieuVaoDieuKhien dl = new DuaDulieuVaoDieuKhien(cnstr);

dl.CommandText = "select * from PhanLoai"; dl.KhoiTao(); dl.NapDuLieuVaoDataList(DataList1); }

} 5.3.3.5 Xy dng WebUserControl: LietKeSach.ascx + hin th thng tin ca cc quyn sch c tn loi chn left.ascx hoc hin th thng tin ca cc quyn sch c tn sch hoc tn tc gi nhp Right.ascx: + Chn Data ca s ToolBox: to ra 1 Literal + Chn Data ca s ToolBox: to ra 1 GridView | Edit Columns to cc ct:

Gio trnh Visual Studio .NET

172

(1),(2): Chn BoundField v Add chn thm 1 trng vo GridView. (3): Khng cho pht sinh thm trng, (4) t tiu cho ct l M sch. (5) D liu trng vo cho ct ny l masach + Tng t nh vy ta to ra cc ct Tc gi v s lng + Ring ct Nhan ta va hin th d liu va to lin kt, to ct Nhan ti (1) ta chn HyperLinkField | Add, ti (4) g tiu l Nhan , (5) ta chn nh sau:

Trong : - DataTextField: nhande l trng cn hin th d liu v to lin kt - DataNavigateUrlFormatString: ~/MuonSach.aspx?masach={0}, khi ta chn nhan sch s lin kt sang trang MuonSach.aspx v truyn 1 tham s l masach sang trang MuonSach.aspx - DataNavigateUrlField: masach l gi tr ca tham s truyn sang trang Muonsach.aspx. + Ti ca s Properties ta t 2 thuc tnh cho GridView: - Width: 100%
Gio trnh Visual Studio .NET

173

- EnableSortingAndPagingCallbacks:True + Sau khi thc hin cc thao tc trn ta nhn c m HTML pht sinh nh sau:

+ Trn s kin Page Load ta nhn v m loi v tn loi t left.ascx hoc nhn v tn sch hoc tn tc gi t right.aspx, t ta hin th sch ra GridView1: - u tin ta xy dng hm GetSql xc nh ngi dng chn tn loi Left.ascx hay tm kim theo tn sch hoc tn tc gi Right.ascx, hm xc nh cu lnh sql tng ng.
string[] GetSql()

{
string maloai = Request.QueryString.Get("maloai");//Ly v m loi t Left.ascx

//Ly v tn sch hoc tn tc gi t Right.ascx


string ma = Request.QueryString.Get("ma"); string[] sql = new string[2]; if (maloai != "" && maloai != null)//nu ngi dng chn tn loi Left.asxx

{sql[0] = "select masach,nhande,tacgia,nxb,soluong from sach,Phanloai where


sach.maloai=phanloai.maloai and Phanloai.maloai=@maloai";

sql[1] = maloai; }
if (ma != "" && ma != null)// Nu ngi dng i tm kim Right.ascx

Gio trnh Visual Studio .NET

174

{sql[0] = "select masach,nhande,tacgia,nxb,soluong from sach where


nhande like @maloai or tacgia like @maloai";

sql[1] = "%" + ma + "%"; }


return sql;

}
protected void Page_Load(object sender, EventArgs e)

{
string[] ma = new string[2] { "",""};

ma= GetSql();
if (ma[0] != "" && ma[0] != null)

{ string cnstr =
WebConfigurationManager.ConnectionStrings["thuvien"].ConnectionString; DuaDulieuVaoDieuKhien dl = new DuaDulieuVaoDieuKhien(cnstr);

dl.CommandText = ma[0]; dl.ParameterCollection = new string[1] { "@maloai" }; dl.ValueCollection = new string[1] { ma[1] }; dl.KhoiTao();
//Hin th ti a 5 dng trn GridView, s trang hin th l 10

dl.NapDuLieuVaoGridView(this.GridView1, 5, 10, PagerButtons.Numeric);


//to lin kt trn ct s 1 (nhan ), truyn tham s vi tn l masach, gi tr tham s trn ct // th 0 (masach) sang trang MuonSach.aspx

dl.TaoLienKetTrongGridView(GridView1, "~/MuonSach.aspx?masach=", 1, 0,
"Kch vo tn sch mn");

Gio trnh Visual Studio .NET

175

//nu ngi dng chn tn loi left.ascx


if (Request.QueryString.Get("tenloai") != null)

Literal1.Text = "<b> Danh sch cc sch loi: " + Request.QueryString.Get("tenloai") + "</b>";


else

Literal1.Text = "<b> Cac sach tim thay <\b>"; }


else

{Literal1.Text = "<B> SINH VIN HY CHN LOI SCH HOC TM KIM SCH MN</B>"; } }

+ Trn s kin PageIndexChanging ta xc nh trang th my cn hin th


protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)

{ GridView1.PageIndex = e.NewPageIndex ;

} 5.3.4. Xy dng cc cc trang WEB Theo yu cu ca v d ta cn xy dng 5 trang WEB sau: DangNhap.asp: cho php c gi ng nhp ti khon. Default.aspx (trang ch): c gi chn hoc tm sch mn. Muonsach.aspx: Ngi dng mn sch ThongTinDocGia.aspx: Hin th tt c cc thng tin ca c gi DoiMatKhau.aspx: c gi thay i mt khu To 1 trang WEB: Web site | Add New Item| G tn trang | Add

Gio trnh Visual Studio .NET

176

5.3.4.1 To trang DangNhap.asp

+ Chn Standard Tool Box: To ra 1 Literal hin th thng bo nu ng nhp khng thnh cng, To 2 label hin th M c gi v Mt khu To 2 TextBox g m c gi (TxtMaDocGia) v g mt khu (TxtMatKhau).Trn TxtMatKhau t thuc tnh: Text Mode: Pasword To Button ng Nhp (Button1) + Trn s kin Page_Load ta to 1 bin kt thuc lp Session kim tra xem c gi ng nhp hay cha. Bin thuc lp Session qun l mt phin lm vic ca mt c gi.
protected void Page_Load(object sender, EventArgs e)

{
Gio trnh Visual Studio .NET

177

Session["kt"] = null;

} + Trn s kin Click ca nt ng Nhp (Button1) ta kim tra xem c gi ng nhp ng hay khng nu ng nhp ng th m trang Default.aspx, trong s kin ny ta s dng phng thc KiemDangNhap ca lp Docgia.
protected void Button1_Click(object sender, EventArgs e)

{ Docgia dg = new Docgia();


if (dg.KiemDangNhap(TxtMaDocGia.Text,TxtMatKhau.Text)==1)

{ Session["kt"] = 1; Session["UserName"] = TxtMaDocGia.Text; Response.Redirect("~/Default.aspx"); }


else

{ Literal1.Text = "<font color=#FF3300><b> Sai Ma doc gia hoac Mat Khau <b></font>"; }
}

+ Kch chut phi ln DangNhap.aspx ca s Solution Explored | Set As Start Page: chn trang DangNhap lm trang chy mc nh. 5.3.4.2 To trang Default.asp (trang ch) + Chn HTML trn ToolBox: To 1 Table: 2 dng, 3 ct, trn 3 ca dng u thnh 1 (bi n 3 u | Kch chut phi | Merge Cells) :

+ Chn th mc UC ca s Solution Explored: Ko Top.ascx v TopMenu.ascx vo dng u tin. Ko Left.ascx vo (1) Ko LietKeSach.ascx vo (2)
Gio trnh Visual Studio .NET

178

Ko Right.ascx vo (3) khi ta c giao din nh sau:

+ Nhn F5 chy th 5.3.4.3 To trang Muonsach.asp

+ Chn HTML trn ToolBox: To 1 Table: 1 dng, 1 ct: + Chn th mc UC ca s Solution Explored:
Gio trnh Visual Studio .NET

179

Ko Top.ascx v TopMenu.ascx vo dng u tin. + Ti dng th 2 ca bng: Chn Standard trn ToolBox ln lt to ra cc Label, TextBox, Literal v cc Button ging nh hnh trn. + Trn s kin Page_Load ta kim tra xem c gi ng nhp cha, nu ng nhp th cho mn sch, nu cha th phi ng nhp
protected void Page_Load(object sender, EventArgs e)

{
if (Session["kt"] == null)// c gi cha ng nhp

{ Response.Redirect("~/DangNhap.aspx"); }
else

//txtma cha m c gi l m c gi ng nhp txtma.Text = Session["UserName"].ToString(); KiemtraMaDocGia(); // Hin th tn c gi v tn khoa TxtNgayMuon.Text = DateTime.Now.ToShortDateString();

//Khi c gi chn tn sch cn mn, ta c th ly m sch t //LietKesach.ascx truyn sang


string ma = Request.QueryString.Get("masach"); if (ma != null && ma != "")

{ TxtMasach.Text = ma; KiemTrasach(); // Hin th tn sch, tn tc gi ButKiemTra.Enabled = false;

Gio trnh Visual Studio .NET

180

} } }

+ Hm KiemtraMaDocGia kim tra xem m c gi nhp c ng khng nu ng th hm hin th h tn v tn khoa ca c gi


void KiemtraMaDocGia()

{
Docgia dg = new Docgia(); string[] st = new string[2];

st = dg.GetDocGia(txtma.Text);
if (st != null)

{ txtHoTen.Text = st[0]; TxtKhoa.Text = st[1]; } }

+ Hm KiemTraSach kim tra xem m sch nhp c ng khng nu ng th hm hin th tn sch v tc gi


void KiemTrasach()

{ Literal1.Text = "";
Sach dg = new Sach(); string[] st = new string[2];

Gio trnh Visual Studio .NET

181

st = dg.GetSach(TxtMasach.Text);
if (st != null)

{ TxtTensach.Text = st[0]; TxtTacGia.Text = st[1]; }


else

{ Literal1.Text = "Khong co ma sach nay"; } }

+ Khi ngi s dng khng chn tn sch cn mn m t g m sch khi ta i tm xem th c m sch ny khng, nu c th hin th tn sch v tc gi:
protected void ButKiemTra_Click(object sender, EventArgs e)// Nt Kim tra

{ KiemTrasach(); }

+ Khi c gi chn nt mn th kim tra xem c gi ny cn mn sch trong th vin khng, nu tr ht sch th cho c gi ny mn sch
protected void ButMuon_Click(object sender, EventArgs e)

{ PhieuMuon pm = new PhieuMuon();


if ( TxtMasach.Text == "")Literal2.Text = "Ban chua nhap ma sach "; else if (pm.KiemTraMuon(txtma.Text) == 1)

Gio trnh Visual Studio .NET

182

{ Literal2.Text = "Ban chua tra sach"; }


else

{ if (pm.CapNhat(txtma.Text, DateTime.Now, TxtMasach.Text, 1, 1)==1) Literal2.Text = "Ban da muon sach";


else

Literal2.Text = "Sach na da het trong thu vien"; }

} 5.3.4.3 To trang ThongTinDocGia.aspx + Chn HTML trn ToolBox: To 1 Table: 1 dng, 1 ct: + Chn th mc UC ca s Solution Explored: Ko Top.ascx v TopMenu.ascx vo dng u tin. + Ti dng th 2 ca bng: Chn Standard trn ToolBox to ra 1 Label v 1 DataGrid:

Gio trnh Visual Studio .NET

183

+ Trn s kin Page_Load ta kim tra xem c gi ng nhp cha, nu ng nhp th cho hin th thng tin, nu sch no t ch nhng cha ly ta to lin kt c gi c th hy t ch:
protected void Page_Load(object sender, EventArgs e) { if (Session["kt"] == null) { Response.Redirect("~/DangNhap.aspx"); } else { Docgia dg = new Docgia(); dg.HienThiThongTin(GridView1, Session["UserName"].ToString()); taolienket(); //Ly v m sch cn hy t ch string masach = Request.QueryString["masach"]; if (masach != null)//c gi chn sch cn hy { PhieuMuon pm = new PhieuMuon(); pm.HuyDatCho(masach); dg.HienThiThongTin(GridView1, Session["UserName"].ToString()); } } }
void taolienket() { foreach (GridViewRow rows in GridView1.Rows) { HyperLink hyperLink = new HyperLink(); hyperLink.Text = rows.Cells[3].Text; if (Int16.Parse(rows.Cells[6].Text) == 1) { hyperLink.NavigateUrl = "ThongTinDocGia.aspx?masach=" + rows.Cells[3].Text; hyperLink.ToolTip = "Chn tn sch hy"; } rows.Cells[3].Controls.Add(hyperLink); } }

Trong : phng thc taolienket() tm xem trong GridView c dng no c


Gio trnh Visual Studio .NET

184

trangthai=1 hay khng, nu c th to lin kt trn trng masach.


void taolienket() { foreach (GridViewRow rows in GridView1.Rows) { HyperLink hyperLink = new HyperLink(); hyperLink.Text = rows.Cells[3].Text; if (Int16.Parse(rows.Cells[6].Text) == 1) { hyperLink.NavigateUrl = "ThongTinDocGia.aspx?masach=" + rows.Cells[3].Text; hyperLink.ToolTip = "Chn tn sch hy"; } rows.Cells[3].Controls.Add(hyperLink); } }

5.3.4.4 To trang DoiMatKhau.aspx Chn Standard trn ToolBox to ra cc Label , TextBox v Literal nh sau:

+ M c gi chnh l UserName c gi ng nhp


protected void Page_Load(object sender, EventArgs e)

{ TxtMaDocGia.Text = Session["UserName"].ToString(); }

+ Khi c gi chn Button i mt Khu th kim tra xem m c gi nhp c ng khng, mt khu v mi c trng nhau hay khng, nu ng th cho thay i
protected void Button1_Click(object sender, EventArgs e)

Gio trnh Visual Studio .NET

185

{
Docgia dg = new Docgia(); if (TxtMatkhaumoi.Text.Equals(TxtGoLaiMatKhau.Text))

{
if(dg.DoiMatKhau(TxtMaDocGia.Text,TxtMatKhaucu.Text,TxtMatkhaumoi.Text)==1)

Literal1.Text = "Doi mat khau thanh cong";


else

Literal1.Text = "Ma doc gia hoac mat khau cu nhap sai"; }


else

Literal1.Text="Mat khau khong khop nhau";

} 5.3.5 Yu cu b sung: + Vi v d trn ch tp trung vo vic t trc ch mn sch, cha quan tm n chc nng ca ngi qun th. + Yu cu b sung, hy to ra cc trang thc hin cc cng vic sau: - ngi qun th ng nhp ti khon - ngi qun th cho mn sch (cn c vo cc c gi t ch trc) - Hin th thng tin c gi mn qu hn - c gi tr sch.

PH LC LC
Bng tng quan/chuyn i kiu d liu .NET Framework vi cc Data Provider
.NET Framework System.Data.DbType type

SqlDbType

OleDbType

OdbcType

OracleType

Gio trnh Visual Studio .NET

186

.NET Framework System.Data.DbType type bool byte byte[] Boolean Byte Binary

SqlDbType

OleDbType

OdbcType

OracleType

Bit TinyInt

Boolean UnsignedTinyInt

Bit TinyInt Binary

Byte Byte Raw

VarBinary. Vic VarBinary chuyn i ngm nh ny l khng ng nu mng byte l ln hn kch thc ti a ca mt VarBinary (8000 bytes). Khng h tr. Char DBTimeStamp Decimal Double Single

char DateTime Decimal double float Guid Int16 Int32 Int64 object DateTime Decimal Double Single Guid Int16 Int32 Int64 Object

Char DateTime Numeric Double Real

Byte DateTime Number Double Float

DateTime Decimal Float Real

UniqueIdentifier Guid SmallInt Int BigInt Variant SmallInt Int BigInt Variant

UniqueIdentifier Raw SmallInt Int BigInt Khng h tr. Int16 Int32 Number Blob

Gio trnh Visual Studio .NET

187

.NET Framework System.Data.DbType type string String

SqlDbType

OleDbType

OdbcType

OracleType

NVarChar. VarWChar Chuyn i ngm nh ny l khng ng nu string ln hn kch thc ti a ca mt NVarChar (4000 k t). Khng h tr. Khng h tr. Khng h tr. Khng h tr. VarChar DBTime

NVarChar

NVarChar

TimeSpan UInt16 UInt32 UInt64

Time UInt16 UInt32 UInt64 AnsiString

Time

DateTime UInt16 UInt32 Number VarChar Char Number DateTime SByte NChar DateTime Number

UnsignedSmallInt Int UnsignedInt UnsignedBigInt VarChar Char Currency DBDate TinyInt WChar DBTime VarNumeric BigInt Numeric VarChar Char Khng h tr. Date Khng h tr. NChar Time Khng h tr.

AnsiStringFixedLength Char Currency Date SByte StringFixedLength Time VarNumeric Money Khng h tr. Khng h tr. NChar Khng h tr. Khng h tr.

Gio trnh Visual Studio .NET

188

TI LIU THAM KHO KHO


(1) Stephen C. Perry, Core C# and .NET, Prentice Hall PTR, 2005 (2) Phm Hu Khang, C# 2005, Tp 5 Lp trnh ASP.NET 2.0, quyn 4: i tng ADO.NET v XML, Nh xut bn Lao ng X Hi. (3) Microsoft Corporation, MSDN 2005

Gio trnh Visual Studio .NET

189

You might also like