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

Kiu trong CTS


System.SByte
System.Int16
System.Int32
System.Int64
System.Byte

ushort

System.UInt16

uint

System.UInt32

Gio trnh Visual Studio .NET

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

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

Kiu trong CTS

S ch s c ngha

Vng biu din tng i (khong)

float
double

System.Single
System.Double

7
15/16

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

Kiu CTS
System.Object

string

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

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.

internal

Phng thc c th c truy xut trong phm vi cng assembly.

private

Phng thc ch c th truy xut trong lp khai bo n.

static
virtual

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.

abstract

Phng thc ch ng vai tr nh ngha c php, khng ci t.

override

Phng thc ghi phng thc c nh ngha l virtual hoc abstract lp cha.

sealed

Phng thc ghi phng thc virtual, nhng khng th c ghi bi bt c lp


no khi dn xut thm.

extern

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.

Gio trnh Visual Studio .NET

29

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

Gi tr

Name

FormMain

Gio trnh Visual Studio .NET

Ghi ch

79

Text

Hello WinForms

Tiu ca ca s

FormBorderStyle FixedSingle

Kch thc ca ca s s khng c


thay i khi chy chng trnh

MaximizeBox

V hiu ha nt Maximize ca ca
s

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

Gio trnh Visual Studio .NET

Gi tr
80

Format

Custom

CustomFormat

dd/MM/yyyy

txtOther

Enable

False

lblInfo

Font

Chn font thch hp, in m

picImage

SizeMode

StretchImage

lblName

BackColor

Transparent (Web)

tmrScroll

Interval

120

dtpDOB

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:
Interface

SQL Server
Provider
SqlConnection
IDbConnection
IDbDataAdapter SqlDataAdapter
SqlCommand
IDbCommand
IDbDataReader SqlDataReader

Oracle Provider

OLEDB Provider

ODBC Provider

OracleConnection
OracleDataAdapter
OracleCommand
OracleDataReader

OledbConnection
OledbDataAdapter
OledbCommand
OledbDataReader

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

Data

Source

Name

(DSN),

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

Gio trnh Visual Studio .NET

92

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

Gio trnh Visual Studio .NET

93

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:
ngha

Tn trng
Cn

Dng kt ni n c s d liu quanlythuvien

cmdSelect

sqlCommand s dng cu lnh select hin th v tm kim

cmdInsert

sqlCommand s dng cu lnh Insert to thm 1 ti khon

cmdXoa

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

Gio trnh Visual Studio .NET

110

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:
ngha

Tn trng
Cn

Dng kt ni n c s d liu quanlythuvien

cmd

sqlCommand s dng cu lnh select hin th v tm kim sch

da

SqlDataAdapter cha cmd v cn

ds

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

M t

Bindings

Tp hp cc i tng Binding c qun l bi


CurrencyManager

Count
Current
Position

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

Gio trnh Visual Studio .NET

SqlDbType

OleDbType

OdbcType

OracleType

186

.NET
Framework System.Data.DbType
type

SqlDbType

OleDbType

OdbcType

OracleType

bool

Boolean

Bit

Boolean

Bit

Byte

byte

Byte

TinyInt

UnsignedTinyInt

TinyInt

Byte

byte[]

Binary

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).

Binary

Raw

Khng h tr.

Char

Char

Byte

char
DateTime

DateTime

DateTime

DBTimeStamp

DateTime

DateTime

Decimal

Decimal

Decimal

Decimal

Numeric

Number

double

Double

Float

Double

Double

Double

float

Single

Real

Single

Real

Float

Guid

Guid

UniqueIdentifier Guid

UniqueIdentifier Raw

Int16

Int16

SmallInt

SmallInt

SmallInt

Int16

Int32

Int32

Int

Int

Int

Int32

Int64

Int64

BigInt

BigInt

BigInt

Number

object

Object

Variant

Variant

Khng h tr.

Blob

Gio trnh Visual Studio .NET

187

.NET
Framework System.Data.DbType
type

SqlDbType

OleDbType

OdbcType

OracleType

string

String

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

NVarChar

NVarChar

TimeSpan

Time

Khng h tr.

DBTime

Time

DateTime

UInt16

UInt16

Khng h tr.

UnsignedSmallInt Int

UInt16

UInt32

UInt32

Khng h tr.

UnsignedInt

BigInt

UInt32

UInt64

UInt64

Khng h tr.

UnsignedBigInt

Numeric

Number

AnsiString

VarChar

VarChar

VarChar

VarChar

AnsiStringFixedLength Char

Char

Char

Char

Currency

Money

Currency

Khng h tr.

Number

Date

Khng h tr.

DBDate

Date

DateTime

SByte

Khng h tr.

TinyInt

Khng h tr.

SByte

StringFixedLength

NChar

WChar

NChar

NChar

Time

Khng h tr.

DBTime

Time

DateTime

VarNumeric

Khng h tr.

VarNumeric

Khng h tr.

Number

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