You are on page 1of 124

Phn 3: Lp trnh C s d liu nng cao vi ADO.

NET
DANH SCH CC CHNG Chng 14: iu khin Giao dch nng cao Chng 15: Gii thiu nhng ng dng Web -ASP.NET Chng 16: S dng h tr XML ca SQL Server Chng 17: Nhng dch v Mng

Chng 14: iu khin Giao dch nng cao


Tng quan
Trong Chng 3, "Gii thiu v ngn ng truy vn c cu trc, " Bn thy l bn c th nhm nhng cu lnh SQL vo trong nhng giao dch nh th no. Nhng cu lnh SQL ny c coi nh mt n v cng vic lgc. Mt v d ca iu ny l mt chuyn i tin t ti khon ny sang ti khon khc s dng hai pht biu UPDATE. Mt rt tin ra khi mt ti khon, v mt chuyn tin vo trong mt ti khon khc . C hai pht biu UPDATE c th c xem nh l mt giao dch n v c hai pht biu u phi c giao ph hay phc nguyn cng nhau, nu khng tin c th b mt. Nhng c s d liu hin i c th x l nhiu ngi s dng v nhng chng trnh truy cp c s d liu ng thi, mi chng trnh chy tim tng nhng giao dch ca mnh trong c s d liu. iu ny c bit nh nhng giao dch trng hp bi v h c chy cng lc. Phn mm c s d liu phi c kh nng tha mn nhng nhu cu ca tt c nhng giao dch trng hp ny, cng nh bo tr s ton vn ca nhng hng c ct gi trong nhng bng c s d liu. Bn c th kim sot lng c lp tn ti gia nhng giao dch ca bn v nhng giao dch khc m c l ang c chy trong c s d liu. Trong Chng 8, "Thc hin nhng lnh C s d liu, " Bn thy cch s dng mt giao dch vi mt i tng Lnh nh th no. Trong Chng 11, "S dng nhng i tng Dataset sa i D liu, " Bn thy cch s dng mt giao dch vi mt DataAdapter nh th no. Trong chng ny, bn s i su vo iu khin giao dch nng cao s dng SQL Server v ADO.NET. Nhng mt ni bt trong Chng ny: . . . . . Lp SqlTransaction Nhng thuc tnh giao dch ACID S Thit t mt savepoint t mc c lp giao dch Hiu v nhng kha SQL Server

LP SqlTransaction:
C ba lp Giao dch SqlTransaction, OleDbTransaction, v OdbcTransaction. Bn s dng mt i tng Transaction i din cho mt giao dch c s d liu, v mt i tng ca lp SqlTransaction i din cho mt giao dch c s d liu trong mt c s d liu SQL Server. Bng 14.1 trnh by mt s thuc tnh SqlTransaction, v Bng 14.2 cho thy mt s nhng phng thc ca SqlTransaction. Bn s xem xt cch s dng mt s thuc tnh v phng php trong chng ny. Bng 14.1: nhng thuc tnh SqlTransaction

Thuc tnh Connection

Kiu d liu

M t

SqlConnection Ly kt ni cho giao dch.

IsolationLevel IsolationLevel Ly mc c lp cho giao dch ( xem " thit t mc c lp Giao dch") Bng 14.2: Nhng phng php SqlTransactiontransaction. Phng thc Commit() Save() Kiu M t tr v void void Thc hin mt giao ph duy tr mu tin nhng cu lnh SQL trong giao dch. B qu ti. Thc hin mt s hi nguyn hu b nhng cu lnh SQL trong giao dch. To ra mt savepoint trong giao dch m c th c dng hu b mt phn ca giao dch ny. Chui c chuyn cho phng php ny ch r tn savepoint. V ri bn c th hi nguyn giao dch ti savepoint ny ( xem " S thit t mt Savepoint ").

Rollback() void

THIT T MT Savepoint Bn c th t mt savepoint bt c ni u bn trong mt giao dch. iu ny cho php bn hi nguyn bt k s thay i no c lm ti nhng hng trong c s d liu sau lc thit t savepoint ca bn.iu ny c l hu ch nu bn c mt giao dch rt di, bi v nu bn to ra mt li sau khi bn thit t mt savepoint, Bn khng cn phi hi nguyn sut qu trnh giao dch ti khi u. THIT T MT Saverpoint S DNG T-SQL Bn t mt savepoint trong T-SQL s dng pht biu SAVE TRANSACTION (Giao dch Lu tr), hay phin bn tc k : SAVE TRANS. C php cho s pht biu ny nh sau: SAVE TRANS[ACTION] { savepointName | @savepointVariable } VI: savepointName ch r mt chui cha tn bn mun gn ti savepoint ca bn. savepointVariable ch r mt bin T- SQL cha tn savepoint ca bn. Bin ca bn phi thuc v kiu d liu char, varchar, nchar, hay nvarchar. V d sau y thit t mt savepoint c tn SaveCustomer: SAVE TRANSACTION SaveCustomer Chng ta hy quan st mt script v d T - SQL y , n t mt savepoint bn trong mt giao dch. Danh sch 14.1 cho thy mt script T- SQL thc hin nhng bc sau y: 1. Bt u mt giao dch. 2. Chn mt hng vo trong bng Customers vi mt CustomerID l J8COM. 3. thit t mt savepoint . 4. Chn mt hng vo trong bng Orders vi mt CustomerID l J8COM. 5. Thc hin mt hi nguyn ti savepoint, n hu b s chn thc hin trong bc 4 trc y, nhng vn duy tr s chn thc hin trong bc 2. 6. Giao ph giao dch, n giao ph hng c chn vo trong bng Customers trong bc 2.

7. La chn hng mi t bng Customers. 8. Th chn hng m c hi nguyn trong bc 5 t bng Customers. 9. Xa hng mi t bng Customers. Danh sch 14.1: SAVEPOINT.SQL /* Savepoint.sql illustrates how to use a savepoint */ USE Northwind - step 1: begin the transaction BEGIN TRANSACTION - step 2: insert a row into the Customers table INSERT INTO Customers ( CustomerID, CompanyName ) VALUES ( 'J8COM', 'J8 Company' ) - step 3: set a savepoint SAVE TRANSACTION SaveCustomer - step 4: insert a row into the Orders table INSERT INTO Orders ( CustomerID ) VALUES ( 'J8COM' ); - step 5: rollback to the savepoint set in step 3 ROLLBACK TRANSACTION SaveCustomer - step 6: commit the transaction COMMIT TRANSACTION - step 7: select the new row from the Customers table SELECT CustomerID, CompanyName FROM Customers WHERE CustomerID = 'J8COM' - step 8: attempt to select the row from the Orders table - that was rolled back in step 5 SELECT OrderID, CustomerID FROM Orders WHERE CustomerID = 'J8COM' - step 9: delete the new row from the Customers table DELETE FROM Customers WHERE CustomerID = 'J8COM' chy Script Savepoint.sql s dng b phn tch truy vn (Query Analyzer), bn chn File Open , M script t th mc sql, v nhn F5 trn bn phm hay chn Query Execute t thc n (menu). Hnh 14.1 trnh

by script Savepoint.sql ang chy trong b phn tch truy vn (Query Analyzer)

Hnh 14.1: chy script Savepoint.sql trong Query Analyzer

Thit t mt Savepoint s dng mt i tng SqlTransaction


Bn t mt savepoint trong mt i tng SqlTransaction bng cch gi phng thc Save() ca n, gi mt chui cha tn m bn mun gn cho savepoint ca bn. Gi thit bn c mt i tng SqlTransaction c tn mySqlTransaction; V d sau y nhng thit t mt SaveCustomer c tn saveCustomer bng cch gi phng thc Save() ca mySqlTransaction: mySqlTransaction.Save("SaveCustomer"); V ri Bn c th hi nguyn bt k s thay i k tip no c thc hin ti nhng hng trong c s d liu bi vic gi phng thc Rollback() ca mySqlTransaction, vi vic chuyn tn savepoint ti phng thc Rollback(). Chng hn: mySqlTransaction.Rollback("SaveCustomer"); Chng ta hy quan st mt chng trnh C# y ,n t mt savepoint bn trong mt giao dch. Danh sch 14.2 cho thy mt chng trnh thc hin nhng bc sau y: 1. To ra mt i tng SqlTransaction c tn mySqlTransaction. 2. To ra mt SqlCommand v gn thuc tnh Transaction (Giao dch) ca n ti mySqlTransaction. 3. Chn mt hng vo trong bng Customers. 4. thit t mt savepoint bi vic gi phng thc Save() ca mySqlTransaction, chuyn tn SaveCustomer ti phng thc Save() . 5. Chn mt hng vo trong bng Orders. 6. Thc hin mt hi nguyn ti savepoint c thit lp trong bc 4, n hu b s chn thc hin trong bc 5 trc y, nhng vn duy tr s chn thc hin trong bc 3. 7. Hin th hng mi c thm vo bng Customers. 8. Xa hng mi t bng Customers 9. Giao ph giao dch. Danh sch 14.2: SAVEPOINT.CS

/* Savepoint.cs illustrates how to set a savepoint in a transaction */ using System; using System.Data; using System.Data.SqlClient; class Savepoint { public static void Main() { SqlConnection mySqlConnection = new SqlConnection( "server=localhost;database=Northwind;uid=sa;pwd=sa" ); mySqlConnection.Open(); // step 1: create a SqlTransaction object SqlTransaction mySqlTransaction = mySqlConnection.BeginTransaction(); // step 2: create a SqlCommand and set its Transaction property // to mySqlTransaction SqlCommand mySqlCommand = mySqlConnection.CreateCommand(); mySqlCommand.Transaction = mySqlTransaction; // step 3: insert a row into the Customers table Console.WriteLine("Inserting a row into the Customers table "+ "with a CustomerID of J8COM"); mySqlCommand.CommandText = "INSERT INTO Customers ( " + " CustomerID, CompanyName " + ") VALUES ( " + " 'J8COM', 'J8 Company' "+ ")"; int numberOfRows = mySqlCommand.ExecuteNonQuery(); Console.WriteLine("Number of rows inserted = "+ numberOfRows); // step 4: set a savepoint by calling the Save() method of // mySqlTransaction, passing the name "SaveCustomer" to // the Save() method mySqlTransaction.Save("SaveCustomer"); // step 5: insert a row into the Orders table Console.WriteLine("Inserting a row into the Orders table "+ "with a CustomerID of J8COM"); mySqlCommand.CommandText = "INSERT INTO Orders ( " + " CustomerID " + ") VALUES ( " + "'J8COM' "+ ")"; numberOfRows = mySqlCommand.ExecuteNonQuery(); Console.WriteLine("Number of rows inserted = "+ numberOfRows);

// step 6: rollback to the savepoint set in step 4 Console.WriteLine("Performing a rollback to the savepoint"); mySqlTransaction.Rollback("SaveCustomer"); // step 7: display the new row added to the Customers table mySqlCommand.CommandText = "SELECT CustomerID, CompanyName "+ "FROM Customers "+ "WHERE CustomerID = 'J8COM'"; SqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader(); while (mySqlDataReader.Read()) { Console.WriteLine("mySqlDataReader[\" CustomerID\"] = "+ mySqlDataReader["CustomerID"]); Console.WriteLine("mySqlDataReader[\" CompanyName\"] = "+ mySqlDataReader["CompanyName"]); } mySqlDataReader.Close(); // step 8: delete the new row from the Customers table Console.WriteLine("Deleting row with CustomerID of J8COM"); mySqlCommand.CommandText = "DELETE FROM Customers "+ "WHERE CustomerID = 'J8COM'"; numberOfRows = mySqlCommand.ExecuteNonQuery(); Console.WriteLine("Number of rows deleted = "+ numberOfRows); // step 9: commit the transaction Console.WriteLine("Committing the transaction"); mySqlTransaction.Commit(); mySqlConnection.Close(); } } u ra t chng trnh ny sau: Inserting a row into the Customers table with a CustomerID of J8COM Number of rows inserted = 1 Inserting a row into the Orders table with a CustomerID of J8COM Number of rows inserted = 1 Performing a rollback to the savepoint mySqlDataReader["CustomerID"] = J8COM mySqlDataReader["CompanyName"] = J8 Company Deleting row with CustomerID of J8COM Number of rows deleted = 1 Committing the transaction

Thit t mc c lp Giao dch


Mc c lp giao dch l hn m ti nhng s thay i do mt giao dch to ra , c phn chia t nhng giao dch trng hp khc. Trc khi Ti i vo nhng chi tit ca nhiu mc c lp giao dch, bn cn hiu nhng kiu s c m c l s xut hin khi nhng giao dch thng k th truy nhp vo cng nhng hng trong mt bng. Trong danh sch sau y, Ti s s dng nhng v d ca hai giao dch trng hp m ang truy cp vo cng nhng hng minh ha ba kiu s c v x l giao dch tim tng. Phantoms(ma thut): Transaction1 c mt tp hp ca nhng hng tr v bi mt mnh WHERE c ch r. ri Transaction 2 chn vo mt hng mi, m cng xy ra p ng mnh WHERE ca truy vn

s dng trc bi Transaction 1. ri Transaction1 c nhng hng ln na s dng truy vn ging nh vy, nhng by gi li thy hng va c chn vo bi Transaction 2. Hng mi ny c bit nh mt " ma thut", bi v i vi Transaction 1, hng ny c v nh xut hin cch ma thut. Nonrepeatable reads: Transaction1 c mt hng, v Transaction 2 cp nht cng hng va c c bi Transaction 1. Ri Transaction 1 li c cng hng ln na v pht hin rng hng n c trc by gi thay i. iu ny c bit nh mt " s c khng th lp li ", bi v hng trc y c bi Transaction 1 c thay i. Dirty Reads (S c d): Transaction 1 cp nht mt hng nhng khng giao ph s cp nht. Transaction 2 c hng c cp nht. Ri Transaction 1 thc hin mt hi nguyn, hu b s cp nht trc y. By gi hng va c c bi Transaction 2 khng cn hp l na ( hay n "d ") v s cp nht thc hin bi Transaction 1 khng c giao ph khi hng c c bi Transaction 2. gii quyt nhng vn tim tng ny, nhng c s d liu thc hin nhiu mc c lp giao dch cn tr nhng giao dch trng hp can thip ln nhau. SQL tiu chun nh ngha bn mc c lp, c trnh by trong Bng 14.3. Nhng mc ny c trnh by theo mc c lp tng dn. Bng 14.3: nhng mc c lp Tiu chun SQL Mc c lp READ UNCOMMITTED M t Ma thut, nhng s c khng th lp li, v nhng s c d c cho php.

READ COMMITTED Ma thut v s c khng khng th lp li c cho php, nhng nhng s c d th Khng. y l mc nh cho SQL Server. REPEATABLE READ Ma thut c cho php, nhng nhng s c d v khng th lp li th khng. SERIALIZABLE Ma thut, nhng s c khng khng th lp li, v nhng s c d khng c cho php. y l mc nh cho SQL tiu chun.

SQL Server h tr tt c nhng mc c lp giao dch ny. Mc c lp giao dch mc nh c nh ngha bi SQL tiu chun c xp theo th t, ngoi tr mc nh s dng bi SQL Server l READ COMMITTED (s c c giao ph), n c chp nhn cho hu ht nhng ng dng. Cnh bo: khi bn t mc c lp giao dch l SERIALIZABLE (xp theo th t), bt k hng no bn truy cp bn trong mt giao dch k tip s c " kha ", c ngha rng khng c giao dch no khc c th sa i nhng hng ny. Thm ch nhng hng bn truy xut s dng mt pht biu SELECT cng s b kha. Bn phi giao ph hay hi nguyn giao dch b nhng kha v cho php nhng giao dch khc truy cp nhng hng ny . Bn s dng SERIALIZABLE (xp theo th t) ch khi bn phi bo m rng giao dch ca bn c c lp t nhng giao dch khc. Bn s hc nhiu hn v iu ny sau trong mc " Tm hiu nhng s kha SQL Server." Ngoi ra, ADO.NET cn h tr mt s mc c lp giao dch, c nh ngha trong lit k System.Data.IsolationLevel. Bng 14.4 cho thy nhng thnh vin ca lit k ny. Bng 14.4: nhng thnh vin lit k IsolationLevel

Mc c lp
Chaos ReadCommitted

M t
Nhng s thay i ang xem xt t nhiu giao dch c c lp khng th b ghi ln. SQL Server khng h tr mc c lp ny. Nhng" ma thut" v "s c khng ng c lp li " c cho php, nhng nhng s c bn thu th khng. y l mc nh.

ReadUncommitted Ma thut, nhng s c khng ng c lp li, v nhng s c d c cho php. RepeatableRead Serializable Unspecified Ma thut c cho php, nhng nhng s c bn v khng ng c lp li th khng . Ma thut, nhng s c khng ng c lp li, v nhng s c bn khng c cho php. Mt mc c lp khc so vi ci ch nh hin ang dng, nhng mc khng th xc nh c . SQL Server khng h tr mc c lp ny.

Thit t giao dch s dng T- SQL


Cng nh vic hc thit t mc c lp giao dch s dng T- SQL, Bn s thy mt v d trnh by hiu ng ca vic thit t nhng mc c lp giao dch khc nhau trong SQL Server- s dng cng c phn tch truy vn (Query Analyzer tool). thit t mc c lp giao dch trong T- SQL, Bn s dng lnh SET TRANSACTION ISOLATION LEVEL. C php cho lnh ny nh sau: SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE } Nh bn c th thy t c php trc y, bn c th t c lp giao dch ti bt k nhng mc no ch ra trc trong Bng 14.3. V d sau y t mc c lp giao dch ti SERIALIZABLE: SET TRANSACTION ISOLATION LEVEL SERIALIZABLE Ghi ch Mc c lp giao dch c gn cho phin hp ca cc bn. Bi vy, nu bn thc hin nhiu giao dch trong mt phin hp, tt c nhng giao dch ca bn s s dng cng mc nh vy. Nu bn mun thay i mc trong phin hp ca bn, bn n gin thc hin lnh SET TRANSACTION ISOLATION LEVEL vi mc mi ca bn. Tt c cc giao dch k tip trong phin hp ca bn s s dng mc mi. V d sau y t mc c lp giao dch ti READ COMMITTED: SET TRANSACTION ISOLATION LEVEL READ COMMITTED Chng ta hy quan st mt v d y m thit t mc c lp giao dch s dng T- SQL. Danh sch 14.3 cho thy mt v d s dng Script T- SQL t mc c lp giao dch u tin ti SERIALIZABLE (xp theo th t) v thc hin mt giao dch, v sau thit t mc ti READ COMMITTED v thc hin giao dch khc. Danh sch 14.3: TransactionIsolation.sql /* TransactionIsolation.sql illustrates how to set the transaction isolation level */

USE Northwind SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION SELECT CustomerID, CompanyName FROM Customers WHERE CustomerID IN ('ALFKI', 'J8COM') INSERT INTO Customers ( CustomerID, CompanyName ) VALUES ( 'J8COM', 'J8 Company' ) UPDATE Customers SET CompanyName = 'Widgets Inc.' WHERE CustomerID = 'ALFKI' SELECT CustomerID, CompanyName FROM Customers WHERE CustomerID IN ('ALFKI', 'J8COM') COMMIT TRANSACTION SET TRANSACTION ISOLATION LEVEL READ COMMITTED BEGIN TRANSACTION UPDATE Customers SET CompanyName = 'Alfreds Futterkiste' WHERE CustomerID = 'ALFKI' DELETE FROM Customers WHERE CustomerID = 'J8COM' SELECT CustomerID, CompanyName FROM Customers WHERE CustomerID IN ('ALFKI', 'J8COM') COMMIT TRANSACTION Hnh 14.2 Trnh by script TransactionIsolation.sql ang chy trong Query Analyzer. Trong vung nhng kt qu mt na phn di ca Query Analyzer, hai tp hp u tin ca nhng hng c sinh ra bi transaction u tin, v mt hng n cui cng c pht sinh bi transaction th hai.

Hnh 14.2: Sript TransactionIsolation.sql ang chy trong Query Analyzer.

t mc c lp giao dch ca mt i tng SqlTransaction


Cng vi vic t mc c lp giao dch ca mt i tng SqlTransaction, bn s thy mt v d cho thy hiu ng ca nhng mc khc nhau c thit t mt chng trnh C# . Bn to ra mt i tng SqlTransaction bi s gi phng thc BeginTransaction() ca i tng SqlConnection. Phng thc ny b qu ti nh sau: SqlTransaction BeginTransaction() SqlTransaction BeginTransaction(IsolationLevel myIsolationLevel) SqlTransaction BeginTransaction(string transactionName) SqlTransaction BeginTransaction(IsolationLevel myIsolationLevel, string transactionName) VI: myIsolationLevel: ch r mc c lp giao dch ca bn. y l mt hng s t lit k System.Data.IsolationLevel , cho nhng thnh vin c ch nh trc trong Bng 14.4. transactionName ch r mt chui cha tn bn mun gn ti giao dch ca cc bn. Trong nhng v d trong mc ny, gi thit bn c mt SqlConnection m c tn mySqlConnection m c ni ti c s d liu Northwind SQL server. V d sau y to ra mt SqlTransaction c tn serializableTrans bi s gi phng thc BeginTransaction() ca mySqlConnection; ch IsolationLevel ca Serializable c chuyn cho BeginTransaction(): SqlTransaction serializableTrans = mySqlConnection.BeginTransaction(IsolationLevel.Serializable); V d k tip to ra mt SqlCommand c tn serializableCommand, v t thuc tnh Transaction ca n ti serializableTrans: SqlCommand serializableCommand = mySqlConnection.CreateCommand(); serializableCommand.Transaction = serializableTrans;

Bt k cu lnh SQL no c thc hin s dng serializableCommand by gi s s dng serializableTrans, v bi vy s c thc hin trong mt serializable transaction. V d sau thc hin mt pht biu INSERT thm mt hng vo bng Customers : serializableCommand.CommandText = "INSERT INTO Customers ("+ "CustomerID, CompanyName "+ ") VALUES ("+ "'J8COM', 'J8 Company' "+ ")"; int numberOfRows = serializableCommand.ExecuteNonQuery(); V d k tip thc hin mt pht biu Cp nht serializableCommand.CommandText = "UPDATE Customers "+ "SET CompanyName = 'Widgets Inc.' "+ "WHERE CustomerID = 'ALFKI'"; numberOfRows = serializableCommand.ExecuteNonQuery(); Cui cng, v d sau y giao ph nhng pht biu UPDATE v INSERT bi s gi phng thc Commit() ca erializableTrans: serializableTrans.Commit(); Danh sch 14.4 cho thy mt chng trnh cha nhng phng thc sau y: DisplayRows() chn v hin th bt k hng no t bng Customers vi mt CustomerID l ALFKI hay J8COM. PerformSerializableTransaction() Thc hin m c trnh by trc trong mc ny to ra mt i tng SqlTransaction vi mt mc c lp l Serializable, v s dng n thc hin mt pht biu INSERT v UPDATE. PerformReadCommittedTransaction() To ra mt i tng SqlTransaction vi mt mc c lp l ReadCommitted, V s dng n thc hin nhng pht biu Cp nht v Xa. Danh sch 14.4: TransactionIsolation.cs /* TransactionIsolation.cs illustrates how to set the transaction isolation level */ using System; using System.Data; using System.Data.SqlClient; class TransactionIsolation { public static void DisplayRows( SqlCommand mySqlCommand ) { mySqlCommand.CommandText = "SELECT CustomerID, CompanyName "+ "FROM Customers "+

"WHERE CustomerID IN ('ALFKI', 'J8COM')"; SqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader(); while (mySqlDataReader.Read()) { Console.WriteLine("mySqlDataReader[\" CustomerID\"] = "+ mySqlDataReader["CustomerID"]); Console.WriteLine("mySqlDataReader[\" CompanyName\"] = "+ mySqlDataReader["CompanyName"]); } mySqlDataReader.Close(); } public static void PerformSerializableTransaction( SqlConnection mySqlConnection ) { Console.WriteLine("\nIn PerformSerializableTransaction()"); // create a SqlTransaction object and start the transaction // by calling the BeginTransaction() method of the SqlConnection // object, passing the IsolationLevel of Serializable to the method SqlTransaction serializableTrans = mySqlConnection.BeginTransaction(IsolationLevel.Serializable); // create a SqlCommand and set its Transaction property // to serializableTrans SqlCommand serializableCommand = mySqlConnection.CreateCommand(); serializableCommand.Transaction = serializableTrans; // call the DisplayRows() method to display rows from // the Customers table DisplayRows(serializableCommand); // insert a new row into the Customers table Console.WriteLine("Inserting new row into Customers table "+ "with CustomerID of J8COM"); serializableCommand.CommandText = "INSERT INTO Customers ("+ "CustomerID, CompanyName "+ ") VALUES ("+ "'J8COM', 'J8 Company' "+ ")"; int numberOfRows = serializableCommand.ExecuteNonQuery(); Console.WriteLine("Number of rows inserted = "+ numberOfRows); // update a row in the Customers table Console.WriteLine("Setting CompanyName to 'Widgets Inc.' for "+ "row with CustomerID of ALFKI"); serializableCommand.CommandText = "UPDATE Customers "+ "SET CompanyName = 'Widgets Inc.' "+ "WHERE CustomerID = 'ALFKI'"; numberOfRows = serializableCommand.ExecuteNonQuery(); Console.WriteLine("Number of rows updated = "+ numberOfRows); DisplayRows(serializableCommand); // commit the transaction

serializableTrans.Commit(); } public static void PerformReadCommittedTransaction( SqlConnection mySqlConnection ) { Console.WriteLine("\nIn PerformReadCommittedTransaction()"); // create a SqlTransaction object and start the transaction // by calling the BeginTransaction() method of the SqlConnection // object, passing the IsolationLevel of ReadCommitted to the method // (ReadCommitted is actually the default) SqlTransaction readCommittedTrans = mySqlConnection.BeginTransaction(IsolationLevel.ReadCommitted); // create a SqlCommand and set its Transaction property // to readCommittedTrans SqlCommand readCommittedCommand = mySqlConnection.CreateCommand(); readCommittedCommand.Transaction = readCommittedTrans; // update a row in the Customers table Console.WriteLine("Setting CompanyName to 'Alfreds Futterkiste' "+ "for row with CustomerID of ALFKI"); readCommittedCommand.CommandText = "UPDATE Customers "+ "SET CompanyName = 'Alfreds Futterkiste' "+ "WHERE CustomerID = 'ALFKI'"; int numberOfRows = readCommittedCommand.ExecuteNonQuery(); Console.WriteLine("Number of rows updated = "+ numberOfRows); // delete the new row from the Customers table Console.WriteLine("Deleting row with CustomerID of J8COM"); readCommittedCommand.CommandText = "DELETE FROM Customers "+ "WHERE CustomerID = 'J8COM'"; numberOfRows = readCommittedCommand.ExecuteNonQuery(); Console.WriteLine("Number of rows deleted = "+ numberOfRows); DisplayRows(readCommittedCommand); // commit the transaction readCommittedTrans.Commit(); } public static void Main() { SqlConnection mySqlConnection = new SqlConnection( "server=localhost;database=Northwind;uid=sa;pwd=sa" ); mySqlConnection.Open(); PerformSerializableTransaction(mySqlConnection); PerformReadCommittedTransaction(mySqlConnection); mySqlConnection.Close(); } }

u ra t chng trnh ny nh sau: In PerformSerializableTransaction() mySqlDataReader["CustomerID"] = ALFKI mySqlDataReader["CompanyName"] = Alfreds Futterkiste Inserting new row into Customers table with CustomerID of J8COM Number of rows inserted = 1 Setting CompanyName to 'Widgets Inc.' for row with CustomerID of ALFKI Number of rows updated = 1 mySqlDataReader["CustomerID"] = ALFKI mySqlDataReader["CompanyName"] = Widgets Inc. mySqlDataReader["CustomerID"] = J8COM mySqlDataReader["CompanyName"] = J8 Company In PerformReadCommittedTransaction() Setting CompanyName to 'Alfreds Futterkiste' for row with CustomerID of ALFKI Number of rows updated = 1 Deleting row with CustomerID of J8COM Number of rows deleted = 1 mySqlDataReader["CustomerID"] = ALFKI mySqlDataReader["CompanyName"] = Alfreds Futterkiste

Tm hiu nhng s kha SQL server


SQL Server s dng nhng s kha thc hin c lp giao dch v bo m thng tin c ct gi chc chn trong mt c s d liu .Nhng s kha ngn nga mt ngi s dng c hay thay i mt hng m ang c thay i bi mt ngi s dng khc. V d, khi bn cp nht mt hng, mt s kha hng c t trn hng ngn nga ngi s dng khc cp nht hng cng mt thi im.

Nhng kiu kha ca SQL Server


My ch phc v SQL s dng nhiu kiu kha, Mt s trong c trnh by trong Bng 14.5. Bng ny trnh by nhng s kha trong th t tng dn ca ht kha, n tham chiu ti kch thc ca ngun ti nguyn s b kha. Chng hn, mt s kha hng c mt ht tinh luyn hn so vi mt s kha trang. Bng 14.5: nhng kiu kha ca my ch phc v SQL Kiu kha Row (RID) Key (KEY) M t c t ln mt hng trong mt bng. Thay th cho nh danh hng. Thng dng xc nh mt hng duy nht. c t ln mt hng bn trong mt ch s. Dng bo v nhng phm vi ca kha trong serializable transactions. c t trn mt phm vi, mt nhm k nhau ca 8 D liu hay nhng trang ch s

Page (PAG) c t trn mt trang, c cha 8 KB hng hay ch s d liu. Extent (EXT) Database (DB)

Table (TAB) t trn mt bng v kha tt c nhng hng v nhng ch s trong bng ny. Dng kha ton b c s d liu khi ngi qun tr c s d liu t n vo trong kiu ngi s dng n cho s bo tr.

Nhng kiu kha ca my ch phc v SQL

My ch phc v SQL s dng nhng kiu kha khc nhau xc nh mc kha t trn ngun ti nguyn. Nhng kiu kha ny c trnh by trong Bng 14.6. Bn s thy nhng kiu kha ny trong mc k tip. Bng 14.6: nhng kiu kha ca my ch phc v SQL Kiu kha Shared (S) M t Ch nh mt giao dch s c t ngun ti nguyn s dng mt pht biu SELECT. Ngn nga nhng giao dch khc sa i ngun ti nguyn c kha. Mt s kha dng chung c th t do ngay khi d liu c c- tr phi mc c lp giao dch c t ti REPEATABLE READ hay SERIALIZABLE. Ch r mt giao dch nh sa i mt ngun ti nguyn s dng mt pht biu INSERT, UPDATE, hay DELETE. S kha phi c tng ti mt s kha dnh ring trc khi giao dch tht s thc hin s sa i. Cho php giao dch sa i ngun ti nguyn s dng mt pht biu INSERT, UPDATE, hay DELETE . Khng c giao dch no khc c th c t hay vit ti mt ngun ti nguyn m trn mt s kha dnh ring c t.

Update (U)

Exclusive (X)

Intent shared (IS) Ch r l giao dch nh t mt kha dng chung trn mt s ngun ti nguyn ti mt mc tt hn bn trong ti nguyn . Chng hn, s t mt kha IS trn mt bng ch bo rng giao dch nh t mt kha dng chung trn mt s nhng trang hay nhng hng bn trong bng ny. Khng c giao dch no khc c th t mt kha ring trn mt ngun ti nguyn m c mt kha IS trn n. Intent exclusive (IX) Shared with intent exclusive (SIX) Ch bo rng giao dch nh t mt kha ring trn mt ngun ti nguyn vi mt mc ht tt hn. Khng c giao dch no khc c th t mt kha ring trn mt ngun ti nguyn m c mt kha IX trn n. Ch bo rng giao dch nh c tt c nhng ngun ti nguyn c mt lng ht tt hn v sa i mt s ti nguyn . Chng hn, vic t mt kha SIX trn mt bng cho bit giao dch nh c tt c nhng hng trong bng ny v sa i mt s trong nhng hng . Khng c giao dch no khc c th t mt kha ring trn mt ngun ti nguyn m c mt kha SIX trn n. Ch bo rng mt pht biu ngn ng nh ngha d liu (Data Definition Language _DDL) s c thc hin trn mt ngun ti nguyn m hnh, chng hn, DROP TABLE. Khng c giao dch no khc c th t mt s kha trn mt ti nguyn m c mt kha Sch- M trn n. Ch bo rng mt cu lnh SQL m s dng ngun ti nguyn, sp sa c thc hin, nh mt pht biu SELECT chng hn. Nhng giao dch khc c th t mt kha trn mt ti nguyn m c mt kha Sch- S trn n; ch mt s kha ci bin m hnh b ngn cn.

Schema modification (Sch-M) Schema stability (Sch-S)

Bulk update (BU) Ch bo rng mt thao tc sao chp khi lng ln ti nhng hng vo trong mt bng s c thc hin. Mt kha cp nht khi lng ln cho php nhng qu trnh khc ti khi d liu _sao chp d liu ng thi vo trong cng mt bng , nhng cn tr nhng qu trnh khc m khng phi l d liu sao chp khi ln truy nhp vo bng. thm thng tin v d liu sao chp khi ln ti mt bng, xem nhng sch ti liu trc tuyn My ch phc v SQL.

Xem thng tin v kha my ch phc v SQL


Bn c th xem thng tin v kha trong mt c s d liu s dng SQL Server Enterprise Manager. Bn m th mc Management, m nt Current Activity (hot ng hin thi), ri m nt Locks/Process ID hoc nhng nt Locks/Object . nt Locks/Process ID cho bn thy nhng kha c t bi mi Qu trnh; mi qu trnh c mt s SPID m c gn bi SQL Server xc nh qu trnh. nt Locks/Object cho bn thy nhng kha c t trn mi ngun ti nguyn bi tt c cc qu trnh. Mo nh: Bn cng c th cng xem thng tin v kha bi vic thc thi th tc lu tr sp_lock , mc d Enterprise Manager t chc thng tin trong mt nh dng d c hn.

Gi thit bn bt u giao dch sau (th d, s dng Query Analyzer) vi nhng cu lnh T - SQL sau y: USE Northwind BEGIN TRANSACTION UPDATE Customers SET CompanyName = 'Widgets Inc.' WHERE CustomerID = 'ALFKI' Vic ny t mt kha dng chung trn c s d liu Northwind v mt s kha trn bng Customers, m bn c th xem- s dng Enterprise Manager . Hnh 14.3 cho thy rng nhng s kha ny s dng nhng nt Locks/ Process ID ca Enterprise Manager. SPID = 51 tng ng vi Query Analyzer ni ti chy nhng cu lnh TSQLT trc y. Nh bn c th thy t hnh ny, mt s kha c t bi nhng cu lnh T-SQL trc .

Hnh 14.3: vic xem nhng kha s dng nt Locks/ Process ID ca Enterprise Manager. hi nguyn giao dch trc y, thc hin cu lnh T-SQL sau y: ROLLBACK TRANSACTION th t do cho nhng kha, thc hin cu lnh T- SQLsau y: COMMIT TRANSACTION Thng tin trong khung bn phi ca Hnh 14.3 trnh by nhng kha, v thng tin ny c chia vo trong nhng ct sau y: Object i tng s b kha. Lock Type Kiu kha, tng ng vi mt trong s nhng kiu c ch ra trc trong Bng 14.5. Mode ch kha, tng ng ti mt trong s nhng ch kha c ch ra trc trong Bng 14.6. Tatus Tnh trng kha, l GRANT (kha c cp pht thnh cng ), CNVT (kha c chuyn

i), hay WAIT(i kha). Owner kiu kha ch s hu, nh Sess (kha phin ) hay Xact (kha giao dch). Index tn ca ch s s c kha (nu c). Resource t nh danh ti nguyn ca i tng s b kha (nu c).

Kha Giao dch


Mt giao dch c th ngn giao dch khc thu mt kha trn mt ti nguyn. Chng hn, chng ta hy cho l bn bt u mt giao dch s dng T -SQL sau, n ng nht vi T- SQL trong mc trc : USE Northwind BEGIN TRANSACTION UPDATE Customers SET CompanyName = 'Widgets Inc.' WHERE CustomerID = 'ALFKI' Nh bn thy trong mc trc y, n t mt s kha trn nhng i tng Customers. Nu bn th cp nht cng mt hng - m khng kt thc giao dch trc - s dng nhng cu lnh T-SQL sau y: USE Northwind UPDATE Customers SET CompanyName = 'Alfreds Futterkiste' WHERE CustomerID = 'ALFKI' ri Cp nht ny s i cho n khi giao dch trc han tt vic giao ph hay hi nguyn. Hnh 14.4 cho thy rng hai giao dch ny c bt u trong Query Analyzer. Giao dch u tin, c trnh by trong phn trn ca Hnh 14.4 , ang kha giao dch th hai trong phn di.

Hnh 14.4: giao dch trn phn trn ang kha giao dch trong phn di giao ph giao dch trc v th t do cho nhng kha cho giao dch u tin, bn c th thc hin cu lnh TSQLsau y:

COMMIT TRANSACTION iu ny cho php Cp nht th hai (hin th phn di ca Query Analyzer) ly kha thch hp Cp nht hng v tin hnh, nh trnh by trong Hnh 14.5

Hnh 14.5: Mt khi giao dch phn trn c giao ph, s Cp nht phn di tin hnh.

Gn Timeout cho kha


Theo mc nh, mt cu lnh SQL s i n v tn nhn mt kha. Bn c th thay i iu ny bi vic thc thi lnh LOCK_TIMEOUT. Chng hn, lnh sau y t kha timeout ti 1 giy (1.000 mili-giy) SET LOCK_TIMEOUT 1000 Nu mt cu lnh SQL phi i lu hn 1 giy, my ch phc v SQL s tr v mt li v hy b cu lnh SQL. Bn cng c th thc thi lnh SET LOCK_TIMEOUT trong m C#. Chng hn: mySqlCommand.CommandText = "SET LOCK_TIMEOUT 1000"; mySqlCommand.ExecuteNonQuery(); Bn s thy s s dng lnh SET LOCK_TIMEOUT trong mc k tip.

Blocking v Serializable/Repeatable Read Transactions


Serializable v repeatable read transactions kha nhng hng m chng ang truy xut, nh th nhng giao dch khc khng th cp nht nhng hng . Serializable v repeatable read transactions lm iu ny nhng hng khng b thay i sau khi chng c. V d, nu bn chn hng t bng Customers vi mt CustomerID l ALFKI s dng mt serializable transaction, ri n lc cp nht hng ny s dng Transaction th hai, th Transaction th hai s b kha. N b kha v serializable transaction kha hng c truy xut v Transaction th hai khng th ly mt kha trn

hng ny. Danh sch 14.5 cho thy mt v d v iu ny. Transaction th hai gn kha timeout ti 1 giy. C ngha l chng trnh s nm ra mt SqlException n gin hn l treo my khi Transaction th hai khng th lm ch mt kha trn hng ALFKI trong bng Customers . Danh sch 14.5: Block.c /* Block.cs illustrates how a serializable command locks the rows it retrieves so that a second transaction cannot get a lock to update one of these retrieved rows that has already been locked */ using System; using System.Data; using System.Data.SqlClient; class Block { public static void DisplayRows( SqlCommand mySqlCommand ) { mySqlCommand.CommandText = "SELECT CustomerID, CompanyName "+ "FROM Customers "+ "WHERE CustomerID IN ('ALFKI', 'J8COM')"; SqlDataReader mySqlDataReader = mySqlCommand.ExecuteReader(); while (mySqlDataReader.Read()) { Console.WriteLine("mySqlDataReader[\" CustomerID\"] = "+ mySqlDataReader["CustomerID"]); Console.WriteLine("mySqlDataReader[\" CompanyName\"] = "+ mySqlDataReader["CompanyName"]); } mySqlDataReader.Close(); } public static void Main() { // create and open two SqlConnection objects SqlConnection serConnection = new SqlConnection( "server=localhost;database=Northwind;uid=sa;pwd=sa" ); SqlConnection rcConnection = new SqlConnection( "server=localhost;database=Northwind;uid=sa;pwd=sa" ); serConnection.Open(); rcConnection.Open(); // create the first SqlTransaction object and start the transaction // by calling the BeginTransaction() method of the SqlConnection // object, passing the IsolationLevel of Serializable to the method

SqlTransaction serializableTrans = serConnection.BeginTransaction(IsolationLevel.Serializable); // create a SqlCommand and set its Transaction property // to serializableTrans SqlCommand serializableCommand = serConnection.CreateCommand(); serializableCommand.Transaction = serializableTrans; // call the DisplayRows() method to display rows from // the Customers table; // this causes the rows to be locked, if you comment // out the following line then the INSERT and UPDATE // performed later by the second transaction will succeed DisplayRows(serializableCommand); // * // create the second SqlTransaction object SqlTransaction readCommittedTrans = rcConnection.BeginTransaction(IsolationLevel.ReadCommitted); // create a SqlCommand and set its Transaction property // to readCommittedTrans SqlCommand readCommittedCommand = rcConnection.CreateCommand(); readCommittedCommand.Transaction = readCommittedTrans; // set the lock timeout to 1 second using the // SET LOCK_TIMEOUT command readCommittedCommand.CommandText = "SET LOCK_TIMEOUT 1000"; readCommittedCommand.ExecuteNonQuery(); try { // insert a new row into the Customers table Console.WriteLine("Inserting new row into Customers table "+ "with CustomerID of J8COM"); readCommittedCommand.CommandText = "INSERT INTO Customers ("+ "CustomerID, CompanyName "+ ") VALUES ( " + " 'J8COM', 'J8 Company' "+ ")"; int numberOfRows = readCommittedCommand.ExecuteNonQuery(); Console.WriteLine("Number of rows inserted = "+ numberOfRows); // update the ALFKI row in the Customers table Console.WriteLine("Setting CompanyName to 'Widgets Inc.' for "+ "for row with CustomerID of ALFKI"); readCommittedCommand.CommandText = "UPDATE Customers "+ "SET CompanyName = 'Widgets Inc.' "+ "WHERE CustomerID = 'ALFKI'"; numberOfRows = readCommittedCommand.ExecuteNonQuery(); Console.WriteLine("Number of rows updated = "+ numberOfRows); // display the new rows and rollback the changes DisplayRows(readCommittedCommand);

Console.WriteLine("Rolling back changes"); readCommittedTrans.Rollback(); } catch (SqlException e) { Console.WriteLine(e); } finally { serConnection.Close(); rcConnection.Close(); } } } Cnh bo: Nu bn bin dch v chy chng trnh ny nh n c, th n s nm mt SqlException. y l s c nh trc, nh n cho bn thy s n lc ly mt kha time out. Nu bn chuyn lnh gi u tin ti phng thc DisplayRows() thnh mt ghi ch trong chng trnh ny [ nh du vi mt du sao (*)], th chng trnh s khng nm ra mt SqlException. V y l ghi ch (lnh gi u tin ti DisplayRows() )n tch serializable transaction khi vic truy xut v do kha nhng hng. v Transaction th hai c th ly kha trn hng ALFKI. u ra t chng trnh ny nh sau (ch n nm ra mt SqlException khi vt qu thi gian timeout ca kha ): mySqlDataReader["CustomerID"] = ALFKI mySqlDataReader["CompanyName"] = Alfreds Futterkiste Inserting new row into Customers table with CustomerID of J8COM System.Data.SqlClient.SqlException: Lock request time out period exceeded. at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, TdsParserState state) at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, TdsParserState state) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.SqlClient.TdsParser.Run(RunBehavior run, SqlCommand cmdHandler, SqlDataReader dataStream) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at Block.Main() Th chuyn thnh ghi ch an lnh gi u tin ti DisplayRows() trong chng trnh, v sau bin dch li v chy n ln na. Ln ny giao dch th hai s c kh nng ly kha trn hng v tin hnh.

Nhng b tc
Mt s b tc xut hin khi hai giao dch ang i nhng kha m giao dch khc hin thi c. Xem xt hai giao dch sau: Transaction 1 (T1): BEGIN TRANSACTION UPDATE Customers SET CompanyName = 'Widgets Inc.' WHERE CustomerID = 'ALFKI' UPDATE Products SET ProductName = 'Widget'

WHERE ProductID = 1 COMMIT TRANSACTION Transaction 2 (T2): BEGIN TRANSACTION UPDATE Products SET ProductName = ' Chai' WHERE ProductID = 1 UPDATE Customers SET CompanyName = ' Alfreds Futterkiste' WHERE CustomerID = 'ALFKI' COMMIT TRANSACTION Ch : c T1 ln T2 u cp nht cng nhng hng nh nhau trong bng Customers v Products. Nu T1 v T2 c thc thi k tip nhau vo nhng thi gian khc nhau, T1 c thc hin ri hon thnh, theo sau l T2, th khng c s c g. Tuy nhin, nu T1 v T2 c thc hin cng lc vi nhng s pht biu Cp nht ca chng , th mt s b tc xut hin. Hy xem xt mt v d v iu ny, s dng nhng bc sau y: 1. T1 bt u. 2. T2 bt u. 3. T1 kha hng Customers v cp nht hng. 4. T2 kha hng Products v cp nht hng. 5. T2 i kha trn hng Products, m hin thi c gi bi T1. 6. T1 i kha trn hng Customers, m hin thi c gi bi T2. Trong bc 5, T2 i mt kha gi bi T1. Trong bc 6, T1 i mt kha gi bi T2. Nh vy, mt s b tc xut hin khi c hai giao dch ang i ln nhau. C hai giao dch gi qua li nhng kha yu cu. My ch phc v SQL s pht hin ra b tc v hi nguyn mt trong s nhng giao dch. My ch phc v SQL hi nguyn nhng giao dch r nht hu, v cng tr v mt li cho bit mt b tc xut hin. Bn cng c th chn giao dch m s c hi nguyn s dng lnh T- SQL SET DEADLOCK_ PRIORITY, n s dng c php sau y: SET DEADLOCK_PRIORITY { LOW | NORMAL | @variable } VI: LOW: ch bo giao dch c mt quyn u tin thp v l ci hi nguyn trong s kin b tc. NORMAL: ch bo rng quy tc mc nh ang c p dng, c ngha giao dch t t nht c hi nguyn. @variable : l mt bin k t T- SQL bn gn l 3 cho LOW hoc 6 cho NORMAL. Chng hn, lnh sau y gn DEADLOCK_PRIORITY ti LOW SET DEADLOCK_PRIORITY LOW Bn cng c th thc thi lnh SET DEADLOCK_PRIORITY trong m C#. Chng hn: t2Command.CommandText = "SET DEADLOCK_PRIORITY LOW"; t2Command.ExecuteNonQuery();

Mo nh Bn c th gim bt nguy c v mt s b tc xut hin trong chng trnh ca bn bi vic gi nhng giao dch ca cc bn cng ngn cng tt; bng cch ny, nhng kha c gi trong nhng i tng c s d liu trong thi gian ngn nht c th. Bn cng cn phi truy cp nhng bng trong cng mt th t nh vy khi thc thi nhiu giao dch cng lc; bng cch ny, bn gim bt nguy c v giao dch gi qua li nhng kha yu cu. Danh sch 14.6 cho thy mt chng trnh minh ha hai giao dch T1 v T2 lm b tc trong s kin c m t trc . Mi s Cp nht c thc hin s dng mt lung ring bit m phng nhng s Cp nht c trnh by trong su bc trc. Danh sch 14.6: Deadlock.c /* Deadlock.cs illustrates how two transactions can deadlock each other */ using System; using System.Data; using System.Data.SqlClient; using System.Threading; class Deadlock { // create two SqlConnection objects public static SqlConnection t1Connection = new SqlConnection( "server=localhost;database=Northwind;uid=sa;pwd=sa" ); public static SqlConnection t2Connection = new SqlConnection( "server=localhost;database=Northwind;uid=sa;pwd=sa" ); // declare two SqlTransaction objects public static SqlTransaction t1Trans; public static SqlTransaction t2Trans; // declare two SqlCommand objects public static SqlCommand t1Command; public static SqlCommand t2Command; public static void UpdateCustomerT1() { // update the row with a CustomerID of ALFKI // in the Customers table using t1Command Console.WriteLine("Setting CompanyName to 'Widgets Inc.' "+ "for row with CustomerID of ALFKI using t1Command"); t1Command.CommandText = "UPDATE Customers "+ "SET CompanyName = 'Widgets Inc.' "+ "WHERE CustomerID = 'ALFKI'"; int numberOfRows = t1Command.ExecuteNonQuery(); Console.WriteLine("Number of rows updated = "+ numberOfRows); } public static void UpdateProductT2()

{ // update the row with a ProductID of 1 // in the Products table using t2Command Console.WriteLine("Setting ProductName to 'Widget' "+ "for the row with ProductID of 1 using t2Command"); t2Command.CommandText = "UPDATE Products "+ "SET ProductName = 'Widget' "+ "WHERE ProductID = 1"; int numberOfRows = t2Command.ExecuteNonQuery(); Console.WriteLine("Number of rows updated = "+ numberOfRows); } public static void UpdateProductT1() { // update the row with a ProductID of 1 // in the Products table using t1Command Console.WriteLine("Setting ProductName to 'Chai' "+ "for the row with ProductID of 1 using t1Command"); t1Command.CommandText = "UPDATE Products "+ "SET ProductName = 'Chai' "+ "WHERE ProductID = 1"; int numberOfRows = t1Command.ExecuteNonQuery(); Console.WriteLine("Number of rows updated = "+ numberOfRows); } public static void UpdateCustomerT2() { // update the row with a CustomerID of ALFKI // in the Customers table using t2Command Console.WriteLine("Setting CompanyName to 'Alfreds Futterkiste' "+ "for row with CustomerID of ALFKI using t2Command"); t2Command.CommandText = "UPDATE Customers "+ "SET CompanyName = 'Alfreds Futterkiste' "+ "WHERE CustomerID = 'ALFKI'"; int numberOfRows = t2Command.ExecuteNonQuery(); Console.WriteLine("Number of rows updated = "+ numberOfRows); } public static void Main() { // open the first connection, begin the first transaction, // and set the lock timeout to 5 seconds t1Connection.Open(); t1Trans = t1Connection.BeginTransaction(); t1Command = t1Connection.CreateCommand(); t1Command.Transaction = t1Trans; t1Command.CommandText = "SET LOCK_TIMEOUT 5000"; t1Command.ExecuteNonQuery(); // open the second connection, begin the second transaction, // and set the lock timeout to 5 seconds t2Connection.Open(); t2Trans = t2Connection.BeginTransaction(); t2Command = t2Connection.CreateCommand();

t2Command.Transaction = t2Trans; t2Command.CommandText = "SET LOCK_TIMEOUT 5000"; t2Command.ExecuteNonQuery(); // set DEADLOCK_PRIORITY to LOW for the second transaction // so that it is the transaction that is rolled back t2Command.CommandText = "SET DEADLOCK_PRIORITY LOW"; t2Command.ExecuteNonQuery(); // create four threads that will perform the interleaved updates Thread updateCustThreadT1 = new Thread(new ThreadStart(UpdateCustomerT1)); Thread updateProdThreadT2 = new Thread(new ThreadStart(UpdateProductT2)); Thread updateProdThreadT1 = new Thread(new ThreadStart(UpdateProductT1)); Thread updateCustThreadT2 = new Thread(new ThreadStart(UpdateCustomerT2)); // start the threads to actually perform the interleaved updates updateCustThreadT1.Start(); updateProdThreadT2.Start(); updateProdThreadT1.Start(); updateCustThreadT2.Start(); } } Ghi ch: Bn c th ngh v mt lung nh mt qu trnh ring bit trong chng trnh ca bn, v mi lung xut hin thc hin trong ng song song vi nhng lung khc.V mt tho lun chi tit ca nhng lung, xem cun sch "Mastering Visual C# .NET" do Jason Price v Mike Gunderloy ( Sybex, 2002). Chng trnh trnh by trong Danh sch 14.6 cha nhng phng thc sau y: UpdateCustomerT1() Cp nht hng vi mt CustomerID l ALFKI trong bng Customers s dng giao dch u tin. c bit, n t CompanyName ti Widgets Inc. UpdateProductT2() Cp nht hng vi mt ProductID l 1 trong bng Products s dng giao dch th hai. c bit, n t ProductName ti Widget. UpdateProductT1() Cp nht hng vi ProductID l 1 trong bng Products s dng s giao dch u tin. c bit, n t ProductName ti Chai. UpdateCustomerT2() Cp nht hng vi mt CustomerID l ALFKI trong bng Customers s dng giao dch th hai. c bit n t CompanyName ti Alfreds Futterkiste. Nhng phng thc ny s c gi bi nhng lung thc hin cp nht c t xen k. Ghi ch Chng trnh ny ch bo giao dch th hai s c hi nguyn khi s b tc xut hin s dng lnh SET DEADLOCK_PRIORITY LOW. u ra ca chng trnh ny nh sau: Setting CompanyName to 'Widgets Inc.' for row with CustomerID of ALFKI using t1Command Number of rows updated = 1 Setting ProductName to 'Widget' for the row with ProductID of 1 using t2Command Number of rows updated = 1 Setting ProductName to 'Chai' for the row

with ProductID of 1 using t1Command Setting CompanyName to 'Alfreds Futterkiste' for row with CustomerID of ALFKI using t2Command Ngoi l Unhandled ( khng s l c): System.Data.SqlClient.SqlException: Giao dch ( ID Qu trnh 53) b b tc trn {s kha} nhng ti nguyn vi qu trnh khc v c la chn nh nn nhn b tc. chy li giao dch. Ti System.Data.SqlClient.SqlConnection.OnError(ngoi l,Trng thi TdsParserState) Ti System.Data.SqlClient.SqlInternalConnection.OnError(ngoi l,Trng thi TdsParserState) ti System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() ti System.Data.SqlClient.TdsParser.Run(S chy RunBehavior, cmdHandler SqlCommand Dng d liu SqlDataReader) Ti System.Data.SqlClient.SqlCommand.ExecuteNonQuery() Ti Deadlock.UpdateCustomerT2() Number of rows updated = 1

Tm lc
Ngy nay, nhng c s d liu c th x l nhiu ngi s dng v nhng chng trnh truy cp c s d liu ti cng thi im, mi ci chy mt cch tim tng nhng giao dch ca chng trong c s d liu. Phn mm c s d liu phi c kh nng tha mn nhng nhu cu ca tt c nhng giao dch trng hp ny, cng nh bo tr s ton vn ca nhng hng c ct gi trong nhng bng c s d liu. Bn c th kim sot lng c lp tn ti gia nhng giao dch ca bn v nhng giao dch khc m c l ang c chy trong c s d liu. Trong chng ny, bn i su vo trong iu khin giao dch tin tin s dng My ch phc v SQL v ADO.NET. c bit, bn thy cch thit t mt savepoint, hi nguyn mt giao dch n savepoint ny, v t mc c lp giao dch. Bn cng hc v nhng kha ca my ch phc v SQL v nhng giao dch c th kha v gy b tc ln nhau nh th no. Trong chng k tip, bn s hc v XML.

CHUNG 15: GII THIU V NHNG NG DNG WEB-ASP.NET Tng quan


Nhng trang My ch phc v hat ng cho mng (ASP.NET) cho php bn to ra nhng trang Web ng vi ni dung c th thay i trong thi gian chy v pht trin nhng ng dng truy cp c, s dng mt trnh duyt Web (Web browser). v d, bn c th pht trin mt ng dng thng mi in t cho php nhng ngi s dng t mua nhng sn phm qua Mng, hay mt ng dng thng mi c phn, iu cho php nhng ngi s dng t nhng nhng c phiu thng mi trong nhng cng ty. ASP.NET c nhn thc tng t nh nhng trang JavaServer i th ca n (JSP) trong bn i hi mt trang t mt My ch phc v, s dng mt trnh duyt Web, v my ch phc v p ng bi vic chy trang ASP.NET.Ri My ch phc v gi tr HTML c hin th trong trnh duyt ca bn. Trong chng ny bn s hc c s ca ASP.NET, v bn s thy cch s dng Visual Studio .NET nh th no to ra nhng ng dng ASP.NET s dng C# lm ngn ng lp trnh. Nhng c trng trong chng ny:

To ra nhng ng dng Web ASP.NET Nhng iu khin Web form S dng nhng iu khin DataGrid v DataList truy cp mt c s d liu Bo tr trng thi trong mt ng dng Mng To ra mt ng dng mua hng n gin

TO MT TRNH NG DNG WEB ASP.NET N GIN S DNG VS.NET


Trong mc ny, bn s thy cch to ra mt ng dng Web ASP .NET n gin cha mt ci hp vn bn v mt nt- s dng VS .NET. Khi bn nhn nt, mt chui vn bn s xut hin trong hp vn bn ca bn. Bn s hc cch trin khai ng dng ny ti my ch phc v thng tin Internet ca Microsoft (IIS) nh th no. Bn cng s thy cch chy ng dng Web v d t Internet Explorer. Ghi ch: IIS l phn mm cho php bn chy nhng ng dng Web ASP.NET v hin th nhng trang HTML. trin khai nhng ng dng ASP.NET trnh by trong chng ny, bn s cn truy cp ti mt my tnh c chy IIS, cng vi nhng m rng ca my ch phc v FrontPage. Nhng m rng ny cho php bn trin khai mt ng dng Web ASP.NET t Visual Studio .NET. Bn c th tm thy thng tin y v vic thit t IIS V nhng m rng ca my ch phc v FrontPage trong ti liu tr gip trc tuyn Windows; truy cp ti liu ny, chn Start - Help. Thc hin nhng bc sau y: 1. Khi ng Visual Studio .NET (VS .NET) v chn File - New Project. chn Visual C# Projects t vng Project Types bn tri hp thoi New Project, v chn ASP .NET Web Application t vng Templates area ( khung mu ) bn phi. nhp vo http: // Localhost/ MyWeb- Application trong Location field (trng nh v), nh trong Hnh 15.1.

Hnh 15.1: to ra mt ng dng Mng ASP.NET trong Visual Studio .NET Ghi nh: tn localhost i din cho my tnh a phng ca bn, trn bn ang pht trin ng dng Mng ca bn. Nu bn ang s dng IIS m ang chy trn mt my tnh khc vi my tnh a phng ca bn, bn cn phi thay th localhost vi tn ca my tnh t xa.

2. Kch nt Ok tip tc. VS.NET s to ra mt th mc mi c tn MyWebApplication trong th mc wwwroot; y l th mc ni IIS ct gi nhng trang Web v ng dng xut bn. Sau khi bn kch nt Ok, bn s thy ng dng mi ang c gi ti IIS. Mt khi ng dng ca bn c trin khai ti IIS, VS .NET s trnh by mt form Web trng. Bn c th hiu form Web nh tm vi bt m trn bn c th t nhng iu khin, thd nh nhng hp vn bn v nhng nt. V sau khi bn chy form ca bn, bn s thy trang ny c trnh by bi trnh duyt Web c t trong mt dng v tng t ti form ca cc bn. 3. Thm mt iu khin TextBox vo form ca bn. Gi tr ngm nh cho thuc tnh ID ca iu khin TextBox ca bn l TextBox1. Ghi nh: Bn s dng thuc tnh ID khi tham chiu mt iu khin web trong m C#. Bn s thy mt v d ca m th hin iu ny khng lu na. 4. Gn thuc tnh TextMode cho TextBox1 l MultiLine; iu ny cho php vn bn s c trnh by trn nhiu hng. Tip theo, thm mt iu khin Nt vo form . ID mc nh cho iu khin Nt l Button1. t thuc tnh Text cho Button1 l "Press me!" Hnh 15.2 cho thy form vi TextBox v nhng iu khin Button.

Hnh 15.2: Thm TextBox v nhng iu khin Button vo form 5. Tip theo, bn s thm mt hng m ti phng thc Button1_Click() . Phng thc ny c thc hin khi Button1 c nhn trong khi form chy. Pht biu m bn thm vo Button1_Click() s gn thuc tnh Text ca TextBox1 ti mt chui. Chui ny cha mt hng "Romeo and Juliet" ca Shakespeare . thm m, nhn p Button1 v nhp vo m sau y trong phng thc Button1_Click() : TextBox1.Text = "But, soft! what light through yonder window breaks?\n" + "It is the east, and Juliet is the sun.\n" + "Arise, fair sun, and kill the envious moon,\n" + "Who is already sick and pale with grief,\n" + "That thou her maid art far more fair than she"; Ghi ch: Nu bn l mt ngi hm m Shakespeare, bn s nhn ra nhng hng ny t cnh ban cng lng ly m trong Romeo tht ln tnh yu chn thnh ca anh y vi Juliet.

6. By gi bn sn sng chy form ca bn. Chn Debug - Start Without Debugging, hay nhn Ctrl+ F5 trn bn phm chy form ca bn (xem Hnh 15.3).

Hnh 15.3: Form ang chy By gi bn to c v chy form, chng ta hy kho st m c pht sinh bi VS .NET. C hai phn chnh vi m: File WebForm1.aspx , cha m HTML v ASP.NET . File WebForm1.aspx.cs , cha m C# h tr web form. Bn c th hiu m C# ny nh mt th s chy ng sau form, v v l do ny File WebForm1.aspx.cs c bit nh file sau m. Ghi nh: phn m rng .Aspx xc nh nhng file ASP .NET. Bn s kho st nhng chi tit ca WebForm1.aspx v file WebForm1.aspx.cs trong nhng mc sau y.

File WebForm1.aspx
Bn c th xem HTML cha chng nhn ASP.NET cho form ca bn bi vic kch chui lin kt HTML y ca ca s thit k form. Kch mi lin kt HTML xem m cho form ca bn. Danh sch 15.1 cho thy ni dung ca file WebForm1.aspx . Danh sch 15.1: WebForm1.aspx <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="MyWebApplication.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta content="Microsoft Visual Studio 7.0" name="GENERATOR"> <meta content="C#" name="CODE_LANGUAGE"> <meta content="JavaScript" name="vs_defaultClientScript"> <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema"> </HEAD>

<body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:TextBox id="TextBox1" style="Z-INDEX: 101; LEFT: 13px; POSITION: absolute; TOP: 11px" runat="server" Width="386px" Height="212px" TextMode="MultiLine"></asp:TextBox> <asp:Button id="Button1" style="Z-INDEX: 102; LEFT: 17px; POSITION: absolute; TOP: 231px" runat="server" Width="82px" Height="22px" Text="Press Me!"></asp:Button> </form> </body> </HTML> Ghi nh : nhng gi tr chnh xc cho nhng v tr v nhng kch thc ca nhng iu khin trong m ca mnh c l hi khc so vi nhng g trnh by trong danh sch 15.1. Chng ta hy kho st nhng hng trong file ny. dng u tin l <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="MyWebApplication.WebForm1" %> Thuc tnh language cho bit file s dng ngn ng C#. Thuc tnh Codebehind cho bit file sau m h tr form, v trong trng hp ny, file sau m l Web- Form1.aspx.cs. Thuc tnh AutoEventWireUp cho bit liu khung framwork ASP .NET c t ng gi nhng phng thc x l s kin Page_Init() v Page_Load() hay khng . Nhng phng thc ny c nh ngha trong WebForm1.aspx.cs; bn s hc nhiu hn v nhng phng thc x l s kin ny khng lu na. Thuc tnh Inherits (k tha) ch r tn ca lp trong file WebForm1.aspx.cs t form tha k. Vi hng tip theo l HTML tiu chun n ch r u mc v meta-information m t file. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta content="Microsoft Visual Studio 7.0" name="GENERATOR"> <meta content="C#" name="CODE_LANGUAGE"> <meta content="JavaScript" name="vs_defaultClientScript"> <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema"> </HEAD> Hng k tip bt u thn ca file: Thuc tnh MS_POSITIONING cho bit nhng iu khin form c t trong mt li. Gii php cho GridLayout l LinearLayout, ch r l nhng iu khin form s c t ci ny sau ci khc trong trnh duyt. Hng k tip bt u mt form: <form id="Form1" method="post" runat="server"> Thuc tnh ID ch r tn ca form l Form1. Thuc tnh method (phng thc) ch bo form s dng mt thng bo cn thit HTTP gi thng tin cho my ch phc v. Thuc tnh runat ch r form c thc thi trn my ch phc v. Nhng hng k tip cha nhng chi tit ca iu khin TextBox m bn thm vo form ca bn

<asp:TextBox id="TextBox1" style="Z-INDEX: 101; LEFT: 13px; POSITION: absolute; TOP: 11px" runat="server" Width="386px" Height="212px" TextMode="MultiLine"></asp:TextBox> Nhng hng k tip cha nhng chi tit ca iu khin Nt m bn thm vo form ca bn <asp:Button id="Button1" style="Z-INDEX: 102; LEFT: 17px; POSITION: absolute; TOP: 231px" runat="server" Width="82px" Height="22px" Text="Press Me!"></asp:Button> Nhng hng cn li trong file WebForm1.aspx kt thc form, thn v file: </form> </body> </HTML>

File WebForm1.aspx.cs
File WebForm1.aspx.cs cha m ng sau form ca bn. Bn c th xem m ny bi chn View - Code, hay Bn c th nhn F7 trn bn phm . Danh sch 15.2 cho thy ni dung ca file WebForm1.aspx.cs . Danh sch 15.2: WebForm1.aspx.cs using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.SessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; namespace MyWebApplication { /// <summary> /// Summary description for WebForm1. /// </summary> public class WebForm1 : System.Web.UI.Page { protected System.Web.UI.WebControls.TextBox TextBox1; protected System.Web.UI.WebControls.Button Button1; private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here } #region Web Form Designer generated code override protected void OnInit(EventArgs e) {

// // CODEGEN: This call is required by the ASP.NET Web Form Designer. // InitializeComponent(); base.OnInit(e); } /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { this.Button1.Click += new System.EventHandler(this.Button1_Click); this.Load += new System.EventHandler(this.Page_Load); } #endregion private void Button1_Click(object sender, System.EventArgs e) { TextBox1.Text = "But, soft! what light through yonder window breaks?\n" + "It is the east, and Juliet is the sun.\n" + "Arise, fair sun, and kill the envious moon,\n" + "Who is already sick and pale with grief,\n" + "That thou her maid art far more fair than she"; } } } Nh bn c th thy, lp WebForm1 c bt ngun t lp System.Web.UI.Page . Trong thc t, khi bn chy form, .NET tht s to ra mt i tng ca lp Page i din cho form ca bn. Lp WebForm1 khai bo hai i tng c bo v c tn TextBox1 v Button1, n i din cho nhng iu khin TextBox v Nt bn thm vo form ca bn. Phng thc x l s kin Page_Load() c gi khi s kin Page_Load c khi dy. S kin Page_Load c khi dy mi khi form web c ti bi mt trnh duyt. in hnh, bn s t bt k m khi to no trong phng thc Page_Load(). Chng hn, nu bn mun truy cp mt c s d liu, bn m kt ni c s d liu trong phng thc Page_Load(). Nhng phng thc OnInit() v InitializeComponent() c t bn trong nhng b nh hng tin x l # region v # endregion. Nhng b nh hng ny bao bc mt vng m m c th c thu gom li trong ca s bin tp m VS .NET, ch li vn bn m ngay lp tc hin th ng sau nt # region. Phng thc OnInit() c gi khi form khi chy. Phng thc ny gi phng thc InitializeComponent() v thm nhng s kin Button Click v form Load ti i tng System.EventHandler. iu ny cho thng tin h thng m hai s kin ny s c x l bi nhng phng thc Button1_Click() V Page_Load(), tng ng. Phng thc Button1_Click() l phng thc bn sa i trc vi m gn thuc tnh Text ca iu khin TextBox1 ca bn ti mt chui ang cha li trch dn t Romeo v Juliet. Trong mc k tip, bn s c gii thiu v vi iu khin khc bn c th thm vo mt form web.

Nhng iu khin Form Web

Trong mc ny, bn s xem mt tm lc v nhiu lai iu khin form web m bn c th ly t mc nhng form web ca Toolbox. Bng 15.1 tng kt nhng iu khin. Bng 15.1: nhng iu khin form web

iu khin
Label TextBox

M t
Hin th vn bn. Bn gn vn bn m bn mun trnh by s dng thuc tnh Text. Mt hp cha vn bn m ngi s dng form ca bn c th son tho khi chy chng trnh. Thuc tnh TextMode c th c gn ti SingleLine (vn bn xut hin trn mt hng), MultiLine (vn bn xut hin trn nhiu hng), v Password (vn bn xut hin di dng k t sao). Thuc tnh Text cha vn bn ca TextBox. Mt nt c th nhn. Thuc tnh Text xc nh vn bn hin th trn nt. Tng t nh mt nt, ngai tr mt LinkButton xut hin nh mt mi lin kt siu vn bn. Bn gn mi lin kt s dng thuc tnh Text. Tng t nh mt nt, ngai tr mt ImageButton trnh by mt nh. Bn gn nh s dng thuc tnh ImageUrl. Mt hyperlink (lin kt siu van bn). Bn t hyperlink s dng thuc tnh NavigateUrl. Mt danh sch ca nhng ty chn c s xung khi kch. Bn gn danh sch nhng ty chn s dng thuc tnh Items. Ngi s dng ch c th chn mt ty chn t DropDownList khi form chy. Mt danh sch nhng ty chn. Bn gn danh sch nhng ty chn s dng thuc tnh Items. Ngi s dng c th chn nhiu ty chn t ListBox nu thuc tnh SelectionMode c gn ti Multiple. Gi tr khc l Single, trong trng hp ny ngi s dng ch c th chn mt ty chn. Mt khung li cha d liu truy xut t mt ngun d liu, v d mt c s d liu. Bn gn ngun d liu s dng thuc tnh DataSource. Mt danh sch ang cha d liu truy xut t mt ngun d liu. Bn gn ngun d liu s dng thuc tnh DataSource. Mt danh sch cha d liu c truy xut t mt ngun d liu m bn gn s dng thuc tnh DataSource. Mi mc trong danh sch c th c trnh by s dng mt template (khung mu). Mt khung mu nh ngha ni dung v cch trnh by ca nhng tit mc trong danh sch. Mt hp kim cha mt gi tr Boole true/ false c gn ti true bi ngi s dng nu h chn hp kim . Thuc tnh Checked cho bit gi tr Boole hin thi c gn trong hp kim . Mt hp kim nhiu chn la . Bn gn danh sch cho nhng hp kim s dng thuc tnh Items. Mt nt rai cha mt gi tr Boole true/ false c gn l true bi ngi s dng nu h nhn chn nt. Thuc tnh Checked cho bit gi tr Boole hin thi c gn trong nt rai. Mt nhm nhng nt rai. Bn gn danh sch nhng nt rai s dng thuc tnh Items. Hin th mt nh m bn gn s dng thuc tnh ImageUrl. Mt cngten ( vt cha) nhng iu khin khc. Mt cngten cho nhng iu khin m bn c th to ra trong thi gian chy chng trnh; nhng iu c bit nh nhng s iu khin ng. Trnh by mt lch trong mt thng v cho php ngi s dng chn mt ngy

Button LinkButton ImageButton HyperLink DropDownList

ListBox

DataGrid DataList Repeater

CheckBox

CheckBoxList RadioButton

RadioButtonList Image Panel PlaceHolder Calendar

thng v c th nh hng ti thng ti hoc thng trc. Bn s dng thuc tnh SelectedDate ly hay t ngy thng c chn, v bn s dng thuc tnh VisibleDate lt hay gn thng hin thi c trnh by. AdRotator Trnh by nhng bng thng co. Chi tit v nhng thng co, nh nh, URL khi c kch, v tn s hin th, c thit t trong mt file XML s dng thuc tnh AdvertisementFile. Trnh by mt bng vi nhng hng, m bn gn s dng thuc tnh Rows. bo m rng ngi s dng ch nh u vo no cho mt iu khin. Bn gn iu khin n hiu lc ha s dng thuc tnh ControlToValidate. Bn s thy mt v d s dng mt iu khin c hiu lc ha khng lu na. so snh mt mc nhp do mt ngi s dng nhp vo trong mt iu khin vi iu khin khc hay mt gi tr hng. Bn gn iu khin lm cho c hiu lc s dng thuc tnh ControlToValidate (iu khin ny cha gi tr c nhp vo bi ngi s dng). Bn t iu khin so snh vi, s dng thuc tnh ControlToCompare hay thuc tnh ValueToCompare. Bn t ton t cho s so snh s dng thuc tnh Operator. bo m rng ngi s dng nhp vo mt gi tr bn trong mt phm vi c ch r trong mt iu khin. Bn gn iu khin hiu lc ha n s dng thuc tnh ControlToValidate , v phm vi ca nhng gi tr s dng nhng thuc tnh MinimumValue v MaximumValue.

Table RequiredFieldValidator

CompareValidator

RangeValidator

RegularExpressionValidator bo m rng ngi s dng nhp vo mt gi tr tha mn mt biu thc thng thng c ch nh. Bn t iu khin hiu lc ha n s dng thuc tnh ControlToValidate , v biu thc thng thng s dng thuc tnh ValidationExpression. CustomValidator thc hin s hiu lc ha theo ring ca mnh cho gi tr nhp vo bi ngi s dng. Bn t iu khin hiu lc ha n, s dng thuc tnh ControlToValidate, v hm s dng trong s hiu lc ha ca bn, s dng thuc tnh ClientValidationFunction. trnh by mt tm lc ca tt c cc li v s hiu lc ha trn form web v/ hoc mt hp thoi. Bn thit t thuc tnh ShowSummary sc nh liu Bn c mun trnh by nhng li trn form web ca bn khng, v Bn thit t cho thuc tnh ShowMessageBox sch nh bn c mun trnh by nhng li trong mt hp thoi khng. Trnh by ni dung ca mt file XML. Bn t file XML trnh by s dng thuc tnh DocumentSource. Hin th vn bn tnh. Bn t vn bn trnh by s dng thuc tnh Text.

ValidationSummary

XML Literal

Bn s thy cch s dng mt s nhng iu khin ny trong phn cn li ca chng ny.

Xy dng mt ng dng phc tp hn


Trong mc ny, bn s thy mt web form phc tp hn s dng nhng iu khin Label, TextBox, RadioButtonList, DropDownList, v RequiredFieldValidator. Form s nhc ngi s dng v tn ca chng (mt trng c yu cu), ma a thch (ma xun, h, thu, hay ng), v phi tnh (nam hay n). Form s cng lm ni bt mt iu khin Nt, m khi c nhn s t thuc tnh Text ca mt trong s nhng iu khin Label ti mt chui cha tn ngi s dng, phi tnh , v ma yu thch . Hnh 15.4 cho thy form cui cng ca bn s xut hin nh th no.

Hnh 15.4: s xut hin ca form cui Thc hin nhng bc sau y: 1. to d n mi, chn File _ New Project trong VS .NET. Chn Visual C# Projects trong vng Project Types bn tri ca hp thoi New Project, v chn ASP .NET Web Application trong vng Templates (khun mu) bn phi. Nhp vo http: // Localhost/MyWeb- Application2 trong mc Location field. VS .NET s hin th mt form trng m bn c th thm nhng iu khin vo. 2. By gi, thm bn iu khin Label c lit k trong Bng 15.2 vo form trng ca bn. Bng ny trnh by thuc tnh ID v Text thit t cho mi iu khin Label ca bn. Bng 15.2: nhng iu khin Label Thuc tnh ID HelloLabel NameLabel SeasonLabel SexLabel Thuc tnh Text Hello Enter your name Favorite season Sex

3. Tip theo, thm mt iu khin TextBox vo bn phi NameLabel. t thuc tnh ID cho iu khin TextBox ca bn l NameTextBox. Ngi s dng s nhp vo tn ca h NameTextBox khi form chy. 4. Chng ti mun ngi s dng phi nhp vo tn ca h; nu h khng nhp vo, chng ti mun trnh by mt thng bo nhc h thc hin. t c iu ny, bn s dng mt iu khin RequiredFieldValidator. Thm mt iu khin RequiredFieldValidator vo di NameTextBox. t thuc tnh ID cho iu khin Required-FieldValidator ca bn ti NameRequiredFieldValidator. t thuc tnh Text l " Bn phi nhp vo tn ca bn! " . cui cng gn thuc tnh ControlToValidate n NameTextBox. 5. Tip theo, thm mt iu khin RadioButtonList vo bn phi ca SeasonLabel. Ngi s dng s chn ma a thch ca h t iu khin ny. t thuc tnh ID cho iu khin RadioButtonList ca bn ti SeasonRadioButtonList. thm nhng nt rai ti SeasonRadioButtonList, Kch nt nhng du chm (...) trong thuc tnh Items. Vic ny s hin th ListItem Collection Editor, m bn thng dng thm, iu chnh, hay loi b nhng tit mc (Items) trong nhng Tp hp tit mc (Items) cho iu

khin. Khi chy, bt k tit mc no bn thm vo tp hp s c trnh by nh nhng nt rai. Hnh 15.5 cho thy ca s ListItem Collection Editor vi nhng mc c yu cu nhp vo cho form ca bn.

Hnh 15.5: B bin tp tp hp ListItem 6. Thuc tnh Selected cho bit liu tit mc c phi c la chn u tin trong form ang chy. Thuc tnh Text cha vn bn c trnh by cho tit mc. Thuc tnh Value l gi tr c tr v khi tit mc c chn. 7. By gi kch nt Add thm tit mc u tin vo iu khin RadioButtonList ca bn. t thuc tnh Selected cho tit mc ti true _ iu ny gy cho nt rai s thot tin c chn. t thuc tnh Text cho tit mc l Spring; y l vn bn c trnh by cho nt rai. t thuc tnh Value ti 0; y l gi tr thc c la chn. Bng 15.3 cho thy thc tnh Selected, Text, v Value cho nt rai ny, cng vi ba nt rai khc thm vo iu khin RadioButtonList ca bn. Bng 15.3: nhng tit mc RadioButtonList Thuc tnh Selected Thuc tnh Text True False False False Spring Summer Fall Winter

Thuc tnh Value 0 1 2 3

8. Tip theo, thm mt iu khin DropDownList vo form ca bn. iu khin ny s cho php mt ngi s dng chn phi tnh ca h (nam hay n). t thuc tnh ID cho iu khin DropDownList ca bn ti SexDropDown-List. Bn thm nhng tit mc vo mt iu khin DropDownList s dng ListItem Collection Editor, m Bn truy cp s dng nt () thng qua thuc tnh Items. M ListItem Collection Editor v thm nhng tit mc trnh by trong Bng 15.4. Bng 15.4: nhng tit mc DropDownList Thuc tnh Selected True False Thuc tnh Text Male Female Thuc tnh Value 0 1

9. Cui cng, thm mt iu khin Button vo form ca bn. t thuc tnh ID cho iu khin Button ca bn ti OkButton, V t thuc tnh Text ti Ok. Nhn p OkButton son tho m cho phng thc OkButton_Click(), v thm nhng dng m sau y vo phng thc ny: HelloLabel.Text = "Hello "+ NameTextBox.Text + ", you are "+ SexDropDownList.SelectedItem.Text + "and your favorite season is " + SeasonRadioButtonList.SelectedItem.Text; Nh bn c th nhn thy, hng ny t thuc tnh Text cho iu khin HelloLabel ti mt chui cha nhng mc nhp vo ca ngi s dng trong NameTextBox, SexDropDownList, v nhng iu khin SeasonRadioButton. Chy form hon tt ca bn bi nhn Ctrl+ F5. Nhn nt Ok m khng nhp vo mt tn, v bn s thy thng bo " Bn phi nhp vo tn ca bn!", nh c trnh by trong Hnh 15.6 .Thng bo ny n t iu khin NameRequiredFieldValidator.

Hnh 15.6: Thng bo t iu khin ameRequired-FieldValidator Khi bn kt thc chy form ca bn, ng n v s tr li ca s tit k form VS .NET. Bn c th xem HTML cha nhng nhn ASP.NET cho form ca bn bi vic kch mi lin kt HTML ti y ca ca s tit k form. Kch mi lin kt HTML xem m cho form ca bn. Danh sch 15.3 trnh by file WebForm1.aspx cho form. Bn s lu file ny cha nhiu iu khin khc nhau c thm vo form. Danh sch 15.3: Filee WebForm1.aspx <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="WebApplication2.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta name="GENERATOR" Content="Microsoft Visual Studio 7.0"> <meta name="CODE_LANGUAGE" Content="C#">

<meta name="vs_defaultClientScript" content="JavaScript"> <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:Label id="HelloLabel" style="Z-INDEX: 101; LEFT: 17px; POSITION: absolute; TOP: 16px" runat="server" Width="322px" Height="23px">Hello</asp:Label> <asp:Label id="NameLabel" style="Z-INDEX: 102; LEFT: 17px; POSITION: absolute; TOP: 54px" runat="server" Width="114px" Height="22px">Enter your name</asp:Label> <asp:Label id="SeasonLabel" style="Z-INDEX: 103; LEFT: 17px; POSITION: absolute; TOP: 107px" runat="server" Width="101px" Height="32px">Favorite season</asp:Label> <asp:Label id="SexLabel" style="Z-INDEX: 104; LEFT: 17px; POSITION: absolute; TOP: 221px" runat="server" Width="33px" Height="15px">Sex</asp:Label> <asp:TextBox id="NameTextBox" style="Z-INDEX: 105; LEFT: 130px; POSITION: absolute; TOP: 51px" runat="server" Width="135px" Height="30px"></asp:TextBox> <asp:RequiredFieldValidator id="NameRequiredFieldValidator" style="Z-INDEX: 106; LEFT: 130px; POSITION: absolute; TOP: 84px" runat="server" ErrorMessage="RequiredFieldValidator" ControlToValidate="NameTextBox">You must enter your name! </asp:RequiredFieldValidator> <asp:RadioButtonList id="SeasonRadioButtonList" style="Z-INDEX: 107; LEFT: 130px; POSITION: absolute; TOP: 107px" runat="server" Width="152px" Height="107px"> <asp:ListItem Value="0" Selected="True">Spring</asp:ListItem> <asp:ListItem Value="1">Summer</asp:ListItem> <asp:ListItem Value="2">Fall</asp:ListItem> <asp:ListItem Value="3">Winter</asp:ListItem> </asp:RadioButtonList> <asp:DropDownList id="SexDropDownList" style="Z-INDEX: 108; LEFT: 130px; POSITION: absolute; TOP: 220px" runat="server" Width="90px" Height="27px"> <asp:ListItem Value="0" Selected="True">Male</asp:ListItem> <asp:ListItem Value="1">Female</asp:ListItem> </asp:DropDownList> <asp:Button id="OkButton" style="Z-INDEX: 109; LEFT: 17px; POSITION: absolute; TOP: 261px" runat="server" Width="83px" Height="27px" Text="Ok"></asp:Button> </form> </body> </HTML> File WebForm1.aspx.cs cha ng m ng sau form ca bn. Bn c th xem m ny bi vic chn View Code, hay Bn c th nhn F7 trn bn phm.

S dng mt iu khin DataGrid truy cp mt C s d liu


Mt DataGrid cho php bn truy cp nhng hng trong mt bng c s d liu. Trong nhng mc sau y, bn s hc cch to ra mt ng dng web ASP.NET s dng mt iu khin DataGrid truy cp nhng hng trong mt bng c s d liu. DataGrid bn to ra s trnh by nhng hng t nhng bng Products ca c s d liu

Northwind.

To mt ng dng Web
Thc hin nhng bc sau y: 1. to d n mi, chn File New Projects trong VS .NET. Chn Visual C# Projects t vng Project Types bn tri trn hp thoi New Project, v chn ASP.NET Web Application t vng Templates bn phi. nhp vo http: // Localhost/ DataGrid- WebApplication trong mc Location field. Kch OK tip tc. D n mi ca bn s sut hin mt form trng. 2. Tip theo, bn thm mt iu khin DataGrid vo form ca bn. lm iu ny, chn DataGrid t Toolbox v ko vo form ca bn. Hnh 15.7 cho thy form vi DataGrid.

Hnh 15.7: Form vi mt DataGrid 3. Tip theo, bn s thm mt i tng SqlConnection v mt i tng SqlDataAdapter vo form ca bn. thm nhng i tng ny, la chn bng Products trong Server Explorer v ko n ti form ca bn. (Vic thm mt i tng SqlConnection vo mt form c bn lun TrongChng 6, "Gii thiu nhng ng dng Windows v ADO.NET, " v trong Chng 7, "Ni kt ti mt C s d liu.") Ghi ch : hin th Server Explorer,chn View trn bn phm. Server Explorer, hay nhn Ctrl+Alt+S

4. Sau khi bn ko bng Products ti form ca bn, VS.NET to ra mt i tng SqlConnection t tn sqlConnection1 v mt i tng SqlDataAdapter c tn sqlDataAdapter1. Kch i tng sqlConnection1 ca bn trnh by nhng thuc tnh cho i tng ny trong ca s Properties. cho php sqlConnection1 truy cp c s d liu bn cn t mt khu cho kt ni. lm iu ny, bn cn thm mt chui con cha pwd vo thuc tnh ConnectionString ca sqlConnection1. Thm pwd= sa; ti thuc tnh ConnectionString. Ghi ch: Nu bn khng c mt khu cho ngi s dng sa, bn s cn ly n t ngi qun tr c s d liu ca bn. 5. Tip theo, bn s sa i pht biu SELECT SQL dng truy xut nhng hng t bng Product. Kch i tng sqlDataAdapter1 trnh by nhng thuc tnh cho i tng ny. Kch biu tng

addition bn tri ca thuc tnh SelectCommand hin th nhng thuc tnh ng (dynamic properties). Mt trong s nhng thuc tnh ng l thuc tnh CommandText, cha pht biu SELECT. 6. Kch CommandText v sau Kch nt (...) trnh by B to dng truy vn (Query Builder). Bn s dng Query Builder nh ngha nhng cu lnh SQL. Bn c th nhp cu lnh SQL, hay Bn c th to n cch trc quan. B chn tt c nhng ct ngoi tr nhng ct sau: ProductID, ProductName, QuantityPerUnit, and UnitPrice. iu ny dn n kt qu pht biu SELECT SQL c thit lp nh sau: SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice FROM Products 7. Kch nt Ok lu pht biu SELECT ca bn v ng B to dng truy vn. Tip theo, bn cn to mt i tng Dataset. Bn s dng mt i tng Dataset ct gi mt bn sao cc b ca thng tin c ct gi trong c s d liu. Mt i tng Dataset c th i din cho nhng cu trc c s d liu nh nhng bng, nhng hng v nhng ct. Trong v d trong mc ny, bn s s dng mt i tng Dataset ct gi nhng hng t bng Products. 1. Kch mt vng trn form ca bn bn ngoi DataGrid. Tip theo, kch mi lin kt Generate Dataset (Pht sinh Dataset) gn y ca ca s thuc tnh. s hin th hp thoi Generate Dataset . La chn nt rai mi v chc chn rng trng Text bn phi ca nt rai ny cha DataSet1. Cng, chc chn l hp kim " Add This Dataset To The Designer" c chn. Kch nt Ok tip tc. iu ny thm mt i tng Dataset mi c tn dataSet11 vo form ca bn. 2. Tip theo, bn s cn t thuc tnh DataSource ca DataGrid ti i tng Dataset ca bn. iu ny gn ngun d liu cho DataGrid v cho php nhng hng t Dataset c trnh by trong DataGrid ca bn. t thuc tnh DataSource, kch i tng DataGrid ca bn v thuc tnh DataSource c gn ti dataSet11. ng thi, t thuc tnh DataMember ti Products; y chnh l bng vi nhng hng s c trnh by bi DataGrid ca bn. 3. Tip theo, bn s cn thm m c tr sqlDataAdapter1 vi nhng hng c truy xut bi pht biu SELECT. in hnh, tt nht l t m ny trong phng thc Page_Load() ca form ca bn. phng thc Page_Load() c gi khi trang Web cha form ca bn ti thi im thot tin c ti hay khi c lm ti li (refresh). Thuc tnh IsPostBack ca mt trang l false khi trang c ti ln u tin, v chuyn thnh true khi nt submit ( trnh) ca mt form c nhn . V s thc hin, ni chung bn s mun truy xut nhng hng ch khi thuc tnh IsPostBack l false; nu khng bn c l khng cn thit phi ti li nhng hng t c s d liu. xem m ca form ca bn, bn chn View - Code hay nhn F7 trn bn phm . vit m cho phng thc Page_Load() nh di y: private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here if (!this.IsPostBack) { sqlDataAdapter1.Fill(dataSet11, "Products"); this.DataBind(); } } Phng thc Fill() truy xut nhng hng t bng Products v c tr dataSet11 vi nhng hng .Ri phng thc DataBind() in y DataTable Products vo dataSet11 vi nhng hng c truy xut t bng Products. iu ny gy ra nhng hng s c hin th trong DataGrid ca form ca bn. chy form ca bn, chn Debug _ Start Without Debugging, hay nhn Ctl+ F5 trn bn phm ( xem Hnh 15.8).

Hnh 15.8: form ang chy Nh bn c th thy, mt di cun dc c hin th p ng s lng ln nhng hng truy xut c t bng Product. Trong mc k tip, bn s hc cch ty bin DataGrid . Bn hc cch kim sot s lng hng c trnh by trong DataGrid ca bn khng xut hin di cun nh th no, cng nh kim sot nhng kha cnh khc ca DataGrid .

Ty bin DataGrid
Bn ty bin DataGrid ca bn bng cch- u tin chn iu khin DataGrid v sau kch mi lin kt Property Builder (b to dng Thuc tnh ) y ca ca s Thuc tnh. iu ny hin th hp thoi nhng thuc tnh cho DataGrid ca bn. Hp thoi nhng thuc tnh c chia ra trong lm vng: General, Columns, Paging, Format, and Borders (tng quan, nhng ct, s phn trang, nh dng, v nhng vin bao).

Nhng thuc tnh Chung (general)


Bn s dng nhng thuc tnh chung t ngun d liu cho DataGrid ca bn v sc nh c hin th mt u trang v phn cui trang khng, v mt s nhng thuc tnh khc . t nhng thuc tnh chung ca bn nh trnh by trong Hnh 15.9.

Hnh 15.9: nhng thuc tnh Chung Nhng thuc tnh chung nh sau: DataSource: l ngun d liu cho DataGrid ca bn. Trong v d ny, DataSource l dataSet11. DataMember :l tn ca bng m DataGrid ca bn kt buc ti. Trong v d ny, DataMember l Products. Data Key Field : Trng kha D liu l tn ca mt ct hay biu thc lin kt vi mi hng trong DataGrid ca cc bn nhng khng c hin th. Bn in hnh s dng n ch nh kha chnh. Header and Footer : u trang trnh by tn ca nhng ct ti nh ca DataGrid. chn Show Header v Show Footer. Behavior: (hnh vi) Bn c th sp xp nhng ct trong u trang ca DataGrid ca bn. Chn Allow Sorting nh th nhng ct ca bn c th c sp xp.

Nhng thuc tnh ct (Columns properties)


Bn s dng nhng thuc tnh nhng ct chn nhng ct s c trnh by trong DataGrid ca bn , v vn bn u trang v cui trang s c trnh by cho mi ct, v mt s nhng thuc tnh khc. Kch mi lin kt Columns (nhng ct) ca hp thoi Properties v gn nhng thuc tnh nhng ct ca bn nh trnh by trong Hnh 15.10.

Hnh 15.10: nhng thuc tnh nhng ct Nhng thuc tnh nhng ct nh sau: Create Columns Automatically At Run Time : Hp kim "T ng to ra nhng ct trong thi gian chy" ch nh liu c t ng to ra bao gm tt c nhng ct cho Dataset trong DataGrid ca bn khng. Khi hp kim ny l unselected, Bn c th gn nhng thuc tnh khc cho mi ct theo mt cch ring. Khng nn chn hp kim ny. Column List : Danh sch Ct cho php bn chn nhng ct t Dataset ca bn hin th trong DataGrid ca bn. Bn chn nhng ct t vng Available Columns (ct sn c bn tri) v thm chng vo vng Selected Columns (nhng ct c chn) bn phi s dng nt c mi tn hng phi. Chn (All Fields) t vng Available Columns, v thm chng vo vng Selected Columns. BoundColumn Properties : nhng thuc tnh BoundColumn cho php bn gn nhng thuc tnh cho mi ct. Bn chn ct bn mun t trong vng Selected Columns , v sau gn nhng thuc tnh cho ct ny. Nhng trng bn c th gn cho mi ct nh sau: Header Text : Vn bn bn mun trnh by u trang cho mt ct. Footer Text : Vn bn bn mun trnh by cui trang cho mt ct. Header Image : Hnh nh m bn mun trnh by u trang cho mt ct. Sort Expression : ct hay biu thc m bn mun dng phn loi hay sp xp ct . UnitPrice c chn nh biu thc phn loi. Data Field : tn ca ct. Data Formatting Expression : Biu thc nh dng d liu cho php bn nh dng mt gi tr ct. Bn c th s dng mt biu thc nh dng nh dng nhng ngy thng v nhng s, v nhng th khc. Chng hn, { 0: $##. 00} nh dng mt s, thm mt du la ng trc, v trnh by hai ch s sau du phy s thp phn; V d, 19 c nh dng nh $ 19.00. Biu thc nh dng c t cho ct UnitPrice l { 0: $##. 00}.

Nhng thuc tnh phn trang


Tip theo, kch trn mi lin kt phn trang (Paging ) ca hp thoi Properties. Bnh thng, tt c nhng hng c truy xut bi mt pht biu SELECT c trnh by trn mt trang n cho DataGrid. Bn c th s dng nhng thuc tnh phn trang tch tt c nhng hng vo nhng trang ring bit, vi mt s lng hng c nh trn mi trang trong DataGrid ca bn.V ri Bn c th chn nhng nt nh hng gia nhng trang ca nhng hng ny. Bn s t kch thc trang ca bn l nm hng vi nt Next v Previous nh hng gia nhng trang ca nhng hng. t nhng thuc tnh Phn trang (Paging) ca bn nh hnh 15.11.

Hnh 15.11: nhng thuc tnh Phn trang Nhng thuc tnh Phn trang nh sau: Allow Paging : cho bit liu s phn trang c cho php hay khng. chn kim hp kim Allow Paging (cho php phn trang). Page Size : iu khin s hng c trnh by trn mi trang. t Page Size l 5. Show Navigation Buttons : hp kim "hin th nhng nt dn hng" iu khin liu nhng nt dn hng c c hin th hay khng. Nhng nt ny cho php bn nh hng gia nhng trang ca nhng hng. chn hp kim "hin th nhng nt dn hng". Position : cho php bn t v tr ca nhng nt dn hng . t v tr l Bottom. Mode : iu khin kiu ca nhng nt dn hng c trnh by. Bn c th s dng nhng nt Next v Previous hay page numbers nh hng gia nhng trang. t Mode ti Next, Previous Buttons.. Next Page Button Text : thit t vn bn hin th trn Nt Next page (trang k tip). nguyn nh & gt; nh th mt k t ln hn (>) c trnh by. Previous Page Button Text : Vn bn trnh by trn "nt trang trc". nguyn l & lt; nh th mt k t nh hn (<) c trnh by. Numeric Buttons : iu khin nhng S trnh by cho mi trang khi bn t Mode to Page Numbers. th d nh, 1 dn hng ti trang u tin , 2 dn hng ti trang th hai , vn vn.

Ngoi vic cho php s phn trang bn s cng cn thm m no vo DataGrid ca bn lm cng vic dn ng, v bn s lm iu ny khng lu sau y.

Nhng thuc tnh nh dng


Tip theo, kch mi lin kt Format link (nh dng) ca hp thoi nhng thuc tnh. Bn s dng nhng thuc tnh nh dng kim sot s xut hin ca mi phn t trn DataGrid ca bn . Bn c th t nhng c tnh nh mu ca DataGrid ca bn, hoc font ch. Bn cng c th t nhng thuc tnh hin th (display) ca mi ct. Bn s t mu nn v mu ch trng hay en, tng ng. Bn s cng t phng ca vn bn c trnh by trong DataGrid ca cc bn l Arial. t nhng thuc tnh nh dng ca bn nh trnh by trong Hnh 15.12.

Hnh 15.12: nhng thuc tnh nh dng Nhng thuc tnh nh dng nh sau: Forecolor: ty chn Forecolor ch r mu vn bn . t Forecolor ti mu en. Back Color: ty chn mu nn ch r mu nn ng sau vn bn. t mu nn ti mu trng (White). Font Name : Ty chn tn phng ch ch r Phng trnh by vn bn. t tn phng ti Arial. Font Size: ty chn kch thc phng kim sot kch thc ca phng ch c s dng trnh by vn bn. Bold, Italic, Underline, Strikeout, Overline : nhng ty chn in m, ch nghing, gch di, vch ngang gia ch, v ng trn - kim sot s nh dng ca k t cho vn bn. Horizontal Alignment : Ty chn sp thnh hng nm ngang ch r v tr ca vn bn trong .

Nhng thuc tnh nhng vin bao


Tip theo, kch vo mi lin kt vin bao (Borders) ca hp thoi nhng thuc tnh. Bn s dng Borders properties kim sot s lt, khong cch v kiu hin th ca nhng li trong DataGrid ca bn. Bn s t mu vin ca nhng hng li trong DataGrid ca cc bn ti mu xanh. Gn nhng thuc tnh nhng ng vin ca bn nh trong Hnh 15.13.

Hnh 15.13: nhng thuc tnh nhng vin Nhng thuc tnh nhng vin nh sau: Cell Padding : Kim sot lng khng gian (theo nhng im) gia mp ca mt v nhng ni dung cha trong DataGrid ca bn. Cell Spacing :kim sot lng khong cch (theo nhng im) gia mi phn t trong DataGrid ca bn. Grid Lines :ch r hng ca nhng ng li trong Datagrid ca bn. Border Color :ch r mu ca nhng ng li trong DataGrid ca bn. gn n ti mu xanh. Border Width :iu chnh b rng vin v nhng n v ca li k trong DataGrid ca bn. Mt khi bn hon tt vic gn nhng thuc tnh, kch nt Ok tip tc. Tip theo, bn s vit m B x l s kin PageIndexChanged() cho php s nh hng ca nhng hng trong DataGrid ca bn.

Vit m cho B x l s kin PageIndexChanged()


Nh c cp trc , ngoi vic cho php s phn trang trong ca s nhng thuc tnh phn trang, bn s cng cn thm m no ti DataGrid ca bn, c bit, ti phng thc x l s kin PageIndexChanged(). Phng thc ny c gi bt c khi no bn thay i trang trong DataGrid trong trang Web ang chy ca bn. Trc khi bn thm m cn thit, u tin bn chn DataGrid ca bn, sau bn kch nt Events (s kin) trong ca s nhng thuc tnh hin th nhng s kin DataGrid cho bn, xem Hnh 15.14.

Hnh 15.14: trnh by nhng s kin DataGrid Nhn p s kin PageIndexChanged v gn phng thc DataGrid1_PageIndexChanged() nh sau: private void DataGrid1_PageIndexChanged( object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e) { DataGrid1.CurrentPageIndex = e.NewPageIndex; sqlDataAdapter1.Fill(dataSet11, "Products"); DataGrid1.DataBind(); } Pht biu u tin bn trong thn phng thc nh sau: DataGrid1.CurrentPageIndex = e.NewPageIndex; Pht biu ny gn trang hin thi c hin th trong DataGrid1 ti trang mi c chn s dng nhng nt dn hng trong form ang chy. Bn gn trang hin thi cho DataGrid1 s dng thuc tnh CurrentPageIndex, v Bn ly trang mi t thuc tnh NewPageIndex ca i tng DataGridPageChangedEventArgs. Bng cch thit t DataGrid1. CurrentPageIndex bng (equal to) e.NewPageIndex, S dn hng ti trang mi ca nhng hng c thc hin. Pht biu th hai nh sau: sqlDataAdapter1.Fill(dataSet11, "Products"); Pht biu ny gi phng thc Fill() ca sqlDataAdapter1 c tr dataSet11 vi tp hp ca nhng hng tip theo t bng Products. Pht biu th ba nh sau:

DataGrid1.DataBind(); Pht biu ny gi phng thc DataBind() ca DataGrid1, kt qu tp hp mi ca nhng hng s c trnh by. Ghi ch Vi VS .NET, bn cng c th i ti Code view v s s dng nhng thc n th xung to ra ch k cho nhng s kin. iu ny ng dng vi bt k s kin no m bn thm vo. Tt nhin, nhn p vo nhng s kin ly s kin " mc nh " th d dng hn, nhng c nhng s kin khc cho mi iu khin. Chy form ca bn bi vic nhn Ctrl+ F5 trn bn phm . Hnh 15.15 cho thy s vn hnh ca fom.

Hnh 15.15: form ang chy S dng nhng nt dn hng di chuyn gia nhng trang ca nhng hng. Mt khi bn kt thc vic chy form ca bn, ng n v tr li ca s thit k form VS .NET. Kch mi lin kt HTML xem m ca form ca bn. Danh sch 15.4 trnh by file WebForm1.aspx cho form. Bn s ch l file ny c cha mt iu khin DataGrid vi nhng ct thch hp. Danh sch 15.4:file WebForm1.aspx <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="DataGridWebApplication.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta content="Microsoft Visual Studio 7.0" name="GENERATOR"> <meta content="C#" name="CODE_LANGUAGE"> <meta content="JavaScript" name="vs_defaultClientScript">

<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:datagrid id=DataGrid1 style="Z-INDEX: 101; LEFT: 16px; POSITION: absolute; TOP: 11px" runat="server" AutoGenerateColumns="False" BorderColor="Blue" Font-Bold="True" Font-Names="Arial" ForeColor="Black" BackColor="White" AllowPaging="True" PageSize="5" ShowFooter="True" DataMember="Products" AllowSorting="True" DataSource="<%# dataSet11 %>" Height="333px" Width="352px"> <Columns> <asp:BoundColumn DataField="ProductID" HeaderText="ProductID"> </asp:BoundColumn> <asp:BoundColumn DataField="ProductName" HeaderText="ProductName"> </asp:BoundColumn> <asp:BoundColumn DataField="QuantityPerUnit" HeaderText="QuantityPerUnit"> </asp:BoundColumn> <asp:BoundColumn DataField="UnitPrice" SortExpression="UnitPrice" HeaderText="UnitPrice" DataFormatString="{0:$##.00}"> </asp:BoundColumn> </Columns> </asp:datagrid></form> </body> </HTML> Trong mc k tip, bn s hc cch s dng mt iu khin DataList truy cp mt c s d liu nh th no.

S dng mt iu khin DataList truy cp mt C s d liu


Trong mc ny bn s hc cch s dng mt iu khin DataList truy cp nhng hng trong bng Products. Mo nh Mt DataList cung cp bn kh nhiu tnh linh hot trong vic trnh by nhng gi tr ct hn l mt DataGrid. Thc hin nhng bc sau y: 1. to d n mi, chn File New Project trong VS .NET. Chn Visual C# Projects t vng Project Types trn bn tri ca hp thoi New Project (d n mi), v chn ASP .NET Web Application t vng Templates (khung mu) bn phi. Nhp vo "http: // Localhost/ DataList- WebApplication" trong Location field (trng nh v). Kch OK tip tc. D n mi ca bn s cha mt form trng. 2. Tip theo, bn s thm mt i tng SqlConnection v mt i tng SqlDataAdapter vo form ca bn. Chn bng Products trong Server Explorer v ko n ti form ca bn. 3. Sau khi bn ko bng Products ti form ca bn, VS .NET to ra mt i tng SqlConnection c tn sqlConnection1 v mt i tng SqlDataAdapter c tn sqlDataAdapter1. 4. Kch i tng sqlConnection1 ca bn trnh by nhng thuc tnh cho i tng ny trong ca s nhng thuc tnh. sqlConnection1 c th truy cp c s d liu, bn cn t mt khu cho kt ni. Thm pwd= sa; ti thuc tnh ConnectionString. 5. Tip theo, bn s sa i pht biu SELECT _SQL dng truy xut nhng hng t bng Products. Kch i tng sqlDataAdapter1 ca bn trnh by nhng thuc tnh cho i tng ny. Kch biu

tng addition bn tri thuc tnh SelectCommand trnh by nhng thuc tnh ng; mt trong s nhng thuc tnh ng l thuc tnh CommandText, cha pht biu SELECT. Tip theo, kch CommandText ri sau kch nt ellipsis hin th Query Builder. Bn c th nhp cu lnh SQL, hay Bn c th xy dng n theo cch trc quan. B chn tt c nhng ct tr ProductID, ProductName, QuantityPerUnit, and UnitPrice. Kt qu l trong pht biu SELECT_ SQL s c thit lp nh sau y: SELECT ProductID, ProductName, QuantityPerUnit, UnitPrice FROM Products 6. Kch OK tip tc. 7. Tip theo, bn cn to mt i tng Dataset. Kch mt vng trn form ca bn. Tip theo, kch lin kt Generate-Dataset y ca ca s nhng thuc tnh. iu ny hin th hp thoi Generate-Dataset (Pht sinh tp d liu). Chn nt "New radio " v chc chn rng trng bn phi ca nt radio ny cha DataSet1. Kch nt Ok tip tc. iu ny thm mt i tng Dataset mi c tn dataSet11 vo form ca bn. 8. Tip theo, bn s thm mt iu khin DataList vo form ca bn. lm iu ny, chn DataList t Toolbox v ko n n form ca bn. Hnh 15.16 cho thy form vi DataList mi.

Hnh 15.16: Form vi mt DataList 9. Tip theo, bn s cn t thuc tnh DataSource ca DataList ca bn ti i tng Dataset ca bn c to ra trc . iu ny gn ngun d liu cho DataList ca bn v cho php nhng hng t Dataset s c trnh by trong DataList ca bn. gn thuc tnh DataSource, kch i tng DataList ca bn v gn thuc tnh DataSource ti dataSet11. ng thi, gn thuc tnh DataMember ca DataList ti Products; y l bng vi nhng hng c trnh by bi DataList.

Mt DataList s dng nhng khun mu m nh ngha ni dung ca n s c hin th nh th no, v nhim v k tip ca bn l thit lp nhng khun mu ny. Mo nh: l nhng khun mu DataList m cho bn tnh linh hot cho s sp t nhng iu khin trnh by nhng gi tr ct. Bn s son tho khun mu nh ngha u mc v cui mc cho DataList, cng vi khun mu nh ngha nhng tit mc thc t c trnh by bn trong DataList ca bn: 1. son tho khun mu u mc v cui mc, nhn phi DataList ca bn v chn Edit Template Header And Footer Templates "Nhng khun mu u mc v cui mc". 2. Bn c th thm nhng iu khin vo nhng vng bn trong nhng vng HeaderTemplate v FooterTemplate. Bt k iu khin no bn thm vo u s c trnh by tng ng ti khi u v kt thc ca DataList. Thm mt nhn HeaderTemplate; bn lm iu ny bi ko mt iu khin nhn t Toolbox n vng trng di HeaderTemplate. t thuc tnh Text cho nhn ny ti Products. ng thi, thm mt nhn trong vng FooterTemplate v gn thuc tnh Text ca n ti End of list. Hnh 15.17 cho thy nhng khun mu u mc v cui mc c sa i v nhng iu khin Nhn.

Hnh dung 15.17: Nhng khun mu u mc v cui mc c sa i cng vi nhng iu khin Nhn Ghi nh: Bn c th kt thc s son tho mt khun mu ti bt k thi gian no bi vic nhn phi DataList ca bn v chn End Template Editing " kt thc son tho Khun mu ". 3. Tip theo, bn s son tho khun mu Item (tit mc) v thm nhng iu khin Label (nhn ) hin th nhng ct ProductID, ProductName, QuantityPerUnit, v UnitPrice. Nhn phi DataList ca bn v chn Edit Template Item Templates. Hnh 15.18 trnh by the Item Templates editor (b bin tp khun mu tit mc) .

Hnh 15.18: B bin tp khun mu Tit mc Nh bn c th thy t Hnh 15.18, B bin tp khun mu Tit mc c chia vo trong bn vng sau y: ItemTemplate: cha nhng iu khin m bn in hnh thng dng trnh by nhng gi tr ct. AlternatingItemTemplate: cha nhng iu khin m c hin th sau nhng iu khin trong ItemTemplate. SelectedItemTemplate: cha nhng iu khin c hin ra khi bn chn mt tit mc. EditItemTemplate: cha nhng iu khin m c hin ra khi bn son tho mt tit mc. Bn s thm mt bng vo vng ItemTemplate, v sau Bn s thm bn iu khin Label trong nhng ca bng ca bn. Bn iu khin Label s trnh by nhng gi tr cho nhng ct ProductID, ProductName, QuantityPerUnit, v UnitPrice. thm mt bng bn thc hin nh sau: 1. Kch bt c ni u trong vng ItemTemplate v chn Table > Insert Table. Gn nhng thuc tnh cho bng nh Hnh 15.19.

Hnh 15.19: t nhng thuc tnh ca bng 2. Tip theo, ko mt Nhn ti u tin trong bng. Bn s s dng Nhn u tin ny trnh by ct ProductID. t thuc tnh ID ca Nhn ca bn ti ProductID, nh trong Hnh 15.20.

Hnh 15.20: vic thm Nhn 3. Dng Nhn trnh by ct ProductId, bn s cn kt buc nhn ti ct ny. lm iu ny, kch nt ellipsis (...) trong thuc tnh DataBindings. Bn s thy hp thoi DataBindings. M nt Container bi kch biu tng addition , ri m nt DataItem; cui cng, chn ct ProductID, nh nh trnh by trong Hnh 15.21.

Hnh 15.21: Kt buc Nhn ti ct ProductID 1. Tip theo, thm ba iu khin Nhn na vo trong nhng cn li ca bng . Gn thuc tnh ID cho ba iu khin Nhn ti ProductName, QuantityPerUnit, v UnitPrice, tng ng. ng thi, kt buc ton b nhng iu khin Nhn ca bn ti nhng ct ProductName, QuantityPerUnit, v UnitPrice, tng ng. Cnh bo: khi bn thm nhng iu khin Nhn vo nhng , bn ch l nhng cn li s co li. phng iu ny v n c th lm cho vic thm nhng iu khin Nhn khc mt cht kh khn. 5. Tip theo, bn s sa i HTML cho form ca bn lm bng d c hn . Bn s thay i nhng thuc tnh chiu rng (width) v vin (border) ca th Table v thit t thuc tnh chiu rng ca nhng th (tags) TD. Ghi nh: th Table nh ngha mt Bng, v th TD nh ngha mt phn t trong mt hng. 6. nhn m HTML ca form ca cc bn, kch mi lin kt HTML bn di ca s thit k form xem m ca form. Gn nhng thuc tnh chiu rng v vin ca th Table ca bn ti 320 v 1, tng ng, v gn nhng thuc tnh chiu rng ca bn nhn TD ti 20, 100, 100, v 100, tng ng. HTML di y cho thy nhng s thay i ny <TABLE id="Table5" cellSpacing="1" cellPadding="1" width="320" border="1"> <TR> <TD width="20"> <asp:Label id=ProductID runat="server" Text=' <%# DataBinder.Eval(Container, "DataItem.ProductID") %>'> </asp:Label></TD> <TD width="100"> <asp:Label id=ProductName runat="server" Text=' <%# DataBinder.Eval(Container, "DataItem.ProductName") %>'> </asp:Label></TD> <TD width="100"> <asp:Label id=QuantityPerUnit runat="server" Text=' <%# DataBinder.Eval(Container, "DataItem.QuantityPerUnit") %>'> </asp:Label></TD> <TD width="100">

<asp:Label id=UnitPrice runat="server" Text=' <%# DataBinder.Eval(Container, "DataItem.UnitPrice") %>'> </asp:Label></TD> </TR> </TABLE> Ghi nh: thuc tnh ID ca th Table ca bn c l khc vi m c trnh by trong m trc. ng bn tm n s thay i thuc tnh ID cho th Table ca bn. 7. Tip theo, bn s cn thm m c tr sqlDataAdapter1 vi nhng hng c truy xut bi pht biu SELECT ca bn. in hnh, s sp xp tt nht l t m ny trong phng thc Page_Load() ca form ca bn. Phng thc Page_Load() c gi l khi trang Web cha form ca bn thot tin c ti (initially loaded) hay lm mi li (refreshed). M m cho form ca bn bi chn View > Code, hay nhn F7 trn bn phm. Gn phng thc Page_Load() nh sau: private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here if (!this.IsPostBack) { sqlDataAdapter1.Fill(dataSet11, "Products"); this.DataBind(); } } Phng thc Fill() truy xut nhng hng t bng Products v c tr i tng dataSet11 vi nhng hng . Ri phng thc DataBind() s trnh by nhng hng trong DataList ca form ca bn. chy form ca bn, chn Debug cho thy form ang chy. Start Without Debugging, hay nhn Ctrl+ F5 trn bn phm . Hnh 15.22

Hnh 15.22: form ang chy Mt khi bn kt thc chy form ca bn, ng n v tr li ca s thit k form. Kch mi lin kt HTML

xem m ca form . Danh sch 15.5 trnh by file WebForm1.aspx cho form. Bn ch rng file ny cha mt iu khin DataList vi nhng ct thch hp. Danh sch 15.5: file WebForm1.aspx <%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="DataListWebApplication.WebForm1" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <HTML> <HEAD> <title>WebForm1</title> <meta content="Microsoft Visual Studio 7.0" name="GENERATOR"> <meta content="C#" name="CODE_LANGUAGE"> <meta content="JavaScript" name="vs_defaultClientScript"> <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:datalist id=DataList1 style="Z-INDEX: 101; LEFT: 33px; POSITION: absolute; TOP: 28px" runat="server" DataMember="Products" Height="140" Width="297" DataSource=" <%# dataSet11 %>"> <HeaderTemplate> <asp:Label id="Label1" runat="server">Products</asp:Label> </HeaderTemplate> <FooterTemplate> <asp:Label id="Label2" runat="server">End of list</asp:Label> </FooterTemplate> <ItemTemplate> <TABLE id="Table5" cellSpacing="1" cellPadding="1" width="320" border="1"> <TR> <TD width="20"> <asp:Label id=ProductID runat="server" Text=' <%# DataBinder.Eval(Container, "DataItem.ProductID") %>'> </asp:Label></TD> <TD width="100"> <asp:Label id=ProductName runat="server" Text=' <%# DataBinder.Eval(Container, "DataItem.ProductName") %>'> </asp:Label></TD> <TD width="100"> <asp:Label id=QuantityPerUnit runat="server" Text=' <%# DataBinder.Eval(Container, "DataItem.QuantityPerUnit") %>'> </asp:Label></TD> <TD width="100"> <asp:Label id=UnitPrice runat="server" Text=' <%# DataBinder.Eval(Container, "DataItem.UnitPrice") %>'> </asp:Label></TD> </TR> </TABLE> </ItemTemplate> </asp:datalist></form> </body> </HTML>

Bo tr trng thi trong mt ng dng Web


Giao thc truyn ti siu vn bn (HTTP) khng duy tr trng thi gia nhng trang c cung cp bi my ch phc v mng trong thi gian mi vng truyn ti. Bt k thng tin no bn cung cp trong mt form cho nhng phng tin ny - Bt u khi bn c mt trang mi. Nu bn n gin ang nhn c nhng trang Web HTML tnh, th y khng l mt vn . tuy nhin ,nu bn ang t hng mt sn phm, th my ch phc v cn nh nhng mn g m bn t. my ch phc v Mng nh nhng g bn thc hin trong vng truyn ti sau cng , bn c th lu tr thng tin trn my ch phc v hay trn my tnh khch m b duyt web ang tc chy. Vic ct gi thng tin trn my khch c ngha l bn khng s dng bt k ti nguyn no trn my ch phc v lu tr thng tin ny, v trnh ng dng Web ca bn c th tim tng x l nhiu ngi s dng hn. Vic ct gi thng tin trn my ch phc v cho bn nhiu iu khin ca thng tin lu tr hn, nhng v th s tiu th nhng ti nguyn ca my ch phc v, bn cn cn thn khng lu tr qu nhiu; nu khng ng dng web ca bn s khng c kh nng x l nhiu ngi s dng.

Ct gi Thng tin trn my khch


ct gi thng tin trn my khch, bn c th s dng cookies hay thuc tnh ViewState ca i tng Page (Trang). Chng ta hy xem xt cch s dng cookies v thuc tnh ViewState nh th no.

Ct gi thng tin s dng Cookies


Mt cookie l mt tn v cp gi tr m c ct gi trong mt file nh lu tr trn cng ca my tnh khch . Bn s dng tn xc nh gi tr s c lu tr; c tn ln gi tr l nhng i tng chui. Cnh bo: Nhng Cookie th tim tng nghi vn bi v ngi s dng c th nh hnh b duyt ca h ngn nga nhng Cookie v vic lu tr, mt b duyt ch lu tr mt lng hn ch cookies: 300 trong tng s v khng nhiu hn 20 i vi mt my ch phc v mng. Bi vy bn cn phi s dng cookies mt cch ri rc- nu l cho mi th. V d sau y to ra mt bin int c tn myInt c gn l 1 v to ra mt i tng HttpCookie ct gi myInt vi tn count: int myInt = 1; HttpCookie myHttpCookie = new HttpCookie("count", myInt.ToString()); Bi v mt cookie gi gi tr nh mt chui, bn s dng phng thc ToString() chuyn i myInt ti mt chui trc khi lu tr n trong myHttpCookie. lu tr cookie trn my khch bn gi phng thc AppendCookie() ca i tng Response thuc i tng Page (Trang). Response.AppendCookie(myHttpCookie); i tng Response (s p li) l mt p ng HTTP c gi bi my ch phc v Mng ti b duyt. Khi m ny c chy, n yu cu b duyt lu tr cookie trn a cng ca my tnh khch trong th mc c ch r trong s thit t cho b duyt. Bn c th truy xut gi tr Count t tp hp cookies ca i tng Request (Yu cu): myInt = Int32.Parse(Request.Cookies["count"].Value); i tng Request (Yu cu) c gi bi b duyt ti my ch phc v Mng v cha cookie va gn trc . Bi v gi tr count c ct gi nh mt chui, bn s dng phng thc tnh Parse() ca cu trc Int32 chuyn i chui ti mt int.

Danh sch 15.6 cho thy mt v d ca trnh ng dng ASP .NET s dng mt cookie theo di s ln trang c xem. Danh sch 15.6: CookieTest.aspx <!-CookieTest.aspx illustrates the use of a cookie to store information on the client --> <html> <head> <script language="C#" runat="server"> void Page_Load(Object sender, EventArgs e) { int myInt; // check if count is null if (Request.Cookies["count"] == null) { // count is null, so initialize myInt to 1 myInt = 1; // create an HttpCookie object HttpCookie myHttpCookie = new HttpCookie("count", myInt.ToString()); // add HttpCookie object to Response Response.AppendCookie(myHttpCookie); } else { // retrieve count and increment myInt by 1 myInt = Int32.Parse(Request.Cookies["count"].Value) + 1; } // set count value to myInt Response.Cookies["count"].Value = myInt.ToString(); // display myInt in myLabel myLabel.Text = "This page has been viewed "+ myInt.ToString() + " times."; } </script> </head> <body> <asp:Label id="myLabel" runat="server"/> <form runat="server"> <asp:Button text="Press the Button!" runat="server"/> </form> </body> </html> Ghi ch:

Ch l bn c th nhng m C# trc tip vo trong mt file .aspx. file CookieTest.aspx c to ra s dng Microsoft notepad. chy CookieText.aspx, n gin sao chp file ny vo trong th mc Inetpub\wwwroot ca bn v ch im B duyt ca bn ti http: // Localhost/ CookieTest.aspx. Hnh 15.23 cho thy trang sinh ra bi CookieTest.aspx - Gi nh rng nt trn trang c nhn nhiu ln.

Hnh 15.23: s vn hnh ca trang CookieTest.aspx

Ct gi thng tin s dng thuc tnh ViewState


Bn s dng thuc tnh ViewState ca i tng Page truy cp mt i tng StateBag, m ct gi mt tp hp tn v nhng cp gi tr trn my tnh khch. Bn s dng tn xc nh gi tr ang c ct gi. Tn l mt string (chui) v gi tr l mt Object (i tng). Khng ging mt cookie, mt ngi s dng khng th cn tr s lu tr nhng gi tr s dng thuc tnh ViewState. Mt s dng cho thuc tnh ViewState s ct gi mt tn ca ngi s dng. Mo nh: Mt khi nhng gi tr c gi qua li gia my khch v my ch phc v, bn ch nn ct gi mt t thng tin s dng thuc tnh ViewState. y l mt gii php tt hn so vi s dng nhng cookies bi v ngi s dng c th lun cn tr s lu tr nhng cookies. V d sau y ct gi myInt di tn count: int myInt = 1; ViewState["count"] = myInt; Bn c th ri truy xut gi tr count s dng m sau y: myInt = (int) ViewState["count"]; Bi v mt gi tr c ct gi nh mt i tng, bn phi p n ti kiu c bit bn mun s dng. Trong v d ny, gi tr count c p ti mt int. Danh sch 15.7 cho thy mt v d v trang ASP .NET s s dng thuc tnh ViewState theo di s ln trang c xem. <!-ViewStateTest.aspx illustrates the use of ViewState to store information on the client --> <html> <head> <script language="C#" runat="server"> void Page_Load(Object sender, EventArgs e) { int myInt;

// check if count is null if (ViewState["count"] == null) { // count is null, so initialize myInt to 1 myInt = 1; } else { // retrieve count and increment myInt by 1 myInt = (int) ViewState["count"] + 1; } // set count value to myInt ViewState["count"] = myInt; // display myInt in myLabel myLabel.Text = "This page has been viewed "+ myInt.ToString() + " times."; } </script> </head> <body> <asp:Label id="myLabel" runat="server"/> <form runat="server"> <asp:Button text="Press the Button!" runat="server"/> </form> </body> </html>

Ct gi thng tin trn my ch phc v


ct gi thng tin trn my ch phc v bn c th s dng i tng phin hp (Session), ng dng (Application) hay b m (Cache) ca i tng Page (Trang). Tt c nhng i tng ny lu tr thng tin tn v nhng cp gi tr trong form , vi tn l mt chui (string) v gi tr l mt i tng (Object). Bn cng c th ct gi thng tin trong bn thn c s d liu, l gii php tt nht nu bn cn ct gi nhiu thng tin v mt ngi s dng hay ng dng. Cui cng, tt nhin bn c th lun ct gi thng tin trong nhng bin tnh hay nhng i tng. Bn s hc v nhng i tng phin hp, ng dng, v b m trong nhng mc k tip. Ti s cng bn lun v vic ct gi thng tin v mt ng dng mng trong c s d liu.

Ct gi thng tin s dng mt i tng Session (Phin hp)


Mt i tng Session cho php bn ct gi thng tin ring bit cho mi ngi s dng. Thng tin c ct gi vo nhng i tng session trn my ch phc v vn duy tr s tn ti vi mt thi gian mc nh l 20 pht, sau thi gian ny thng tin c xa b. Mt s dng cho i tng session c l l tr tn ca ngi s dng. Mo nh: bi v mi i tng Session ct gi thng tin cho mt ngi s dng n, ct gi thng tin ti thiu tuyt i cho mi ngi s dng. Nu khng, my ch phc v mng ca cc bn c th b ngp vi nhng i tng session v s qu ti b nh, v ng dng ca bn s khng h tr s lng ln nhng ngi dng.

Thng tin c ct gi trong tn v nhng cp gi tr, vi tn l mt chui v gi tr l mt i tng. V d sau y ct gi myInt di tn Count int myInt = 1; Session["count"] = myInt; Ri bn c th truy xut gi tr count s dng m sau y: myInt = (int) Session["count"]; Bi v mt gi tr c ct gi nh mt i tng, bn phi p n ti kiu c bit bn mun s dng. Trong v d ny, gi tr count c p ti mt int. Danh sch 15.8 Trnh by mt v d trang ASP.NET s dng i tng session (Phin hp) theo di s ln trang c xem. Thng tin ny ring bit i vi mi ngi s dng, v do hin th tng s ln m trang c xem bi ngi s dng hin thi. Danh sch 15.8: SessionObjectTest.aspx <!-SessionObjectTest.aspx illustrates the use of the Session object to store information on the server. This information is specific for each user. --> <html> <head> <script language="C#" runat="server"> void Page_Load(Object sender, EventArgs e) { int myInt; // check if count is null if (Session["count"] == null) { // count is null, so initialize myInt to 1 myInt = 1; } else { // retrieve count and increment myInt by 1 myInt = (int) Session["count"] + 1; } // set count value to myInt Session["count"] = myInt; // display myInt in myLabel myLabel.Text = "This page has been viewed "+ myInt.ToString() + " times."; } </script> </head>

<body> <asp:Label id="myLabel" runat="server"/> <form runat="server"> <asp:Button text="Press the Button!" runat="server"/> </form> </body> </html>

Ct gi thng tin s dng i tng trnh ng dng


i tng trnh ng dng cho php bn ct gi thng tin m dng chung cho tt c nhng ngi s dng. Mt s dng cho i tng trnh ng dng c l ct gi mt i tng Dataset cha mt mt danh mc sn phm (a product catalog). Thng tin c lu tr trong tn v nhng cp gi tr, ni m tn l mt chui v gi tr l mt i tng. V d sau y ct gi myInt di tn count: int myInt = 1; Application["count"] = myInt; Bn c th ri truy xut gi tr count s dng m sau y myInt = (int) Application["count"]; Danh sch 15.9 cho thy mt v d ASP.NET page s dng i tng Application theo di s ln trang c xem. Thng tin ny c chia s bi tt c nhng ngi s dng, v do trnh by tng s ln trang c xem bi tt c nhng ngi s dng. Danh sch 15.9: ApplicationObjectTest.aspx <!-ApplicationObjectTest.aspx illustrates the use of the Application object to store information on the server. This information is shared for all users. --> <html> <head> <script language="C#" runat="server"> void Page_Load(Object sender, EventArgs e) { int myInt; // check if count is null if (Application["count"] == null) { // count is null, so initialize myInt to 1 myInt = 1; } else { // retrieve count and increment myInt by 1 myInt = (int) Application["count"] + 1;

} // set count value to myInt Application["count"] = myInt; // display myInt in myLabel myLabel.Text = "This page has been viewed "+ myInt.ToString() + " times."; } </script> </head> <body> <asp:Label id="myLabel" runat="server"/> <form runat="server"> <asp:Button text="Press the Button!" runat="server"/> </form> </body> </html>

Ct gi thng tin s dng i tng b m


Cng nh i tng Application , i tng Cache (B m) cng c chia s cho tt c nhng ngi s dng, nhng n cung cp nhiu chc nng hn i tng ng dng. Chng hn, bn c th kim sot khi thng tin lu tr c loi b. bit chi tit hn v i tng Cache (B m) tham kho ti liu trc tuyn .NET. nh c m t trong Chng 1, " Gii thiu v lp trnh C s d liu vi ADO.NET." Xem "Cache class" ( lp B m ) trong ch mc ca ti liu trc tuyn.

Ct gi thng tin s dng C s d liu


Nu bn c rt nhiu thng tin lu tr v mt ngi s dng, ct gi n trong c s d liu tt hn l trong i tng Cache (Phin hp). Chng hn, nu bn ang xy dng mt trang web m mt ngi s dng c th t mua sn phm , lu tr " xe y mua hng " ca h trong c s d liu. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

To ra mt ng dng Shopping Cart "xe y mua hng" n gin


Trong mc ny, bn s sa i DataGridWebApplication m bn to ra trc chuyn n vo trong mt "xe y mua hng " n gin. Bn s ct gi shopping cart trong mt i tng Session. Ghi nh: nh cp trong mc trc y, trong mt ng dng thc s bn s c l mun lu tr shopping cart trong c s d liu hn l trong mt i tng Session. Hnh 15.24 trnh by form c chy cui cng m bn s xy dng. Bn s dng nt Buy (mua) thm mt sn phm vo shopping cart ( xe y mua hng) bn phi ca form. Nh bn c th thy t Hnh 15.24, Ti c thm ba sn phm vo xe y mua hng bi vic nhn nt buy (mua) cho mi sn phm trong li bn tri.

Hnh 15.24: form ang chy Bn c th theo c hai bc c trnh by trong nhng mc sau y thm nt Buy (Mua) v shopping cart (xe y mua hng) vo form ca bn, hay bn c th thay m ASP.NET trong form ca bn bng m trong file WebForm1.aspx c cha Trong th mc VS .NET Projects\DataGridWebApplication . Bn thay th m trong form ca bn bi vic chn v xa m hin hu trong form ca bn v dn m trong file WebForm1.aspx vo. Bn s cng cn thay th m ng sau form ca bn vi m trong file WebForm1.aspx.cs c cha trong th mc VS .NET Projects\DataGridWebApplication .

Thm nt Buy (mua)


Trong mc ny, bn s thm nt Buy (mua) vo i tng DataGrid1 ca DataGridWebApplication. Thc hin nhng bc sau y: 1. M DataGridWebApplication bi vic chn File > Open > Project, nhn p th mc DataGridWebApplication , v nhn p file DataGridWebApplication.sln. 2. M File WebForm1.aspx trong Degign mode (kiu thit k) bi nhn p file ny trong Solution Explorer window (ca s B duyt gii php). Kch vo iu khin DataGrid1 trong form. Hnh 15.25 cho thy nhng thuc tnh ca DataGrid1.

Figure 15.25: DataGrid1 properties 3. Tip theo, kch mi lin kt Property Builder (B xy dng thuc tnh) gn y ca ca s nhng thuc tnh. Thc hin nhng bc sau thm nt Buy (mua): 1. Kch Columns bn tri hp thoi c nhng thuc tnh DataGrid1. 2. M rng nt Column ca mc Columns sn c. 3. Thm mt nt Select vo vng Selected Columns (nhng ct c chn). 4. gn Text l Buy ( Mua). y l vn bn c hin th trn nt. 5. Gn tn Command l AddToCart. y l phng thc c gi khi nt c nhn . (Bn s to ra phng php ny sau .) 6. Gn Button Type ( kiu nt) ti PushButton (nt nhn). Hnh 15.26 cho thy nhng thuc tnh cui cng ca nt Buy.

Hnh 15.26: nhng thuc tnh nt Buy 4 Kch OK thm nt vo DataGrid1. Hnh 15.27 cho thy DataGrid1 vi nt Buy mi thm vo.

Hnh 15.27: DataGrid1 vi nt Buy

Thm Shopping Cart (xe y mua hng)


Trong mc ny, bn s thm mt DataGrid lu tr Shopping Cart (xe y mua hng). Ko mt iu khin DataGrid t Toolbox vo bn tri ca DataGrid1 trn form ca bn. t ID ca DataGrid mi ny l ShoppingCart, nh trong Hnh 15.28.

Hnh 15.28: ShoppingCart DataGrid Ghi nh: Bn c l phi ng tt c ca s tr form designer (ca s thit k form) nh th bn s c khng gian mn hnh thm DataGrid mi vo form ca bn.

Thm m vo file WebForm1.aspx.cs.


Cng vic k tip ca bn l thm m b sung vo file WebForm1.aspx.cs h tr shopping cart (xe y mua hng). Nh c cp trc , hoc bn c th theo nhng bc trnh by trong mc ny hay bn c th thay th m ng sau form ca bn bng m trong file WebForm1.aspx.cs c cha trong th mc VS .NET Projects\DataGridWebApplication . Bn thay th m trong form ca bn bng cch chn v xa m hin hu trong form v dn m trong file WebForm1.aspx.cs vo. Thc hin nhng bc sau y nu bn mun t tay sa i m: 1. Chn View Code, hay nhn F7 trn bn phm xem m. Thm mt i tng DataTable t tn Cart v mt i tng DataView tn CartView vo lp WebForm1, nh trnh by trong m di y: public class WebForm1 : System.Web.UI.Page { protected DataTable Cart; protected DataView CartView; i tng Cart ca bn c dng lu tr shopping cart (xe y mua hng) v s c c tr vi nhng sn phm c chn s dng nt Buy. i tng CartView ca bn c dng xem shopping cart ( xe y mua hng). 2. Tip theo, Gn phng thc Page_Load() ti m sau y; ch phng php ny to ra mt DataTable lu tr shopping cart (xe y mua hng), v DataTable ny c lu tr trong i tng

Session (phin hp): private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here // populate the Session object with the shopping cart if (Session["ShoppingCart"] == null) { Cart = new DataTable(); Cart.Columns.Add(new DataColumn("Product Name", typeof(string))); Cart.Columns.Add(new DataColumn("Unit Price", typeof(string))); Session["ShoppingCart"] = Cart; } else { Cart = (DataTable) Session["ShoppingCart"]; } CartView = new DataView(Cart); ShoppingCart.DataSource = CartView; ShoppingCart.DataBind(); if (!this.IsPostBack) { // populate dataSet11 with the rows from the Products DataTable sqlDataAdapter1.Fill(dataSet11, "Products"); this.DataBind(); } } 3. Tip theo, bn cn thm phng thc AddToCart() sau y ti lp WebForm1 ca bn . Phng thc ny c gi khi ngi s dng nhn nt Buy (Mua). Ch phng thc ny to ra mt i tng DataRow v c tr n vi nhng i tng TableCell lu tr tn sn phm v n gi trong DataTable Shopping-Cart m thm vo form bn trc . protected void AddToCart(Object sender, DataGridCommandEventArgs e) { DataRow product = Cart.NewRow(); // e.Item is the row of the table where the command is raised. // For bound columns the value is stored in the Text property of TableCell TableCell productNameCell = e.Item.Cells[1]; TableCell unitPriceCell = e.Item.Cells[3]; string productName = productNameCell.Text; string unitPrice = unitPriceCell.Text; if (((Button)e.CommandSource).CommandName == "AddToCart") { product[0] = productName; product[1] = unitPrice; Cart.Rows.Add(product); } ShoppingCart.DataBind(); } 4. Vic duy nht cn li l chy form ca bn. lm iu ny, chn Debug hay nhn Ctrl+ F5 trn bn phm . Start Without Debugging,

Kch nt Buy cho nhng sn phm khc nhau trong li thm chng vo xe y mua hng ca bn. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Tm lc
HTML to ra nhng trang Web tnh vi ni dung khng thay i. Tuy nhin,nu bn mun thng tin ng, th bn c th s dng ASP.NET. N cho php bn to ra nhng trang Web vi ni dung c th thay i trong thi gian chy, v pht trin nhng ng dng m c truy cp s dng mt Web Browser (Trnh duyt mng). Trong chng ny, bn thy cch s dng Visual Studio .NET v ngn ng lp trnh C# to mt vi trnh ng dng Web n gin ASP.NET . Chng ny cho bn mt gii thiu ngn gn v ti ln ASP.NET. V phm vi ti k lng hn , xem "Mastering ASP .NET with C# (Sybex, 2002)" ca Russell Jones. C hai phn chnh ti form ASP.NET : file .aspx, cha m HTML v ASP .NET , v file aspx.cs , cha m C# m h tr form web. Bn c th xem m C# ny nh mt th chy ng sau form, v v l do ny file .aspx.cs c bit nh file sau m. Bn c th xem m ASP.NET cha trong file HTML cho form ca bn bi vic kch mi lin kt HTML y ca s fom deginer . Bn c th xem file sau m bi chn View > Code, hay bn c th nhn F7 trn bn phm. Mt DataGrid cho php bn truy cp nhng hng trong mt bng c s d liu. Trong nhng mc sau y, bn s hc cch to ra trnh ng dng web ASP .NET s dng mt iu khin DataGrid truy cp nhng hng trong mt bng c s d liu nh th no. Bn ty bin DataGrid ca bn bng cch - u tin chn iu khin DataGrid v sau kch mi lin kt Property Builder (b xy dng thuc tnh) y ca ca s nhng thuc tnh. Vic ny hin th hp thoi nhng thuc tnh cho DataGrid ca bn. hp thoi nhng thuc tnh c chia vo trong nm vng: General, Columns, Paging, Format, and Borders (Tng quan, nhng ct, s phn trang, nh dng, v nhng vin). Mt DataList cung cp cho bn nhiu tnh linh hot trong s trnh by nhng gi tr ct hn mt DataGrid, Nh kh nng thm nhng u mc v nhng cui vo d liu. Giao thc truyn ti siu vn bn (HTTP) khng bo tr trng thi gia nhng trang cung cp bi my ch phc v Mng ca bn trong thi gian mi vng truyn ti. iu ny c ngha l bt k thng tin no bn cung cp trong mt form s b b qun khi bn nhn mt trang mi. My ch phc v Mng nh nhng g bn lm trong thi gian vng truyn ti sau cng , bn c th ct gi thng tin trn My ch phc v hay trn my tnh khch trn trnh duyt ang chy. Vic lu tr thng tin trn my khch c ngha l bn khng s dng bt k ti nguyn no trn my ch phc v lu tr thng tin ny v trnh ng dng web ca bn c th x l nhiu ngi s dng hn. Vic lu tr thng tin trn my ch phc v cho bn nhiu iu khin ca thng tin c ct gi hn, nhng t tiu th nhng ti nguyn my ch phc v, bn cn cn thn khng lu tr qu nhiu; nu khng ng dng web ca bn s khng c kh nng x l nhiu ngi s dng. @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Chng 16: S dng h tr XML ca my ch phc v SQL Tng quan


XML tr nn mt ngn ng chung ca web bi v l mt nh dng l tng cho s trao i thng tin. c rt nhiu cng ty trao i thng tin ln nhau s dng XML c gi qua Mng. Trong chng ny, bn s hc v s h tr XML rng ln ca my ch phc v SQL. Bn s cng thy cch ct gi XML mt chng trnh C# s dng nhng i tng XmlDocument v XmlDataDocument. Nhng c trng trong chng ny: S dng mnh FOR XML ca SQL Server

Gii thiu XPath v XSLT Truy cp my ch phc v SQL s dng HTTP S dng hm OPENXML() ca SQL server S dng mt i tng XmlDocument lu tr mt tp ti liu XML (XML document). S dng mt i tng XmlDataDocument lu mt tp ti liu XML (XML document).

S dng mnh FOR XML ca SQL Server


Vi mt pht biu SELECT SQL tiu chun , bn gi pht biu SELECT ca bn ti c s d liu cho s thc thi v ly li nhng kt qu trong form ca nhng hng. SQL Server m rng pht biu SELECT cho php bn truy vn c s d liu v ly v nhng kt qu dng XML. lm iu ny bn thm mt mnh FOR XML vo cui ca pht biu SELECT ca bn. Mnh for XML ch nh my ch phc v SQL s tr li nhng kt qu dng XML. Mnh FOR XML c c php nh sau y: FOR XML {RAW | AUTO | EXPLICIT} [, XMLDATA] [, ELEMENTS] [, BINARY BASE64] Nhng t kha RAW, AUTO, v EXPLICIT ch bo kiu XML. Bng 16.1 cho thy mt s m t ca nhng t kha c dng trong mnh FOR XML. Trong nhng mc k tip, bn s kho st mt s v d v s s dng ca mnh FOR XML. Bng 16.1: Nhng t kha FOR XML

T kha
RAW AUTO EXPLICIT XMLDATA ELEMENTS BINARY BASE64

M t
Ch r mi hng trong tp hp kt qu c tr v nh mt phn t < row>XML . Nhng gi tr ct cho mi hng trong tp hp kt qu tr thnh nhng thuc tnh ca phn t <row> . Ch r mi hng trong tp hp kt qu c tr v nh mt phn t XML, tn ca bng c s dng nh tn ca th trong nhng phn t hng. Cho bit pht biu SELECT ca bn ch r mt mi quan h cha con. Mi quan h ny ri c s dng bi my ch phc v SQL pht sinh XML vi s phn cp thch hp c lng vo . Ch r m hnh XML s c bao gm trong XML c tr v. Ch r nhng gi tr ct c tr v nh nhng phn t ca hng; cch khc nhng ct c tr v nh nhng thuc tnh ca hng. Bn ch c th s dng ty chn ny vi kiu AUTO. Ch r bt k d liu nh phn no c tr v bi pht biu SELECT ca bn u c m ha trong c s 64. Nu bn mun truy xut d liu nh phn s dng hoc kiu RAW hoc kiu EXPLICIT, th bn phi s dng ty chn BINARY BASE64.

S dng kiu RAW

Bn s dng kiu RAW ch r mi hng trong tp hp kt qu c tr v bi pht biu SELECT ca bn c tr v nh mt phn t < Hng>XML . Nhng gi tr ct cho mi hng trong tp hp kt qu tr thnh nhng thuc tnh ca phn t <row> . Danh sch 16.1 cho thy mt v d v pht biu SELECT m truy xut ba hng u tin t bng Customers. Nhng kt qu SELECT c tr v vi dng XML s dng mnh FOR XML RAW. Danh sch 16.1: FORXMLRAW.SQL USE Northwind SELECT TOP 3 CustomerID, CompanyName, ContactName FROM Customers ORDER BY CustomerID FOR XML RAW Ghi ch: Pht biu SELECT ny c cha trong mt script T-SQL c tn ForXmlRaw.sql, c nh v trong th mc sql cho chng ny . Bn c th ti script ForXmlRaw.sql T- SQL vo trong Query Analyzer (b phn tch truy vn) bi chn File > Open t thc n menu. Ri bn chy script bi chn Query > Execute, hay bi nhn kha F5. Hnh 16.1 cho thy kt qu ca vic chy script trong Query Anlyzer. Bn ch l XML c hin ra trn mt hng, v hng ny b xn bt.

Hnh 16.1: vic chy mt pht biu SELECT cha mt mnh FOR RAW XML trong Query Analyzer Ghi ch: Theo mc nh, s lng k t cc i c trnh by bi Query Analyzer trn ct l 256. Bt k kt qu no di hn 256 k t s c ct b. Cho nhng v d trong mc ny bn s cn tng s cc i ca nhng k t ti 8,192. lm iu ny, bn chn Tools > Option trong Query Analyzer v gn trng s k t cc i mi ct ti 8,192. y l hng XML c tr v bi v d, m Ti sao chp t "b phn tch truy vn" v thm mt s k t tr v lm cho n d c hn <row CustomerID="ALFKI" CompanyName="Alfreds Futterkiste" ContactName="Maria Anders"/>

<row CustomerID="ANATR" CompanyName="Ana Trujillo Emparedados y helados" ContactName="Ana Trujillo"/> <row CustomerID="ANTON" CompanyName="Antonio Moreno Taquera" ContactName="Antonio Moreno"/> Ch l thng tin v mi khch hng c t bn trong mt th < row> . ng thi, nhng gi tr ct xut hin nh nhng thuc tnh bn trong mi hng; chng hn, trong hng u tin, thuc tnh CustomerID l ALFKI.

S dng kiu AUTO


Bn s dng kiu AUTO ch r mi hng trong tp hp kt qu c tr v nh mt phn t XML. Tn ca bng c s dng nh tn ca th trong nhng phn t hng. Danh sch 16.2: FORXMLAUTO.SQL USE Northwind SELECT TOP 3 CustomerID, CompanyName, ContactName FROM Customers ORDER BY CustomerID FOR XML AUTO XMLc tr v bi v d ny nh sau: <Customers CustomerID="ALFKI" CompanyName="Alfreds Futterkiste" ContactName="Maria Anders"/> <Customers CustomerID="ANATR" CompanyName="Ana Trujillo Emparedados y helados" ContactName="Ana Trujillo"/> <Customers CustomerID="ANTON" CompanyName="Antonio Moreno Taquera" ContactName="Antonio Moreno"/> Ch mi khch hng xut hin bn trong mt th <Customer> thay v mt th < row> , nh trng hp trong v d kiu RAW trc y.

S dng kiu EXPLICIT:


Bn s dng kiu EXPLICIT cho bit pht biu SELECT ca bn ch r mt mi quan h cha con. Mi quan h ny ri c s dng bi my ch phc v SQL pht sinh XML vi s phn cp thch hp c lng vo . Khi s dng kiu EXPLICIT bn phi cung cp t nht hai pht biu SELECT. SELECT th nht ch r hng cha (hay nhng hng), v SELECT th hai ch r nhng hng con. Nhng hng c truy xut bi hai s pht biu

SELECT c lin quan thng qua nhng ct c bit c tn Tag v Parent. Tag ch r v tr s ca phn t, v Parent ch r s tag ca phn t Cha (nu c). Chng ta hy cho rng mt v d m s dng hai pht biu SELECT. SELECT u tin truy xut CustomerID, CompanyName, V ContactName cho hng t bng Customers c mt CustomerID l ALFKI. SELECT th hai ng thi truy xut OrderID v OrderDate t hng trong bng Orders m cng c mt CustomerID l ALFKI. Pht biu SELECT u tin nh sau: SELECT 1 AS Tag, 0 AS Parent, CustomerID AS [Customer!1!CustomerID], CompanyName AS [Customer!1!CompanyName], ContactName AS [Customer!1!ContactName], NULL AS [Order!2!OrderID!element], NULL AS [Order!2!OrderDate!element] FROM Customers WHERE CustomerID = 'ALFKI' Ct Tag ch r v tr s ca hng trong s phn cp XML. Ct Parent xc nh ct Cha , m l 0 trong pht biu SELECT trc y; l bi v hng ny l cha , hay root, trong s phn cp XML. Ghi ch: Bn cng c th s dng mt gi tr Tag l Null ch bo root (gc r) Nhng ct CustomerID, CompanyName, v ContactName trong SELECT trc y c cung cp mt b danh s dng t kha AS, i theo sau bi mt chui m s dng nh dng sau y: [elementName!tag!attributeName!directive] VI: elementName ch r tn ca phn t hng trong XML c tr li. Tag: ch r s th (Tag). attributeName: ch r tn ca nhng phn t ct trong XML c tr li. directive : (ty chn) ch r phn t s c x l nh th no trong XML. Nhng ch th c trnh by trong Bng 16.2. Bng 16.2: DIRECTIVES

Ch th

M t

element Ch bo gi tr ct xut hin nh mt phn t hng c cha bn trong phn t hng bn ngoi, ng hn l mt thuc tnh nhng ca phn t hng bn ngoi . phn t ch th c th kt hp vi ID, IDREF, hay IDREFS. hide xml Ch bo gi tr ct khng xut hin trong XML c tr v. Tng t nh ch th phn t ngoi tr gi tr ct khng c vit m nh mt thc th trong XML c tr v. C ngha l nhng k t c bit &, ',>,<, v " li nh n c". Nu khng, nhng k t ny s c vit m nh &amp;, &apos;, &gt;, &lt;, v &quot; tng ng. Ch th xml c th kt hp vi hide.

xmltext Ch bo gi tr ct c cha trong mt th n. S dng ch th xmltext, kiu ct ca bn phi l varchar, nvarchar, char, nchar, text, hay ntext. cdata Ch bo gi tr ct c cha bn trong mt mc CDATA. Nhng mc CDATA c dng thot khi nhng khi vn bn cha nhng k t c bit m nu khng s c gii thch nh nhn ph; nhng k t ny bao gm &, >,<, v ". s dng ch th cdata, kiu ct ca bn phi

l varchar, nvarchar, text, hay ntext. ID Ch bo gi tr ct l mt thuc tnh ID. Mt thuc tnh IDREF v IDREFS c th tr vo mt thuc tnh ID, cho php bn to ra nhng mi lin kt bn trong XML.

IDREF Ch bo gi tr ct l mt thuc tnh IDREF. IDREFS Ch bo gi tr ct l mt thuc tnh IDREFS. Chng ta hy xem xt mt v d: CustomerID nh [Customer!1!CustomerID] ch r gi tr ct CustomerID s xut hin bn trong phn t hng Customers vi tn thuc tnh ca CustomerID. Sau ContactName trong mnh SELECT trc y, xut hin hai ct c gi tr NULL; chng c s dng nh placeholders (b gi ch) cho nhng ct OrderID v OrderDate c truy xut bi hai pht biu SELECT, m bn s thy tip theo y. Hai ct ny s dng ch th element, m ch bo nhng gi tr ct s xut hin nh nhng phn t c cha bn trong phn t hng Customers. Pht biu SELECT th hai truy xut nhng hng t bng Orders c mt CustomerID l ALFKI: SELECT 2 AS Tag, 1 AS Parent, C.CustomerID, C.CompanyName, C.ContactName, O.OrderID, O.OrderDate FROM Customers C, Orders O WHERE C.CustomerID = O.CustomerID AND C.CustomerID = 'ALFKI' Ch l ct Parent c gn ti 1, n cho bit Parent l hng c truy xut trc bi pht biu SELECT u tin trnh by trc . Danh sch 16.3 cho thy mt v d y s dng hai pht biu SELECT trnh by trong mc ny. Danh sch 16.3: FORXMLEXPLICIT.SQL USE Northwind SELECT 1 AS Tag, 0 AS Parent, CustomerID AS [Customer!1!CustomerID], CompanyName AS [Customer!1!CompanyName], ContactName AS [Customer!1!ContactName], NULL AS [Order!2!OrderID!element], NULL AS [Order!2!OrderDate!element] FROM Customers WHERE CustomerID = 'ALFKI' UNION ALL SELECT 2 AS Tag, 1 AS Parent, C.CustomerID, C.CompanyName, C.ContactName,

O.OrderID, O.OrderDate FROM Customers C, Orders O WHERE C.CustomerID = O.CustomerID AND C.CustomerID = 'ALFKI' FOR XML EXPLICIT Ghi nh: Mnh UNION ALL gy cho nhng kt qu truy xut c bi hai pht biu SELECT s c trn vo trong mt tp hp kt qu. Tp hp kt qu kt hp c sn xut bi mnh UNION ALL c chuyn i thnh XML bi mnh FOR XML EXPLICIT. XML tr v bi v d nh sau: <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste" ContactName="Maria Anders"> <Order> <OrderID>10643</OrderID> <OrderDate>1997-08-25T00:00:00</OrderDate> </Order> <Order> <OrderID>10692</OrderID> <OrderDate>1997-10-03T00:00:00</OrderDate> </Order> <Order> <OrderID>10702</OrderID> <OrderDate>1997-10-13T00:00:00</OrderDate> </Order> <Order> <OrderID>10835</OrderID> <OrderDate>1998-01-15T00:00:00</OrderDate> </Order> <Order> <OrderID>10952</OrderID> <OrderDate>1998-03-16T00:00:00</OrderDate> </Order> <Order> <OrderID>11011</OrderID> <OrderDate>1998-04-09T00:00:00</OrderDate> </Order> </Customer> Ch rng phn t OrderID v OrderDate xut hin nh nhng phn t hng cha trong phn t Order pha ngoi. y l bi v ch th phn t c ch nh cho nhng phn t OrderID v OrderDate trong pht biu SELECT u tin. Nu ch th phn t b b st t nhng phn t OrderID v OrderDate, th XML c tr v nh sau: <Customer CustomerID="ALFKI" CompanyName="Alfreds Futterkiste" ContactName="Maria Anders"> <Order OrderID="10643" OrderDate="1997-08-25T00:00:00"/> <Order OrderID="10692" OrderDate="1997-10-03T00:00:00"/>

<Order OrderID="10702" OrderDate="1997-10-13T00:00:00"/> <Order OrderID="10835" OrderDate="1998-01-15T00:00:00"/> <Order OrderID="10952" OrderDate="1998-03-16T00:00:00"/> <Order OrderID="11011" OrderDate="1998-04-09T00:00:00"/> </Customer> Ch l nhng phn t OrderID v OrderDate c nhng nh nhng thuc tnh ca phn t Order bn ngoi.

S dng ty chn XMLDATA


Bn s dng ty chn XMLDATA ch nh nh ngha kiu ti liu m hnh XML (DTD) s c bao gm trong XML c tr v. M hnh XML cha tn v kiu ca nhng thuc tnh ct. Danh sch 16.4 trnh by mt v d s dng ty chn XMLDATA tr v m hnh XML cng vi Nhng ct ProductID, ProductName, v UnitPrice cho hai hng u tin t bng Products. Danh sch 16.4: FORXMLAUTOXMLDATA.SQL USE Northwind SELECT TOP 2 ProductID, ProductName, UnitPrice FROM Products ORDER BY ProductID FOR XML AUTO, XMLDATA Ghi nh: Trong v d ny, Ti s dng nhng ct t bng Products hn l bng Customers bi v nhng bng Customers ch cha nhng gi tr ct chui, v Ti mun bn thy mt s nhng kiu khc nhau c tr v trong mt m hnh XML. Bng Products cha nhng gi tr ct bao gm c nhng chui ln nhng s. Ct ProductID thuc kiu int SQL Server, ProductName thuc kiu nvarchar, v UnitPrice thuc kiu money (tin t). XML tr v bi v d ny nh sau: <Schema name="Schema3" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes"> <ElementType name="Products" content="empty" model="closed"> <AttributeType name="ProductID" dt:type="i4"/> <AttributeType name="ProductName" dt:type="string"/> <AttributeType name="UnitPrice" dt:type="fixed.14.4"/> <attribute type="ProductID"/> <attribute type="ProductName"/> <attribute type="UnitPrice"/> </ElementType> </Schema> <Products xmlns="x-schema:#Schema3" ProductID="1" ProductName="Chai" UnitPrice="18.0000"/> <Products xmlns="x-schema:#Schema3" ProductID="2" ProductName="Chang" UnitPrice="19.0000"/> Ch nhng kiu XML khc nhau ca nhng thuctnh ProductID, ProductName, v UnitPrice c ch

nh trong th AttributeType gn on khi u ca XML trc y. bit chi tit hn, xem nhng m hnh XML vit bi Chelsea Valentine, Lucinda Dykes, and Ed Tittel (Sybex, 2002).

S dng nhng ty chn ELEMENT


Bn s dng nhng ty chn ELEMENTS ch nh nhng gi tr ct c tr v nh nhng phn t ph ca hng; nu khng nhng gi tr ct c tr v nh nhng thuc tnh ca hng. Mo nh: Bn ch c th s dng nhng ty chn ELEMENTS vi AUTO mode. Danh sch 16.5 cho thy mt v d s dng ty chn ELEMENTS khi truy xut hai hng u tin t bng Customers. Danh sch 16.5: FORXMLAUTOELEMENTS.SQL USE Northwind SELECT TOP 2 CustomerID, CompanyName, ContactName FROM Customers ORDER BY CustomerID FOR XML AUTO, ELEMENTS XML tr v bi v d ny nh sau: <Customers> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> <ContactName>Maria Anders</ContactName> </Customers> <Customers> <CustomerID>ANATR</CustomerID> <CompanyName>Ana Trujillo Emparedados y helados</CompanyName> <ContactName>Ana Trujillo</ContactName> </Customers> Ch : nhng gi tr ct c tr v nh nhng phn t ph bn trong nhng hng ca Customers.

S dng ty chn BASE64 Nh phn


Bn s dng ty chn BINARY BASE64 ch nh bt k d liu nh phn no c tr v bi pht biu SELECT ca bn u c m ha trong c s 64. Ghi nh : Nu bn mun truy xut d liu nh phn s dng hoc kiu RAW hay EXPLICIT, th bn phi s dng ty chn BINARY BASE64 . Trong nhng v d trong mc ny, Ti s s dng bng Employees (cng nhn) ca c s d liu Northwind. Bng ny cha nhng chi tit ca Employees lm vic cho cng ty h cu Northwind v cha mt ct c tn Photo .Ct Photo thuc kiu image SQL Server v cha d liu nh phn vi mt nh ca mt cng nhn. Hnh 16.2 cho thy mt pht biu SELECT chy trong Query Analyzer n truy xut nhng ct EmployeeID (kha chnh), FirstName, LastName, v Photo t bng Employees. Ch rng d liu nh phn c truy xut nh nhng s h 16 ( c s16).

Hnh 16.2: Truy xut nhng hng t bng Employees Trong kiu AUTO, d liu nh phn c tr v theo mc nh nh mt tham chiu ti d liu thay v bn thn d liu . V d sau y truy xut nhng ct EmployeeID v Photo cho hai hng u tin t bng Employees s dng kiu AUTO: USE Northwind SELECT TOP 2 EmployeeID, Photo FROM Employees ORDER BY EmployeeID FOR XML AUTO V d ny tr v XML sau y: <Employees EmployeeID="1" Photo="dbobject/Employees[@EmployeeID='1']/@Photo"/> <Employees EmployeeID="2" Photo="dbobject/Employees[@EmployeeID='2']/@Photo"/> Tham chiu ti d liu nh phn c cha trong ct Photo tht s l mt biu thc XPath. (Bn s hc v XPath trong mc k tip.) ly chnh bn thn d liu nh phn, thay v tham chiu ti n, bn cn s dng ty chn BINARY BASE64 . Danh sch 16.6 trnh by mt v d s dng ty chn BINARY BASE64 khi truy xut nhng ct EmployeeID v Photo cho hai hng u tin t bng Employees. Danh sch 16.6: FORXMLAUTOBINARYBASE64. SQL USE Northwind SELECT TOP 2 EmployeeID, Photo FROM Employees ORDER BY EmployeeID FOR XML AUTO, BINARY BASE64 ---------------------------------------------------------------------XML c tr v bi v d ny nh sau: <Employees EmployeeID="1" Photo="FRwvAAIAAA"/> <Employees

EmployeeID="2" Photo="FRwvAAIAAA"/> Ghi ch: Ti ch trnh by 10 ch s u tin ca d liu nh phn. xem d liu nh phn trong Query Analyzer, bn s cn gn ch ca nhng kt qu mc nh l Text trong "hp thoi nhng ty chn". Bn chn Tool > Options t thc n menu hin th hp thoi ny.

Gii thiu XPath


Ngn ng nh du m rng ng dn (XPath) l mt Ngn ng cho php bn tm kim v nh hng mt ti liu XML, v bn c th s dng XPath vi my ch phc v SQL. Trong mc ny bn s khm ph cu trc ca mt ti liu XML (XML document ) v cch nh hng v tm kim mt ti liu XML s dng XPath nh th no. Trong nhng mc sau , bn s hc cch s dng XPath vi my ch phc v SQL nh th no.

Cu trc Ti liu XML


Mt file ti liu XML c chia vo trong nhng nt, vi nt cao nht c tham chiu ti nh nt gc (root node). Cch d dng nht hiu cu trc lm vic nh th no l xem xt mt ti liu XML v d; Danh sch 16.7 cho thy mt ti liu XML cha trong file Customers.xml. Danh sch 16.7: CUSTOMERS.XML <?xml version="1.0"?> <NorthwindCustomers> <Customers> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> <PostalCode>12209</PostalCode> <Country>Germany</Country> <Phone>030-0074321</Phone> </Customers> <Customers> <CustomerID>ANATR</CustomerID> <CompanyName>Ana Trujillo Emparedados y helados</CompanyName> <PostalCode>05021</PostalCode> <Country>Mexico</Country> <Phone>(5) 555-4729</Phone> </Customers> </NorthwindCustomers> Ghi nh: Bn s tm thy tt c nhng file XML trong th mc xml cho chng ny. Ghi nh: phin bn <?xml version="1.0"?> ch nh l Customers.xml ny l mt file XML s dng tiu chun 1.0. Hnh 16.3 cho thy mt s trnh by trc quan ca cu trc ti liu Customers.xml .

Hnh 16.3: Cu trc ti liu Customers.xml Nh bn c th thy t Hnh 16.3, mt ti liu XML c cu trc nh mt cy o ngc. NorthwindCustomers l nt gc (root node). Hai nt Customers di nt gc c bit nh mt tp hp nt (a node set). CustomerID, CompanyName, PostalCode, Country, v Phone c bit nh nhng phn t (elements). Mi nt Customers v nhng phn t CustomerID, CompanyName, PostalCode , Country, v Phone ca n c bit nh mt cy con nt (a node subtree). Mt nt c nh v di nt khc c bit nh mt nt con (child node), v nt trn c bit nh nt cha (parent node); chng hn, nt NorthwindCustomers l nt cha ca nhng nt con Customers. Bn c th xem mt file XML s dng Microsoft Internet Explorer , nh trong Hnh 16.4.

Hnh 16.4: xem Customers.xml trong Internet Explorer Mo nh: m file XML, nhn phi Customers.xml trong Windows Explorer v chn Open With > Internet Explorer t thc n s ra.

Nhng biu thc XPath

tm kim hay nh hng mt file ti liu XML bn cung cp mt biu thc cho XPath. Nhng biu thc ny lm vic bn trong mt ng cnh (a context), l nt hin thi c truy cp bn trong file XML. Nhng cch thng s dng nht v vic ch nh ng cnh c trnh by trong Bng 16.3. Bng 16.3: s ch nh ng cnh Nhng k t / ./ ../ // .// M t Ch nh nt gc nh ng cnh. Ch nh nt hin thi nh ng cnh. Ch nh nt cha m nh ng cnh. Ch nh ton b ti liu XML nh ng cnh. Ch nh ton b ti liu XML bt u ti nt hin thi nh ng cnh.

Chng ta hy xem xt mt s v d v biu thc XPath . V d sau y tr v nhng nt Customers: /NorthwindCustomers/Customers Nh bn c th thy t v d ny, bn ch r ng dn xung cu trc cy ch r nhng nt, phn chia mi nt vi mt k t gch cho (/). //Customers V d k tip tr v nhng nt Customers v tt c cc phn t ca chng: /NorthwindCustomers/Customers/* Ghi nh: du sao (*) ch nh tt c nhng phn t V d k tip tr v ch phn t CustomerID ca nhng nt Customers : /NorthwindCustomers/Customers/CustomerID Bn c th tm thy nhng phn t trong mt nt bi vic ch nh mt s tm kim bn trong du ngoc vung []. V d sau y tr v tt c nhng phn t ca khch hng c mt CustomerID l ALFKI: /NorthwindCustomers/Customers[CustomerID="ALFKI"]/* V d sau y tr v CompanyName ca khch hng vi mt CustomerID l ALFKI: /NorthwindCustomers/Customers[CustomerID="ALFKI"]/CompanyName Bn cng c th s dng nhng du ngoc vung ch nh ch s ca mt nt, bt u ti ch s 1. V d sau y tr li nt u tin Customers: /NorthwindCustomers/Customers[1] Bn c th s dng hm last() ly nt cui cng. V d sau y tr li nt cui cng Customers: /NorthwindCustomers/Customers[last()] Nu file XML ca bn cha nhng thuc tnh nhng thay v nhng phn t gi nhng gi tr, th biu thc tm kim XPath ca bn s hi khc nhau. Danh sch 16.8 cho thy mt file XML c tn CustomersWithAttributes.xml s dng nhng thuc tnh ny. Danh sch 16.8: CUSTOMERSWITHATTRIBUTES.XML <?xml version="1.0"?>

<NorthwindCustomers> <Customers CustomerID="ALFKI" CompanyName="Alfreds Futterkiste" PostalCode="12209" Country="Germany" Phone="030-0074321" /> <Customers CustomerID="ANATR" CompanyName="Ana Trujillo Emparedados y helados" PostalCode="05021" Country="Mexico" Phone="(5) 555-4729" /> </NorthwindCustomers> truy cp mt thuc tnh bn t mt k t (@) ti im bt u ca tn thuc tnh. v d sau y tr v thuc tnh CustomerID ca nhng nt Customers: /NorthwindCustomers/Customers/@CustomerID V d k tip tr v tt c nhng thuc tnh ca khch hng vi mt CustomerID l ALFKI: /NorthwindCustomers/Customers[@CustomerID="ALFKI"]/* V d sau y tr v CompanyName ca khch hng vi mt CustomerID l ALFKI: /NorthwindCustomers/Customers[@CustomerID="ALFKI"]/@CompanyName Ghi nh: Ti ch bn n nhng biu thc XPath trong mc ny. Bn c th s dng nhiu tan t ton hc khc, nhng biu thc i s Boole v nhiu hn na. Bn c th hc nhiu hn v XPath trong ti liu sch trc tuyn ca my ch phc v SQL v ti World Wide Web Consortium's (WC3) Web site ti www.w3.org; hy tm v XPath trong bng mc lc.

Gii thiu XSLT


XML l mt cch tuyt vi trnh by d liu trong mt nh dng linh ng, nhng XML khng cha thng tin v vic lm sao nh dng d liu ny cho s hin th. Extensible Stylesheet Language Transformation (S bin i ngn ng Stylesheet m rng) (XSLT) cho php bn kim sot s nh dng ca d liu XML, v c th thng thay i d liu XML ti mt nh dng thch hp trnh by n nh mt ti liu. Mt stylesheet XSL - cng c bit n nh mt file XSLT- l mt khun mu cha nhng quy tc m t d liu trong file XML s c nh dng nh th no cho s hin th. File XML v XSLT c x l cng nhau bi mt b x l XSLT. Nhng quy tc c nh ngha trong file XSLT c ng dng vo d liu trong file XML, v kt qu cui cng c xut ra bi b x l XSLT.Microsoft Internet Explorer cha mt b x l XSLT, v bn s thy nhng v d trong mc ny trnh by nhng kt qu ca s x l mt file XML v XSLT trong Internet Explorer. Ghi ch : Internet Explorer tht s n cng vi mt file XSLT mc nh, n gy cho nhng file XML s dng nhng mu khc nhau cho nhng phn ca ti liu XML v s c trnh by vi nhng biu tng + v - m rng v co li mng li d liu XML. Danh sch 16.9: CUSTOMERSSTYLESHEET.XSL

<?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <HTML> <HEAD> <TITLE>Customers</TITLE> </HEAD> <BODY> <xsl:for-each select="/NorthwindCustomers/Customers"> <p> <b>Customer:</b> <br><xsl:value-of select="CustomerID"/></br> <br><xsl:value-of select="CompanyName"/></br> <br><xsl:value-of select="PostalCode"/></br> <br><xsl:value-of select="Country"/></br> <br><xsl:value-of select="Phone"/></br> </p> </xsl:for-each> </BODY> </HTML> </xsl:template> </xsl:stylesheet> Nh bn c th thy, file CustomersStylesheet.xsl cha nhng th HTML v nhng th xsl. Nhng th xsl l nhng ch dn ch nh XML s c thay i nh th no. Bn c th tham chiu file XSLT ny trong mt file XML ; nhng quy tc trong file XSLT ri c ng dng vo d liu trong file XML . Bn s hc cch lm iu nh th no sau trong mc ny. Chng ta hy nhn k hn ti nhng hng trong file CustomersStylesheet.xsl . File ny bt u vi hng sau y, n cho bit file s dng XML phin bn 1.0 <?xml version="1.0"?> Nhng hng k tip l nhng th xsl <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> Dng u tin s dng xsl: th stylesheet v ch nh khng gian tn http://www.w3.org/1999/XSL/Transform s c s dng. Dng th hai s dng xsl: th template v gn thuc tnh ph hp ti /, n ch r ton b ti liu XML s c chn v s dng bi b x l XSLT, bt u ti nt gc. Ghi ch: Bn c th gn thuctnh match cho bt k biu thc XPath no. Chng hn, nu bn gn match ti //Customers, th tt c nhng nt Customers s c chn. Nhng dng k tip l nhng th HTML, n bt u phn HTML ca file, nh ngha mt u mc, v bt u thn mc. <HTML> <HEAD> <TITLE>Customers</TITLE>

</HEAD> <BODY> Nhng hng k tip l ni dung thc s ca file XSLT v s dng xsl: th for -each lp qua nhng nt Customers: <xsl:for-each select="/NorthwindCustomers/Customers"> <p> <b>Customer:</b> <br><xsl:value-of select="CustomerID"/></br> <br><xsl:value-of select="CompanyName"/></br> <br><xsl:value-of select="PostalCode"/></br> <br><xsl:value-of select="Country"/></br> <br><xsl:value-of select="Phone"/></br> </p> </xsl:for-each> Cn li dng gn st nhng phn HTML v xsl ca file: </BODY> </HTML> </xsl:template> </xsl:stylesheet> File XSLT ch cha nhng quy tc thay i d liu XML; chng ti vn cn cn cung cp chnh d liu XML. Danh sch 16.10 cho thy mt file XML c tn CustomersUsingStylesheet.xml, cha d liu XML cho hai khch hng. Danh sch 16.10: CUSTOMERSUSINGSTYLESHEET.XML <?xml version="1.0"?> <?xml-stylesheet type="text/xsl" href="CustomersStylesheet.xsl"?> <NorthwindCustomers> <Customers> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> <PostalCode>12209</PostalCode> <Country>Germany</Country> <Phone>030-0074321</Phone> </Customers> <Customers> <CustomerID>ANATR</CustomerID> <CompanyName>Ana Trujillo Emparedados y helados</CompanyName> <PostalCode>05021</PostalCode> <Country>Mexico</Country> <Phone>(5) 555-4729</Phone> </Customers> </NorthwindCustomers> Danh sch ny ng nht vi File Customers.xml c trnh by trc trong Danh sch 16.7 nhng vi s thm ca hng sau, n tham chiu file CustomersStylesheet.xsl: <?xml-stylesheet type="text/xsl" href="CustomersStylesheet.xsl"?> Dng ny gy ra b x l XSLT c v p dng nhng quy tc trong file CustomersStylesheet.xsl ln d liu XML trong file CustomersUsingStylesheet.xml . Hnh 16.5 trnh by CustomersUsingStylesheet.xml hin th nh th no khi xem bng Intrenet Explorer . xem file ny, kch phi vo CustomersUsingStylesheet.xml

trong Windows Explorer v chn Open With > Internet Explorer.

Hnh 16.5: xem CustomersUsing- Stylesheet.xml trong Internet Explorer Khi bn m CustomersUsingStylesheet.xml, B x l XSLT ca Internet Explorer m file CustomersStylesheet.xsl v p dng nhng quy tc trong n vo d liu XML trong CustomersUsingStylesheet.xml. u ra c pht sinh bi b x l XSLT v ri c trnh by trong Internet Explorer. Ti ch bn n s dng XSLT trong mc ny. XSLT l mt ngn ng rt mnh cha ng nhiu chc nng bn c th s dng nh dng d liu XML ca bn. bit chi tit hn, xem Mastering XSLT vit bi Chuck White (Sybex, 2002). Bn cng c th hc nhiu hn ti trang web ca tp on mng ton cu ti www.w3.org; hy tm trong XSLT trong bng mc lc.

Truy cp My ch phc v SQL s dng HTTP


Bn c th truy cp My ch phc v SQL s dng HTTP "Giao thc chuyn i siu vn bn"(Hypertext Transfer Protocol). N cho php bn chy nhng cu lnh SQL t mt b duyt. Chng hn, bn c th chy mt pht biu SELECT tr li XML, v My ch phc v SQL s trnh by nhng kt qu trong b duyt ca bn. Bn c th s dng nhng pht biu XPath nh v d liu trong XML c tr v, v s dng XSL stylesheets nh dng XML c tr li. Ti s ch cho bn cch lm tt c nhng th ny trong mc ny. Cnh bo: Bn c th thm ch chy nhng pht biu INSERT, UPDATE, v DELETE - nhng Bn s cn phi cn thn v vic hn ch kh nng chy nhng kiu pht biu ny bi v mt ngi s dng sai lm c th d dng ph hoi c s d liu ca bn. Trc khi bn c th truy cp my ch phc v SQL s dng HTTP, Bn s cn nh hnh s h tr SQL XML cho IIS (My ch phc v thng tin Internet).

nh hnh s h tr SQL XML cho IIS


nh hnh s h tr SQL XML cho IIS, chn Start > Programs > Microsoft SQL Server > Configure SQL XML Support in IIS. iu ny khi ng "B qun l th mc thc t IIS" (IIS Virtual Directory Management ) cho bn iu khin My ch phc v SQL, nh trnh by trong Hnh 16.6. Bn s dng bn iu khin ny nh ngha mt th mc thc t thng qua Bn truy cp my ch phc v SQL qua HTTP.

Hnh 16.6: Qun l th mc thc t IIS cho bn iu khin my ch phc v SQL Tip theo, nhn phi trn trang web mc nh v s chn New > Virtual Directory t menu s xung. Bn s cn gn nhng thuc tnh cho th mc o ca bn s dng New Virtual Directory Properties window (ca s nhng thuc tnh Th mc o mi) . Ca s ny cha su th, th u tin c tn General, bn thng gn tn Th mc o ca bn (Tn m thng qua bn truy cp my ch phc v SQL) v ng dn cc b (H thng file ca Th mc thc t trong my tnh ca bn ni bn lu tr nhng file, nh nhng file XML v XSLT). Ti c t tn Th mc Thc t ca ti ti Northwind v ng dn cc b ca ti ti F :\ Northwind, nh trnh by trong Hnh 16.7.

Hnh 16.7: vic t tn th mc o v ng dn cc b Khi bn m CustomersUsingStylesheet.xml, B x l XSLT ca Internet Explorer s m file CustomersStylesheet.xsl v p dng nhng quy tc trong n vo d liu XML trong CustomersUsingStylesheet.xml. u ra c pht sinh bi b x l XSLT ri c trnh by trong Internet Explorer.

Cnh bo: th mc bn ch nh cho ng dn cc b ca bn phi ang tn ti trong h thng tp tin ca my tnh ca bn. To ra n s dng Windows Explorer, v duyt ti th mc ny s dng nt browse. Tip theo, bn s dng th Security thit t nhng chi tit v cch xc nhn ngi s dng khi truy nhp my ch phc v SQL nh th no. Ti c s dng ti khan SQL Server sa , nh trnh by trong hnh 16.8.

Hnh 16.8: thit t chi tit thm quyn Cnh bo: Trong mt h thng sn xut, bn s mun s dng mt ti khon c nhng hn ch quyn hn trong c s d liu. Chng hn, bn c l s mun ch cho php s truy cp c ti nhng bng. Tip theo, bn s dng th Data Source gn ti my ch phc v SQL no m bn mun s dng, cng vi c s d liu m bn mun truy cp. Ti chn my ch phc v local SQL v c s d liu Northwind, nh trong Hnh 16.9.

Hnh 16.7: Gn Tn Th mc o v ng dn cc b Cnh bo: th mc bn ch nh cho ng dn a phng ca bn phi ang tn ti trong h thng tp tin ca my tnh ca bn. To ra n s dng Windows Explorer, v duyt ti th mc ny s dng nt browse. Tip theo, bn s dng th Security thit t nhng chi tit v cch xc nhn ngi s dng khi truy cp my phc v SQL nh th no. Ti c s dng ti khan SQL server sa, nh trong hnh 16.8.

Hnh 16.8: thit t chi tit quyn hn Cnh bo: Trong mt h thng sn xut, bn s mun s dng mt ti khon c nhng hn ch quyn hn trong c s d liu. v d bn c l s mun cho php s truy cp ch c c ti nhng bng. Tip theo, bn s dng th Data Source gn My ch phc v SQL no bn mun s dng, cng vi c s d

liu bn mun truy cp. Ti c chn my ch phc v local SQL v c s d liu Northwind, nh trong Hnh 16.9.

Hnh 16.9: thit t ngun d liu Tip theo, bn s dng th Settings ch nh kiu truy cp ti SQL Server bn mun cp pht. chn kim nhng hp kim sau y: Allow URL Queries (cho php s thc thi trc tip ca nhng cu lnh SQL), Allow Template Queries (cho php s dng XML v nhng file XSLT truy xut v nh dng nhng kt qu t c s d liu), v Allow XPath Queries (cho php s thc thi ca nhng truy vn vi nhng biu thc XPath), nh trnh by trong Hnh 16.10.

Hnh 16.10: thit t kiu truy nhp Cnh bo: Trong mt h thng sn xut, bn s mun hn ch s truy nhp ch cho php nhng truy vn

khun mu .Bng cch ny, nhng ngi s dng ch c th thc thi nhng truy vn c nh ngha trong mt file khun mu XML. Tip theo, bn s dng th Virtual Names v gin mt m hnh c s d liu, mt th mc template cha nhng file XML v XSLT , hay mt i tng c s d liu (dbobject) ti mt ng dn lin quan vi th mc o ca cc bn. Kch nt New v gn Virtual Name ca bn ti Templates, Kiu ca khun mu, v ng dn ca bn ti mt danh mc con tn Templates trong th mc Northwind ca bn, nh c trnh by trong Hnh 16.11. Bn s cn to th mc nhng khun mu trc tin.

Hnh 16.11: thit t cu hnh tn o Cnh bo: Nhng danh mc con khun mu (Templates subdirectory ) m bn ch nh trong ng dn ca bn phi ang tn ti trong h thng tp tin ca my tnh ca bn. S dng Windows Explorer to n, v ri duyt ti th mc ny s dng nt ellipsis (...) bn phi ca Path field (trng ng dn). Kch Save tip tc. Bn ng thay i bt c th g trong th Advanced, nhng c thoi mi nghin cu n nu bn mun . Kch OK lu nhng s thit t ca bn qua tt c cc th. Th mc o mi ca bn c to ra v s xut hin trong IIS Virtual Directory Management (Qun l th mc o IIS cho bn iu khin SQL Server.

Chy nhng pht biu SQL trc tip s dng mt B duyt (Browser).
Trong mc ny, bn s hc cch chy trc tip nhng cu lnh SQL nh th no s dng mt b duyt. Ti s s dng Internet Explorer trong nhng v d, nhng bn c th s dng d b duyt no bn mun.

Chy nhng pht biu SELECT


Trong mc ny, bn s thy cch chy mt pht biu SELECT nh th no. Chng hn, tr b duyt ca cc bn ti s URL sau , c cha mt pht biu SELECT dc nhng : http://localhost/Northwind?sql=SELECT+*+FROM+Customers+WHERE+CustomerID+IN+('ALFKI' ,'ANATR')+FOR+XML+AUTO&root=ROOT Nh bn c th thy, pht biu SELECT trong URL ny truy xut hai hng t bng nhng khch hng. B phn u tin ca URL l: http://localhost/Northwind N cha tn ca my ch phc v (localhost) v th mc o (Northwind). B phn th hai ca URL l: ?sql=SELECT+*+FROM+Customers+WHERE+CustomerID+IN+('ALFKI','ANATR')+FOR+XML+ AUTO&root=ROOT N cha pht biu SELECT c nhng. V URLs khng cho php nhng khong cch, bn s dng nhng k t (+) thay vo . Tham s gc (root) cui ca URL cung cp mt tn cho phn t gc trong XML c tr

v bi pht biu SELECT; Ti c cung cp mt tn gc l ROOT trong v d trc , nhng bn c th s dng bt c tn no bn mun. Hnh 16.12 cho thy kt qu ca vic chy pht biu SELECT trong Internet Explorer.

Hnh 16.12: la chn nhng khch hng v trnh by nhng kt qu Cnh bo: Nu bn b qua tham s root trong URL ca bn, th bn s nhn c li sau : "Only one top level element is allowed in an XML document." ( ch mt phn t u c cho php trong mt ti liu XML.) Nhng khong cch khng phi l ch nhng k t bn s cn thay th trong URL ca bn. Bng 16.4 cho thy mt s nhng k t c bit bn c th s dng trong mt pht biu SQL v s thay th bn s dng trong URL . Bng 16.4: nhng k t c bit trong mt cu lnh SQL v nhng s thay th ca chng trong mt URL K t trong cu lnh SQL S thay th URL Space / ? % # & + %2F %3F %25 %23 %26

Chng hn, nu bn mun s dng LIKE ' C%' trong pht biu SELECT ca bn, th bn s s dng LIKE +' C% 25', Nh trnh by trong URL sau: http://localhost/Northwind?sql=SELECT+*+FROM+Customers+WHERE+CompanyName+LIKE+' C%25 '+FOR+XML+AUTO&root=ROOT Pht biu SELECT trong URL ny truy xut nhng hng t bng Customers c CompanyName bt u vi C.

Chy nhng pht biu INSERT, UPDATE, v DELETE:


Bn c th nhng vo mt URL nhng pht biu INSERT, UPDATE, v DELETE . V d sau y s dng mt s pht biu INSERT thm mt hng mi vo bng Customers:

http://localhost/Northwind?sql=INSERT+INTO+Customers(CustomerID,CompanyName)+VALUES +('J9COM','J9+Company')&root=ROOT Hnh 16.13 cho thy kt qu ca vic chy pht biu INSERT ny trong Internet Explorer.

Hnh 16.13: Thm mt hng mi vo bng Customers V d k tip s dng mt pht biu DELETE loi b hng mi: http://localhost/Northwind?sql=DELETE+FROM+Customers+WHERE+CustomerID= 'J9COM'&root=ROOT Cnh bo: Bn s hu nh chc chn mun ngn nga nhng ngi s dng chy nhng pht biu INSERT, UPDATE, v DELETE qua HTTP trn my ch phc v sn xut ca bn. Bn c th lm iu ny bi vic cn tr nhng ngi s dng chy nhng cu lnh SQL trc tip, nh c m t trong mc trc y, hay bi vic hn ch nhng quyn hn gn ti ngi s dng c s d liu. Bn cng c th cho php nhng truy nhp ti c s d liu ch c s dng th tc tr; bn s thy cch chy mt th tc lu tr nh th no- s dng mt URL trong mc k tip.

Chy nhng th tc lu tr:


Bn cng c th chy nhng th tc lu tr t mt URL. Danh sch 16.11 cha mt Script to ra mt th tc lu tr c tn CustomersFromCountry(). Th tc ny truy xut nhng hng t bng Customers vi mt Country ph hp vi tham s @MyCountry c chuyn ti CustomersFromCountry(). Danh sch 16.11: CUSTOMERSFROMCOUNTRY.SQL /* CustomersFromCountry.sql creates a procedure that retrieves rows from the Customers table whose Country matches the @MyCountry parameter */ CREATE PROCEDURE CustomersFromCountry @MyCountry nvarchar(15) AS SELECT * FROM Customers WHERE Country = @MyCountry FOR XML AUTO Bn chy th tc lu tr ny s dng URL sau y: http://localhost/Northwind?sql=EXECUTE+CustomersFromCountry+@MyCountry='UK' &root=ROOT Hnh 16.14 cho thy kt qu ca vic chy th tc lu tr.

Hnh 16.14: chy mt th tc lu tr

Chy nhng cu lnh SQL s dng mt khun mu XML


Bn cng c th thc hin nhng cu lnh SQL s dng mt khun mu XML, l mt file XML cha pht biu SQL c nhng ca bn. Danh sch 16.12 cho thy file v d c tn Customers.xml cha mt s pht biu SELECT c nhng. Danh sch 16.12: nhng khch hng.XML <?xml version="1.0"?> <Northwind xmlns:sql="urn:schemas-microsoft-com:xml-sql"> <sql:query> SELECT TOP 2 CustomerID, CompanyName, City, Country FROM Customers ORDER BY CustomerID FOR XML AUTO, ELEMENTS </sql:query> </Northwind> Ghi ch: Bn s tm thy file Customers.xml v nhng file XML v XSLT khc s dng trong mc tip theo- trong th mc xml\Northwind\Templates . Bn s cn sao chp files ny vo trong th mc Templates bn thit lp trc cho th mc o my ch phc v SQL ca bn. Ch : pht biu SELECT c t bn trong nhng th sql:query v / sql:query . Th Northwind pha ngoi l nt gc thuc XML. chy file Customers.xml , tr b duyt ca bn ti URL sau : http://localhost/Northwind/Templates/Customers.xml Hnh 16.15 cho thy kt qu ca vic chy file Customers.xml trong Internet Explorer.

Hnh 16.15: chy file Customers.xml

nh dng u ra XML s dng mt XSL Stylesheet


Nh bn s hc trong mc ny, bn c th nh dng u ra XML c pht sinh bi SQL my ch phc v s dng mt XSL stylesheet. c bit, bn s thy cch nh dng XML c ch ra trc trong Hnh 16.14 nh th no. Danh sch 16.13 trnh by mt file XSL stylesheet c tn CustomersStylesheet.xsl. Danh sch 16.13: CUSTOMERSSTYLESHEET.XSL <?xml version="1.0"?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:template match="/"> <HTML> <HEAD> <TITLE>Customers</TITLE> </HEAD> <BODY> <xsl:for-each select="Northwind/Customers"> <p> <b>Customer:</b> <br><xsl:value-of select="CustomerID"/></br> <br><xsl:value-of select="CompanyName"/></br> <br><xsl:value-of select="PostalCode"/></br> <br><xsl:value-of select="Country"/></br> <br><xsl:value-of select="Phone"/></br> </p> </xsl:for-each> </BODY> </HTML> </xsl:template> </xsl:stylesheet>

Ch : biu thc select XPath ny trong th xsl: for - each c gn ti Northwind/ Customers. Northwind l nt gc t XML c pht sinh , v Customers l nhng nt con t gc. Bi vy, biu thc XPath ny la chn tt c nhng nt Customers t bt k XML no pht sinh bi my ch phc v SQL. Danh sch 16.14 cho thy mt file XML c tn CustomersUsingStylesheet.xml, m s dng file CustomersStylesheet.xsl . CustomersUsingStylesheet.xml truy xut hai hng u tin t bng Customers. Danh sch 16.14: CUSTOMERSUSINGSTYLESHEET.XML <?xml version="1.0"?> <Northwind xmlns:sql="urn:schemas-microsoft-com:xml-sql" sql:xsl="CustomersStylesheet.xsl"> <sql:query> SELECT TOP 2 CustomerID, CompanyName, PostalCode, Country, Phone FROM Customers ORDER BY CustomerID FOR XML AUTO, ELEMENTS </sql:query> </Northwind> chy file CustomersUsingStylesheet.xml , tr b duyt ca bn ti URL sau : http://localhost/Northwind/Templates/CustomersUsingStylesheet.xml?contenttype= text/html Ch : tham s contenttype cui URL ny c gn ti vn text/html, m ch nh ni dung ny s c trnh by nh HTML. Cnh bo: nu bn b qua tham s contenttype, th bn s nhn c thng bo li sau: End tag 'HEAD' does not match the start tag 'META' (th cui 'HEAD' khng ph hp vi th u 'META'). Hnh 16.16 cho thy kt qu ca vic chy file CustomersUsingStylesheet.xml trong IE. Ch u ra c nh dng s dng nhng quy tc c nh ngha trong file CustomersStylesheet.xsl.

Hnh 16.16: chy file CustomersUsing- Stylesheet. xml

S dng hm OPENXML() ca my ch phc v SQL

My ch phc v SQL cha mt hm c tn OPENXML() n cho php bn c d liu XML nh th l mt tp hp kt qu ca nhng hng. Mt s dng ca OPENXML() l c d liu XML nh nhng hng, v ri chn nhng hng ny vo trong mt bng. Trong mc ny, bn s khm ph c php ca OPENXML(). Bn cng s thy mt v d c d liu XML cha nhng chi tit ca hai khch hng s dng OPENXML(), v sau bn s chn hai hng mi vo trong bng Customers s dng nhng gi tr t d liu XML ny.

C php OPENXML()
OPENXML(XmlDocumentHandle int [IN], RowPattern nvarchar [IN], [Flags byte[IN]]) [WITH (SchemaDeclaration | TableName)] VI: XmlDocumentHandle : ch r mt int handle ti ti liu XML ca bn. Bn s dng handle ny nh mt tham chiu ti ti liu XML ca bn. RowPattern: ch r mt biu thc XPath la chn d liu bn yu cu t ti liu XML ca bn. Flags: ch r mt gi tr byte ty chn m bn dng ch nh nh x gia d liu XML ca bn v nhng gi tr ct c s d liu. Gi tr 1 ch bo d liu XML ang c c ca bn - ct gi nhng gi tr ct trong nhng thuc tnh nhng ca nhng nt (Danh sch 16.8, c ch ra trc , minh ha nhng thuc tnh nhng); y l mc nh. Gi tr 2 ch bo d liu XML ca bn lu tr nhng gi tr ct nh nhng phn t mng li ring bit (Danh sch 16.7, c ch ra trc , minh ha nhng phn t mng li). Nhng gi tr t file XML ca bn s c s dng nh nhng gi tr ct trong nhng hng ta v bi OPENXML(). SchemaDeclaration: ch r nh ngha ca m hnh c s d liu bn mun s dng tr v nhng hng nh th. Mt nh ngha v d l CustomerID nvarchar(5), CompanyName nvarchar(40). Bn s dng SchemaDeclaration hoc TableName. TableName: ch r tn ca bng c s d liu bn mun s dng. Bn s in hnh s dng TableName hn l SchemaDeclaration khi bn ang lm vic vi mt bng m tn ti trong c s d liu.

S dng OPENXML()
Trc khi gi OPENXML(), u tin bn phi gi th tc sp_xml_preparedocument() . Th tc ny phn tch ti liu XML ca bn v chun b mt bn sao ca ti liu ny trong b nh. Ri bn s dng bn sao ny ca ti liu XML vi OPENXML(). Mt khi bn hon thnh lnh gi ca bn ti OPENXML() Bn gi th tc sp_xml_removedocument() loi b ti liu XML khi b nh. V d trong mc ny s dng mt th tc lu tr c tn AddCustomersXml() c d liu XML cha nhng chi tit ca hai khch hng- s dng OPENXML() v chn hai hng mi vo trong bng Customers s dng nhng gi tr t d liu XML ny. Danh sch 16.15 cho thy mt script c tn AddCustomersXml.sql n to ra th tc lu tr AddCustomersXml() . Danh sch 16.15: ADDCUSTOMERSXML.SQL /* AddCustomersXml.sql creates a procedure that uses OPENXML() to read customers from an XML document and then inserts them into the Customers table */ CREATE PROCEDURE AddCustomersXml @MyCustomersXmlDoc nvarchar(4000) AS - declare the XmlDocumentId handle DECLARE @XmlDocumentId int

- prepare the XML document EXECUTE sp_xml_preparedocument @XmlDocumentId OUTPUT, @MyCustomersXmlDoc - read the customers from the XML document using OPENXML() - and insert them into the Customers table INSERT INTO Customers SELECT * FROM OPENXML(@XmlDocumentId, N'/Northwind/Customers', 2) WITH Customers - remove the XML document from memory EXECUTE sp_xml_removedocument @XmlDocumentId OPENXML() c XML t ti liu c ch r bi handle @XmlDocumentId v tr v nhng hng cho pht biu INSERT. Nhng hng ny ri c thm vo bng Customers bi pht biu INSERT. Danh sch 16.16 cho thy mt script c tn RunAddCustomers.sql - chy th tc AddCustomersXml() . Danh sch 16.16: RUNADDCUSTOMERS.SQL /* RunAddCustomersXml.sql runs the AddCustomersXml() procedure */ - define the XML document DECLARE @NewCustomers nvarchar(4000) SET @NewCustomers = N' <Northwind> <Customers> <CustomerID>T1COM</CustomerID> <CompanyName>Test 1 Company</CompanyName> </Customers> <Customers> <CustomerID>T2COM</CustomerID> <CompanyName>Test 2 Company</CompanyName> </Customers> </Northwind>' - run the AddCustomersXml() procedure EXECUTE AddCustomersXml @MyCustomersXmlDoc=@NewCustomers - display the new rows SELECT CustomerID, CompanyName FROM Customers WHERE CustomerID IN ('T1COM', 'T2COM') - delete the new rows DELETE FROM Customers WHERE CustomerID IN ('T1COM', 'T2COM') Hnh 16.17 cho thy kt qu ca vic chy script RunAddCustomers.sql trong Query Analyzer.

Hnh 16.17: chy script RunAddCustomers. sql

S dng mt i tng XmlDocument lu tr mt ti liu XML


Bn s dng mt i tng ca lp XmlDocument i din cho mt ti liu XML trong mt chng trnh C#. Mt i tng XmlDocument lu tr nhng nt ca ti liu XML trong nhng i tng ca lp XmlNode. Bn c th, chng hn, ti nhng hng t c s d liu vo trong mt i tng Dataset, ri ti mt s trnh by XML ca nhng hng vo trong mt i tng XmlDocument. Bng 16.5 cho thy mt s nhng thuc tnh XmlDocument; Bng 16.6 cho thy mt s nhng phng php XmlDocument; v Bng 16.7 trnh by nhng s kin XmlDocument. Bng 16.5: nhng thuc tnh XmlDocument Thuc tnh Attributes BaseURI ChildNodes DocumentType FirstChild HasChildNodes Implementation InnerText InnerXml IsReadOnly LastChild LocalName Kiu d liu M t XmlAttributeCollection Ly i tng XmlAttributeCollection cha nhng thuc tnh ca nt hin thi. string XmlNodeList XmlDocumentType XmlNode bool XmlImplementation string string bool XmlNode string Ly c s URI ca nt hin thi. Ly tt c nhng nt con ca nt. Ly i tng XmlElement gc cho ti liu XML. Ly nt cha khai bo DOCTYPE. Ly nt con u tin. Ly mt bool cho bit liu nt ny c bt k nt con no khng. Ly i tng XmlImplementation cho ti liu XML. Ly hay gn nhng gi tr rng buc ca nt v tt c nt con ca n. Ly hay gn XML i din cho nt con hin thi. Ly mt gi tr bool cho bit liu c phi nt hin thi l ch c. Ly nt con cui cng. Ly tn a phng ca nt.

DocumentElement XmlElement

Name NamespaceURI NameTable NextSibling NodeType OuterXml OwnerDocument ParentNode Prefix

string string XmlNameTable XmlNode XmlNodeType string XmlDocument XmlNode string

Ly tn c tiu chun ca nt. Ly khng gian tn URI ca nt. Ly i tng XmlNameTable c lin h vi s thi hnh XML. Ly ngay lp tc nt tip theo sau nt hin thi. Ly kiu ca nt hin thi. Ly XML i din cho nt hin thi v tt c nt con ca n. Ly i tng XmlDocument m nt hin thi thuc v. Ly nt cha ca nt hin thi. Ly hay gn tin t namespace ca nt hin thi. Ly hay gn mt gi tr bool cho bit liu c phi khang trng s c duy tr khi XML c ti hay lu. M nh l false. Ly ngay lp tc nt trc nt hin thi. Ly hay gn gi tr ca nt hin thi Gn i tng XmlResolver dng cho vic gii quyt nhng ti nguyn ngoi.

PreserveWhitespace bool PreviousSibling Value XmlResolver XmlNode string XmlResolver

Bng 16.6: nhng phng thc XmlDocument Phng thc AppendChild() CloneNode() CreateAttribute() CreateCDataSection() CreateComment() Kiu tr v M t XmlNode XmlNode XmlAttribute XmlCDataSection XmlComment

Thm nt c ch nh vo cui ca nhng nt con. To ra mt bn sao ca nt. To ra mt i tng XmlAttribute ca tn c ch nh. To ra mt i tng XmlCDataSection vi d liu ch nh. To ra mt i tng XmlComment vi d liu ch nh.

CreateDocumentFragment() XmlDocumentFragment To ra mt i tng XmlDocumentFragment vi d liu ch nh. CreateDocumentType() CreateElement() CreateEntityReference() CreateNavigator() CreateNode() CreateTextNode() CreateWhitespace() CreateXmlDeclaration() GetElementById() XmlDocumentType XmlElement XmlEntityReference XpathNavigator XmlNode XmlText XmlWhitespace XmlDeclaration XmlElement To ra mt i tng XmlDocumentType mi vi d liu ch nh. B qu ti. To ra mt i tng XmlElement. To ra mt i tng XmlEntityReference vi tn c ch r. To ra mt i tng XpathNavigator m bn c th dng nh hng ti liu XML. B qu ti. To ra mt i tng XmlNode. To ra mt i tng XmlText vi vn bn c ch r. To ra mt i tng XmlWhitespace. To ra mt i tng XmlDeclaration. Ly i tng XmlElement vi ID c ch r. B qu ti. Tr v mt i tng XmlNodeList cha mt danh sch ca tt c cc phn t con ph hp vi tn c ch r. Tm khai bo xmlns gn nht vi tin t khng gian tn ch nh trong phm vi cho nt hin thi, v tr v khng gian tn URI. Tm khai bo xmlns gn nht vi khng gian tn URI ch

GetElementsByTagName() XmlNodeList

GetNamespaceOfPrefix()

string

GetPrefixOfNamespace()

string

nh trong phm vi cho nt hin thi, v tr v tin t khng gian tn. ImportNode() InsertAfter() InsertBefore() Load() LoadXml() PrependChild() ReadNode() XmlNode XmlNode XmlNode void void XmlNode XmlNode Nhp vo mt nt t ti liu XML khc vo trong ti liu XML hin thi. Chn nt c ch r ngay sau nt tham chiu ch nh. Chn nt c ch r ngay trc nt tham chiu ch nh. B qu ti. Ti d liu XML vo trong i tng XmlDocument ca bn. Ti ti liu XML t chui c ch r vo trong i tng XmlDocument ca bn. Thm nt c ch r vo ni bt u ca nhng nt con. To ra mt i tng XmlNode da vo thng tin trong mt i tng XmlReader c ch r. XmlReader ca bn phi c nh v trn mt nt hay thuc tnh. Loi b tt c nt con v nhng thuc tnh ca nt hin thi. Loi b nt con ch nh. Thay mt nt con vi nt khc. B qu ti. Lu ti liu XML ti v tr c ch r. B qu ti. La chn mt danh sch ca nhng nt ph hp vi biu thc XPath c ch r. B qu ti. La chn XmlNode u tin ph hp vi biu thc XPath c ch r. Lu tt c ti liu con ca ti liu XML vo i tng XmlWriter c ch nh. Lu ti liu XML vo i tng XmlWriter ch nh.

RemoveAll() RemoveChild() ReplaceChild() Save() SelectNodes() SelectSingleNode() WriteContentTo() WriteTo()

void XmlNode XmlNode void XmlNodeList XmlNode void void

Bng 16.7: nhng s kin XmlDocument S kin Event Handler M t

NodeChanging XmlNodeChangedEventHandler Khi pht trc khi mt gi tr trong mt nt c thay i. NodeChanged XmlNodeChangedEventHandler Khi pht sau khi mt gi tr trong mt nt c thay i. NodeInserting XmlNodeChangedEventHandler Khi pht trc khi mt nt c chn vo. NodeInserted XmlNodeChangedEventHandler Khi pht sau khi mt nt c chn vo. NodeRemoving XmlNodeChangedEventHandler Khi pht trc khi mt nt c loi b. NodeRemoved XmlNodeChangedEventHandler Khi pht sau khi mt nt c loi b. Danh sch 16.17 cho thy mt chng trnh minh ha s s dng mt i tng XmlDocument. Chng trnh ny thc hin nhng bc sau y 1. To ra mt i tng ataset c tn myDataSet v in y n vi hai hng u tin t bng nhng khch hng. 2. To ra mt i tng XmlDocument c tn myXmlDocument, v sau ti n vi XML t myDataSet. Bn c th s dng phng thc GetXml() tr v nhng hng Customer trong myDataSet nh mt chui cha mt ti liu XML y . ri bn c th s dng chui u ra t GetXml() nh u vo phng thc LoadXml() ca myXmlDocument; iu ny ti myXmlDocument vi ti liu XML cha nhng chi tit khch hng (customer details).

3. Trnh by XML trong myXmlDocument s dng phng thc Save() , thng qua Console.Out ti phng thc Save(). iu ny dn n ti liu XML s c trnh by trn mn hnh. 4. Truy xut nhng i tng XmlNode trong myXmlDocument s dng phng thc SelectNodes() , v sau trnh by vn bn c cha ng trong nhng nt con ca mi XmlNode s dng thuc tnh InnerText. Bn chuyn mt biu thc XPath ti SelectNodes() truy xut nhng nt c yu cu . 5. Truy xut XmlNode cho khch hng ANATR s dng phng thc SelectSingleNode() , v hin th vn bn cha trong nhng nt con ca XmlNode ny. Bn chuyn mt biu thc XPath ti SelectSingleNode() truy xut nt c yu cu. Danh sch 16.17: USINGXMLDOCUMENT.CS /* UsingXmlDocument.cs illustrates the use of an XmlDocument object */ using System; using System.Data; using System.Data.SqlClient; using System.Xml; class UsingXmlDocument { public static void Main() { SqlConnection mySqlConnection = new SqlConnection( "server=localhost;database=Northwind;uid=sa;pwd=sa" ); SqlCommand mySqlCommand = mySqlConnection.CreateCommand(); mySqlCommand.CommandText = "SELECT TOP 2 CustomerID, CompanyName, Country "+ "FROM Customers "+ "ORDER BY CustomerID"; SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(); mySqlDataAdapter.SelectCommand = mySqlCommand; // step 1: create a DataSet object and fill it with the top 2 rows // from the Customers table DataSet myDataSet = new DataSet(); mySqlConnection.Open(); mySqlDataAdapter.Fill(myDataSet, "Customers"); mySqlConnection.Close(); // step 2: create an XmlDocument object and load it with the XML from // the DataSet; the GetXml() method returns the rows in // myDataSet as a string containing a complete XML document; and // the LoadXml() method loads myXmlDocument with the XML document // string returned by GetXml() XmlDocument myXmlDocument = new XmlDocument(); myXmlDocument.LoadXml(myDataSet.GetXml()); // step 3: display the XML in myXmlDocument using the Save() method Console.WriteLine("Contents of myXmlDocument:"); myXmlDocument.Save(Console.Out); // step 4: retrieve the XmlNode objects in myXmlDocument using the // SelectNodes() method; you pass an XPath expression to SelectNodes()

Console.WriteLine("\n\nCustomers:"); foreach (XmlNode myXmlNode in myXmlDocument.SelectNodes("/NewDataSet/Customers")) { Console.WriteLine("CustomerID = "+ myXmlNode.ChildNodes[0].InnerText); Console.WriteLine("CompanyName = "+ myXmlNode.ChildNodes[1].InnerText); Console.WriteLine("Country = "+ myXmlNode.ChildNodes[2].InnerText); } // step 5: retrieve the XmlNode for the ANATR customer using // the SelectSingleNode() method; you pass an XPath // expression to SelectSingleNode Console.WriteLine("\nRetrieving node with CustomerID of ANATR"); XmlNode myXmlNode2 = myXmlDocument.SelectSingleNode( "/NewDataSet/Customers[CustomerID=\" ANATR\"]" ); Console.WriteLine("CustomerID = "+ myXmlNode2.ChildNodes[0].InnerText); Console.WriteLine("CompanyName = "+ myXmlNode2.ChildNodes[1].InnerText); Console.WriteLine("Country = "+ myXmlNode2.ChildNodes[2].InnerText); } } Ghi nh, Bn s cn thay i chui kt ni cho i tng SqlConnection ca bn kt ni ti c s d liu ca bn gn im khi u ca chng trnh ny. u ra t chng trnh ny nh sau: Contents of myXmlDocument: <?xml version="1.0" encoding="IBM437"?> <NewDataSet> <Customers> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> <Country>Germany</Country> </Customers> <Customers> <CustomerID>ANATR</CustomerID> <CompanyName>Ana Trujillo Emparedados y helados</CompanyName> <Country>Mexico</Country> </Customers> </NewDataSet> Customers: CustomerID = ALFKI CompanyName = Alfreds Futterkiste Country = Germany CustomerID = ANATR CompanyName = Ana Trujillo Emparedados y helados Country = Mexico

Retrieving node with CustomerID of ANATR CustomerID = ANATR CompanyName = Ana Trujillo Emparedados y helados Country = Mexico

S dng mt i tng XmlDataDocument lu mt ti liu XML


Trong mc trc y, bn xem xt cch s dng mt i tng XmlDocument lu tr mt ti liu XML cha nhng chi tit khch hng truy xut c t mt Dataset nh th no. iu ny rt tt, nhng n khng phi l tuyt nu bn c th kt hp sc mnh ca mt XmlDocument vi mt Dataset sao? vng , bn c th! l ni m lp XmlDataDocument i vo. Bn s dng mt i tng ca lp XmlDataDocument truy cp nhng hng nh nhng i tng XmlNode ln nhng i tng DataRow c quan h. Bn kt hp mt Dataset vi XmlDataDocument ca bn bi vic chuyn Dataset ca bn ti b khi dng XmlDataDocument. Mt i tng XmlDataDocument cung cp s ng b gia Dataset v ti liu XML. Chng hn, nu bn thm mt khch hng mi nh mt i tng XmlNode ti XmlDataDocument ca bn, Ri khch hng ny cng c thm nh mt DataRow vo Dataset lin h ca bn. Tng t, nu bn thm mt khch hng mi nh mt DataRow vo Dataset ca bn, th khch hng ny cng c thm nh mt i tng XmlNode trong ti liu XML ca XmlDataDocument. ng thi, nu bn cp nht hay xa mt khch hng, th s thay i ny c thc hin trong c hai Dataset v XmlDataDocument. Lp XmlDataDocument c bt ngun t lp XmlDocument; bi vy lp XmlDataDocument tha k tt c nhng thuc tnh chung, nhng phng thc v nhng s kin c trnh by trong mc trc y cho lp XmlDocument. Thuc tnh Dataset (Tp d liu kiu) l thuc tnh c thm vo lp XmlDataDocument . N ly i tng Dataset c lu tr s trnh by mi quan h ca d liu. Bn kt hp mt Dataset vi XmlDataDocument ca bn bi vic chuyn dataset ti b khi dng XmlDataDocument. Bng 16.8 cho thy nhng phng thc XmlDataDocument b sung. Bng 16.8: nhng phng thc XmlDataDocument Phng thc Kiu tr v M t

GetElementFromRow() XmlElement Tr v i tng XmlElement c lin quan n i tng DataRow c ch r. GetRowFromElement() DataRow Load() void Tr v i tng DataRow c lin quan n i tng XmlElement c ch r. B qu ti. Ti thng tin t ngun d kin ch nh vo trong i tng XmlDataDocument v ng b ha d liu c ti vi Dataset.

Danh sch 16.18 cho thy mt chng trnh minh ha s s dng mt XmlDataDocument. Chng trnh ny thc hin nhng bc sau y: 1. To ra mt i tng Dataset c tn myDataSet v in y n vi mt DataTable c tn customersDT c cha hai hng u tin t bng nhng khch hng. 2. Trnh by nhng i tng DataRow trong customersDT s dng phng thc DisplayDataRows() , c nh ngha gn im khi u ca chng trnh. 3. To ra mt i tng XmlDataDocument c tn myXDD, chuyn MyDataSet ti b khi dng; iu ny kt hp myDataSet vi XmlDataDocument.

4. Trnh by ti liu XML trong myXDD bi chuyn Console.Out ti phng thc Save() . 5. Thm mt DataRow khch hng vi mt CustomerID l J9COM ti customersDT. 6. Truy xut nt J9COM s dng phng thc GetElementFromRow() . Phng thc ny chp nhn mt DataRow nh mt tham s v tr v XmlNode lin h. 7. Gn Country ca nt J9COM ti USA, u tin gn thuc tnh EnforceConstraints ca i tng myDataSet ti false- m bn phi lm trc khi thc hin bt k s thay i no ti nhng nt. 8. Truy xut ANATR XmlNode s dng SelectSingleNode(). 9. Truy xut ANATR DataRow s dng GetRowFromElement(). Phng thc ny chp nhn mt XmlElement nh mt tham s v tr v DataRow c lin h. 10. Loi b nt ANATR s dng RemoveAll(). 11. Hin th ti liu XML trong myXDD s dng Save(). 12. Hin th nhng i tng DataRow trong customersDT s dng DisplayDataRows(). Danh sch 16.18: USINGXMLDATADOCUMENT.CS /* UsingXmlDataDocument.cs illustrates how to use an XmlDataDocument object */ using System; using System.Data; using System.Data.SqlClient; using System.Xml; class UsingXmlDataDocument { public static void DisplayDataRows(DataTable myDataTable) { Console.WriteLine("\n\nCustomer DataRow objects in customersDT:"); foreach (DataRow myDataRow in myDataTable.Rows) { foreach (DataColumn myDataColumn in myDataTable.Columns) { Console.WriteLine(myDataColumn + "= "+ myDataRow[myDataColumn]); } } } public static void Main() { SqlConnection mySqlConnection = new SqlConnection( "server=localhost;database=Northwind;uid=sa;pwd=sa" ); SqlCommand mySqlCommand = mySqlConnection.CreateCommand(); mySqlCommand.CommandText = "SELECT TOP 2 CustomerID, CompanyName, Country "+ "FROM Customers "+ "ORDER BY CustomerID"; SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter();

mySqlDataAdapter.SelectCommand = mySqlCommand; // step 1: create a DataSet object and fill it with the top 2 rows // from the Customers table DataSet myDataSet = new DataSet(); mySqlConnection.Open(); mySqlDataAdapter.Fill(myDataSet, "Customers"); mySqlConnection.Close(); DataTable customersDT = myDataSet.Tables["Customers"]; // step 2: display the DataRow objects in customersDT using // DisplayDataRows() DisplayDataRows(customersDT); // step 3: create an XmlDataDocument object, passing myDataSet // to the constructor; this associates myDataSet with the // XmlDataDocument XmlDataDocument myXDD = new XmlDataDocument(myDataSet); // step 4: display the XML document in myXDD Console.WriteLine("\nXML document in myXDD:"); myXDD.Save(Console.Out); // step 5: add a customer DataRow to customersDT with a CustomerID // of J9COM Console.WriteLine("\n\nAdding new DataRow to customersDT with CustomerID of J9COM"); DataRow myDataRow = customersDT.NewRow(); myDataRow["CustomerID"] = "J9COM"; myDataRow["CompanyName"] = "J9 Company"; myDataRow["Country"] = "UK"; customersDT.Rows.Add(myDataRow); // step 6: retrieve the J9COM node using GetElementFromRow() Console.WriteLine("\nRetrieving J9COM node using GetElementFromRow()"); XmlNode myXmlNode = myXDD.GetElementFromRow(myDataRow); Console.WriteLine("CustomerID = "+ myXmlNode.ChildNodes[0].InnerText); Console.WriteLine("CompanyName = "+ myXmlNode.ChildNodes[1].InnerText); Console.WriteLine("Country = "+ myXmlNode.ChildNodes[2].InnerText); // step 7: set J9COM node's Country to USA, first setting // EnforceConstraints to false Console.WriteLine("\nSetting J9COM node's Country to USA"); myDataSet.EnforceConstraints = false; myXmlNode.ChildNodes[2].InnerText = "USA"; // step 8: retrieve the ANATR XmlNode using SelectSingleNode() Console.WriteLine("\nRetrieving ANATR node using SelectSingleNode()"); myXmlNode = myXDD.SelectSingleNode( "/NewDataSet/Customers[CustomerID=\" ANATR\"]" ); // step 9: retrieve the ANATR DataRow using GetRowFromElement() Console.WriteLine("\nRetrieving ANATR DataRow using GetRowFromElement()"); myDataRow = myXDD.GetRowFromElement((XmlElement) myXmlNode); foreach (DataColumn myDataColumn in customersDT.Columns)

{ Console.WriteLine(myDataColumn + "= "+ myDataRow[myDataColumn]); } // step 10: remove the ANATR node using RemoveAll() Console.WriteLine("\nRemoving ANATR node"); myXmlNode.RemoveAll(); // step 11: display the XML document in myXDD using Save() Console.WriteLine("\nXML document in myXDD:"); myXDD.Save(Console.Out); // step 12: display the DataRow objects in customersDT using // DisplayDataRows() DisplayDataRows(customersDT); } } u ra t chng trnh ny nh sau: Customer DataRow objects in customersDT: CustomerID = ALFKI CompanyName = Alfreds Futterkiste Country = Germany CustomerID = ANATR CompanyName = Ana Trujillo Emparedados y helados Country = Mexico XML document in myXDD: <?xml version="1.0" encoding="IBM437"?> <NewDataSet> <Customers> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> <Country>Germany</Country> </Customers> <Customers> <CustomerID>ANATR</CustomerID> <CompanyName>Ana Trujillo Emparedados y helados</CompanyName> <Country>Mexico</Country> </Customers> </NewDataSet> Thm DataRow mi vo customersDT vi CustomerID J9COM Retrieving J9COM node using GetElementFromRow() CustomerID = J9COM CompanyName = J9 Company Country = UK Setting J9COM node's Country to USA Retrieving ANATR node using SelectSingleNode() Retrieving ANATR DataRow using GetRowFromElement() CustomerID = ANATR

CompanyName = Ana Trujillo Emparedados y helados Country = Mexico Removing ANATR node XML document in myXDD: <?xml version="1.0" encoding="IBM437"?> <NewDataSet> <Customers> <CustomerID>ALFKI</CustomerID> <CompanyName>Alfreds Futterkiste</CompanyName> <Country>Germany</Country> </Customers> <Customers> </Customers> <Customers> <CustomerID>J9COM</CustomerID> <CompanyName>J9 Company</CompanyName> <Country>USA</Country> </Customers> </NewDataSet> Customer DataRow objects in customersDT: CustomerID = ALFKI CompanyName = Alfreds Futterkiste Country = Germany CustomerID = CompanyName = Country = CustomerID = J9COM CompanyName = J9 Company Country = USA

Tm lc
Trong chng ny, bn hc v s h tr XML rng ln ca my ch phc v SQL. Bn cng thy cch lu tr XML mt chng trnh C# s dng nhng i tng XmlDocument v XmlDataDocument nh th no. My ch phc v SQL m rng pht biu SELECT cho php bn truy vn s d liu v ly v nhng kt qu nh XML. c bit, bn c th thm mt mnh XML vo cui ca mt pht biu SELECT, ch r My ch phc v SQL s tr v nhng kt qu nh XML. Bn kho st ng dn ngn ng nh du m rng (XPath) v s Bin i ngn ng Stylesheet m rng (XSLT). XPath l mt ngn ng cho php bn tm kim v dn hng mt ti liu XML s dng nhng biu thc. XML l mt cch u vit trnh by d liu trong mt nh dng linh ng, nhng XML khng cha ng thng tin v vic lm sao nh dng d liu ny cho s hin th. XSLT cho php bn kim sot vic nh dng ca d liu XML, v c th dng thay i d liu XML ti mt nh dng thch hp cho s hin th. Bn c th truy cp my ch phc v SQL s dng HTTP (Giao thc chuyn i Siu vn bn). iu ny cho php bn chy nhng cu lnh SQL t mt b duyt; chng hn, bn c th chy mt pht biu SELECT m tr v XML, v my ch phc v SQL s trnh by nhng kt qu trong b duyt ca bn. Bn c th s dng nhng pht biu XPath nh v d liu trong XML c tr v, v s dng XSLT stylesheets nh dng XML c tr v. My ch phc v SQL cha mt hm c tn OPENXML() n cho php bn c d liu XML nh th n l mt tp hp kt qu ca nhng hng. Mt s dng ca OPENXML() l c d liu XML nh nhng hng v sau chn nhng hng vo trong mt bng.

Bn s dng mt i tng ca lp XmlDocument i din cho mt ti liu XML trong mt chng trnh C#. Mt i tng XmlDocument lu tr nhng nt ca ti liu XML trong nhng i tng ca lp XmlNode. Bn c th, chng hn, ti nhng hng t c s d liu vo trong mt Dataset, v ri ti mt s trnh by XML ca nhng hng vo trong mt i tng XmlDocument. Bn s dng mt i tng ca lp XmlDataDocument truy cp nhng hng nh c nhng i tng XmlNode ln nhng i tng DataRow c quan h. Bn kt hp mt Dataset vi XmlDataDocument ca bn bi vic chuyn Dataset ca bn ti b khi dng XmlDataDocument. Mt i tng XmlDataDocument cung cp s ng b gia Dataset v ti liu XML. Chng hn, nu bn thm mt khch hng mi nh mt i tng XmlNode ti XmlDataDocument ca bn , th khch hng ny cng c thm nh mt DataRow vo Dataset lin h ca bn. Trong chng k tip, bn s hc v nhng dch v mng . @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

Chng 17: nhng dch v Mng


Tng quan
Mt dch v mng l mt thnh phn phn mm m bn c th duyt qua Mng, v mt trong s nhng tnh nng ca .NET l kh nng d dng to ra Mng dch v. Nhng cng ty c th to ra nhng dch v Mng cho php s tng tc vi khch hng. Chng hn, mt cng ty tu bin to ra mt dch v mng cho php nhng cng ty khc gi dn mt ti liu XML vo mng c cha mt danh mc hng ha cn cung cp. Cng ty tu bin c th chp nhn file ny v hoch nh mt u c nhng tit mc , v tr li mt ti liu XML t dch v mng cha mt danh sch ca nhng con s theo di cho mi tit mc s c cung cp. V nhng dch v mng nhn v tr v d liu trong form ca nhng ti liu XML, nhng dch v mng thc s l nn tng c lp . Chng hn, bn c th c mt dch v mng vit vi C# - giao dch vi mt dch v mng khc vit bng Java, thng qua d liu trong form ca nhng ti liu XML. Trong chng ny, bn s thy cch to ra mt dch v mng s dng VS .NET v s dng n trong mt ng dng Windows nh th no . Bn cng s thy cch ng k mt dch v mng nhng t chc khc c th s dng dch v ca bn. V phm vi ton din ca nhng dch v mng, xem .NET Web Services Solutions by Kris Jamsa (Sybex, 2003). Mc ni bt trong Chng ny: To ra mt dch v Mng Xem mt file WSDL v kim tra mt dch v Mng S dng mt dch v Mng ng k mt dch v Mng

To ra mt dch v Mng
Trong mc ny bn s to ra mt dch v Mng cha mt phng thc tr v mt Dataset cha nhng hng t bng nhng khch hng.

Khi ng VS .NET v chn File New Project. Trong hp thoi New Project , chn Visual C# Projects trong Project Types bn tri, v chn ASP.NET Web Service trong Templates bn phi. Nhp vo http: // Localhost/ NorthwindWebService trong trng nh v (Location field)- xem Hnh 17.1. Kch OK tip tc.

Hnh 17.1: To ra mt dch v Mng trong VS .NET Ghi nh: nu bn c ci t IIS trn mt my tnh khc vi my a phng ca bn, ri thay th localhost vi tn ca my tnh t xa ca bn trong Location field. Sau khi VS .NET to ra d n mi, m Solution Explorer v xa file Service1.asmx t d n ca bn; tip theo bn s thm file .asmx ca mnh, v tht d dng , n gin l xa file ban u Service1.asmx . Chn Project Add Web Service, v nhp vo Customers.asmx trong trng tn (Name field) ca hp thoi Add New Item (xem Hnh 17.2). Kch Open tip tc. VS .NET thm mt file vi tn Customers.asmx ti d n ca bn.

Hnh 17.2: vic thm mt dch v Mng mi Chn View Code xem M C# trong file Customers.asmx.cs . Danh sch 17.1 trnh by file v d Customers.asmx.cs. Danh sch 17.1: Customers.asmx.cs using System; using System.Collections; using System.ComponentModel; using System.Data;

using System.Diagnostics; using System.Web; using System.Web.Services; namespace NorthwindWebService { /// <summary> /// Summary description for Customers. /// </summary> /// [WebService(Namespace="http://DbProgramming/NorthwindWebService")] public class Customers : System.Web.Services.WebService { public Customers() { //CODEGEN: lnh gi ny c yu cu bi ASP.NET Web Services Designer InitializeComponent(); } #region Component Designer generated code //Required by the Web Services Designer private IContainer components = null; /// <summary> /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// </summary> private void InitializeComponent() { } /// <summary> /// Clean up any resources being used. /// </summary> protected override void Dispose(bool disposing) { if(disposing && components != null) { components.Dispose(); } base.Dispose(disposing); } #endregion // WEB SERVICE EXAMPLE // The HelloWorld() example service returns the string Hello World // To build, uncomment the following lines then save and build the project // To test this web service, press F5 // // // // // [WebMethod] public string HelloWorld() { return "Hello World"; }

} Ch : lp Customers c dn xut t lp System.Web.Services.WebService . Lp WebService, ch nh rng nhng lp Customers hnh thnh b phn ca mt dch v Mng Gn cui ca Danh sch 1.1, bn s ch mt phng thc c tn HelloWorld() c ngt thnh ch thch ngoi. m ny ch bn cch vit mt phng thc s c trng by bi dch v mng ca bn. Bn s ch mt dng cha [ WebMethod] c t trc phng thc, n cho bit phng thc s c trnh by bi dch v mng. Tt nhin, V phng thc HelloWorld() c chuyn thnh ch thch, phng thc s khng c bin tp v do khng tht s c trnh by bi dch v mng. Thay th phng thc v d HelloWorld() trong m ca bn vi phng thc RetrieveCustomers() c trnh by trong Danh sch 17.2. RetrieveCustomers() kt ni ti c s d liu Northwind v tr v mt Dataset cha nhng hng t bng nhng khch hng. Bn gi mt mnh WHERE ti phng thc RetrieveCustomers() trong tham s whereClause; mnh WHERE ny ri c s dng trong pht biu SELECT gii hn nhng hng c truy xut t bng nhng khch hng. Danh sch 17.2: CUSTOMERSWEBSERVICE.CS [WebMethod] public DataSet RetrieveCustomers(string whereClause) { SqlConnection mySqlConnection = new SqlConnection("server=localhost;database=Northwind;uid=sa;pwd=sa"); string selectString = "SELECT CustomerID, CompanyName, Country "+ "FROM Customers "+ "WHERE "+ whereClause; SqlCommand mySqlCommand = mySqlConnection.CreateCommand(); mySqlCommand.CommandText = selectString; SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(); mySqlDataAdapter.SelectCommand = mySqlCommand; DataSet myDataSet = new DataSet(); mySqlConnection.Open(); mySqlDataAdapter.Fill(myDataSet, "Customers"); mySqlConnection.Close(); return myDataSet; } Ghi ch Bn s cn thay i chui c s dng to ra i tng mySqlConnection trong m ca bn kt ni ti c s d liu Northwind ca bn. Bi v m s dng nhng lp trong khng gian tn System.Data.SqlClient, Bn cng s cn thm hng sau y gn on u ca file Customers.asmx.cs ca bn : using System.Data.SqlClient; Theo mc nh, mt dch v mng s dng mt namespace l http: // tempuri.org, v bn cn phi thay i n thnh URL c dng bi t chc ca bn. Nhng v d sau gn namespace cho dch v mng ti http: // DbProgramming/ NorthwindWebService: [WebService(Namespace="http://DbProgramming/NorthwindWebService")] public class Customers : System.Web.Services.WebService Ch bn gn Namespace trong mt dng c t trc lp Customers. Tip tc v thm mt hng tng t nh ci trc y vo m ca mnh. Xy dng dch v mng ca bn bi chn Build Build Solution.

Th l xong ! Bn xy dng dch v mng ca bn.

Xem mt file WSDL v kim tra mt dch v mng


WSDL thay th cho Ngn ng m t nhng dch v mang, v mt file WSDL cha mt s m t y dch v mng ca bn, bao gm thng tin yu cu gi nhng phng thc ca dch v ca bn. Mt file WSDL c vit trong XML v ch r thng tin sau y Nhng phng thc dch v mng Nhng kiu d liu c dng bi nhng phng thc Nhng nh dng thng bo yu cu v p li cho s truyn thng vi nhng phng thc Ghi ch Cho thng tin ton din v WSDL, ving thm www.w3.org / TR/ wsdl. Bn truy cp dch v mng ca bn bng cch tr b duyt ca bn ti URL sau y: http://localhost/NorthwindWebService/Customers.asmx Nh bn c th thy t Hnh 17.3, trang kt qu c trnh by trong b duyt ca bn cha hai mi lin kt c tn Service Description (s m t dch v) v Retrieve Customers (truy xut nhng khch hng).

Hnh 17.3: Truy cp dch v mng Ghi ch Bn cng c th truy cp dch v mng ca bn bi vic nhp phi trn file Customers.asmx trong ca s Solution Explorer trong VS .NET v chn Set As Start Page t thc n bt ra. ri bn chn Debug Start Without Debugging kim tra dch v ca bn. VS .NET s khi ng Internet Explorer v hin th ging nh trang th chy bn thy trong Hnh 17.3.

Xem File WSDL ca dch v mng


Nu bn kch mi lin kt Service Description, bn s nhn thy phn m t ca dch v mng ca bn trong form ca mt file WSDL, c trnh by trong Danh sch 17.3. Ch file WSDL ny c vit trong XML v cha chi tit v cch gi nhng phng thc c trnh by bi dch v mng v d nh th no. File WSDL cng cha nhng kiu d liu ca nhng tham s c dng v nhng lnh gi m bn c th thc hin ti nhng phng thc ca bn .

Danh sch 17.3: File WSDL dch v mng <?xml version="1.0" encoding="utf-8"?> <definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://DbProgramming/NorthwindWebService" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" targetNamespace="http://DbProgramming/NorthwindWebService" xmlns="http://schemas.xmlsoap.org/wsdl/"> <types> <s:schema elementFormDefault="qualified" targetNamespace="http://DbProgramming/NorthwindWebService"> <s:import namespace="http://www.w3.org/2001/XMLSchema" /> <s:element name="RetrieveCustomers"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="whereClause" type="s:string" /> </s:sequence> </s:complexType> </s:element> <s:element name="RetrieveCustomersResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="RetrieveCustomersResult"> <s:complexType> <s:sequence> <s:element ref="s:schema" /> <s:any /> </s:sequence> </s:complexType> </s:element> </s:sequence> </s:complexType> </s:element> <s:element name="DataSet" nillable="true"> <s:complexType> <s:sequence> <s:element ref="s:schema" /> <s:any /> </s:sequence> </s:complexType> </s:element> </s:schema> </types> <message name="RetrieveCustomersSoapIn"> <part name="parameters" element="s0:RetrieveCustomers" /> </message> <message name="RetrieveCustomersSoapOut"> <part name="parameters" element="s0:RetrieveCustomersResponse" /> </message> <message name="RetrieveCustomersHttpGetIn">

<part name="whereClause" type="s:string" /> </message> <message name="RetrieveCustomersHttpGetOut"> <part name="Body" element="s0:DataSet" /> </message> <message name="RetrieveCustomersHttpPostIn"> <part name="whereClause" type="s:string" /> </message> <message name="RetrieveCustomersHttpPostOut"> <part name="Body" element="s0:DataSet" /> </message> <portType name="CustomersSoap"> <operation name="RetrieveCustomers"> <input message="s0:RetrieveCustomersSoapIn" /> <output message="s0:RetrieveCustomersSoapOut" /> </operation> </portType> <portType name="CustomersHttpGet"> <operation name="RetrieveCustomers"> <input message="s0:RetrieveCustomersHttpGetIn" /> <output message="s0:RetrieveCustomersHttpGetOut" /> </operation> </portType> <portType name="CustomersHttpPost"> <operation name="RetrieveCustomers"> <input message="s0:RetrieveCustomersHttpPostIn" /> <output message="s0:RetrieveCustomersHttpPostOut" /> </operation> </portType> <binding name="CustomersSoap" type="s0:CustomersSoap"> <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document" /> <operation name="RetrieveCustomers"> <soap:operation soapAction="http://DbProgramming/NorthwindWebService/RetrieveCustomers" style="document" /> <input> <soap:body use="literal" /> </input> <output> <soap:body use="literal" /> </output> </operation> </binding> <binding name="CustomersHttpGet" type="s0:CustomersHttpGet"> <http:binding verb="GET" /> <operation name="RetrieveCustomers"> <http:operation location="/RetrieveCustomers" /> <input> <http:urlEncoded /> </input> <output> <mime:mimeXml part="Body" /> </output> </operation> </binding>

<binding name="CustomersHttpPost" type="s0:CustomersHttpPost"> <http:binding verb="POST" /> <operation name="RetrieveCustomers"> <http:operation location="/RetrieveCustomers" /> <input> <mime:content type="application/x-www-form-urlencoded" /> </input> <output> <mime:mimeXml part="Body" /> </output> </operation> </binding> <service name="Customers"> <port name="CustomersSoap" binding="s0:CustomersSoap"> <soap:address location="http://localhost/NorthwindWebService/Customers.asmx" /> </port> <port name="CustomersHttpGet" binding="s0:CustomersHttpGet"> <http:address location="http://localhost/NorthwindWebService/Customers.asmx" /> </port> <port name="CustomersHttpPost" binding="s0:CustomersHttpPost"> <http:address location="http://localhost/NorthwindWebService/Customers.asmx" /> </port> </service> </definitions> Tip theo, bn s thy cch kim tra dch v mng ca bn nh th no.

Kim tra mt dch v mng


kim tra dch v mng ca bn, tr b duyt ca bn ti URL sau : http://localhost/NorthwindWebService/Customers.asmx Kch lin kt Retrieve Customers. B duyt ca bn trnh by mt trang ( xem Hnh 17.4) m bn c th dng th phng thc RetrieveCustomers() c trnh by bi dch v mng ca bn.

Hnh 17.4: trang th nghim dch v Mng Trang th nghim cha mt hp vn bn vi mt nhn l whereClause ni m bn c th nhp vo nhng gi tr cho tham s whereClause ca phng thc RetrieveCustomers() ca bn. Vn bn bn nhp vo cho whereClause c chuyn cho phng thc RetrieveCustomers() khi bn kch nt Invoke trn mt trang. Nhp vo vn bn sau nh whereClause ca bn: CustomerID='ALFKI' Kch nt Invoke chy phng thc RetrieveCustomers().Vi whereClause ny, phng thc RetrieveCustomers() tr v mt Dataset vi mt DataTable cha mt hng t bng nhng khch hng vi mt CustomerID l ALFKI, nh trnh by trong Hnh 17.5. Ch lng bng nhau equals (=) v nhng k t (') trch dn n trong gi tr tham s whereClause ca URL c chuyn i thnh nhng m % 3D v % 27 tng ng.

Hnh 17.5: Chy phng thc RetrieveCustomers() vi mt whereClause l CustomerID= ' ALFKI' Nh bn c th thy t Hnh 17.5, Dataset c tr v nh mt ti liu XML. Bn c th s dng XML ny trong nhng chng trnh my khch ca bn m s dng dch v mng. Bn s thy cch vit mt chng trnh my khch nh th no trong mc k tip. Chng ta hy xem xt v d khc; nhp vo chui sau y nh whereClause ca bn v kch nt Invoke: CustomerID IS NOT NULL iu ny gy cho phng thc RetrieveCustomers() tr li mt Dataset vi mt DataTable cha tt c nhng hng t bng nhng khch hng ( xem Hnh 17.6). Ch nhng k t khong cch trong gi tr tham s whereClause c chuyn i thnh nhng k t cng (+). Bn s cn cun xung trang xem nhng khch hng khc.

Hnh 17.6: Chy phng thc RetrieveCustomers() vi mt whereClause ca CustomerID khng phi NULL Tip theo, bn s thy cch s dng dch v mng ca bn trong mt ng dng Windows nh th no.

S dng mt dch v mng


Trong mc ny bn s thy cch s dng mt dch v mng nh th no trong mt ng dng Windows. Khi ng VS .NET v chn File New Project. To ra mt ng dng Windows mi c tn UseWebServiceInWindows. Ko mt DataGrid, TextBox, v iu khin Nt ti form ca bn. Gn thuc tnh Name ca DataGrid ca bn ti customersDataGrid. Gn thuc tnh Name ca TextBox ca bn ti whereClauseTextBox, v loi b vn bn textBox1 t thuc tnh Text. gn thuc tnh Name ca Nt ca bn ti getCustomersButton, v gn thuc tnh Text ti Get Customers. Nhng iu khin ny c trnh by trong Hnh 17.7.

Hnh 17.7: Form vi nhng iu khin M ca s Solution Explorer v nhp phi nt References. Chn Add Web References t thc n bt ra. Vic ny hin th hp thoi Add Web Reference , cho php bn tm kim nhng dch v Mng. Nhp vo URL sau y vo hp Address, v nhn phm Enter trn bn phm ca bn: http://localhost/NorthwindWebService/Customers.asmx Ghi ch: Nu dch v mng ca bn khng c trin khai trn my tnh a phng, th thay th localhost vi tn ca my tnh t xa ca bn. Dch v Mng ca bn s c nh v v mt trang th c trnh by (xem Hnh 17.8).

Hnh 17.8: Dch v Mng Northwind Bn c th xem file WSDL thuc dch v Mng ca bn bi vic kch lin kt Service Description, v Bn c th kim tra dch v mng ca bn bi vic kch lin kt Retrieve Customers . Kch nt Add Reference thm tham chiu n dch v Mng ca bn vo d n ca bn v tip tc. Bn c th thy tham chiu mi trong ca s Solution Explorer (xem Hnh 17.9).

Hnh 17.9: Tham chiu Mng mi trong Solution Explorer Nhn p nt trn form ca bn m ca s bin tp m, v thm m sau y vo phng thc click Nt ca bn : localhost.Customers myCustomersService = new localhost.Customers(); customersDataGrid.DataSource = myCustomersService.RetrieveCustomers(whereClauseTextBox.Text); customersDataGrid.DataMember = "Customers"; Ghi nh : xin nhc li mt ln na, nu dch v Mng ca bn khng c trin khai trn my tnh a phng, th thay th localhost trong m ny vi tn ca my tnh t xa ca bn. M ny to ra mt i tng c tn myCustomersService gi dch v Mng ca bn, v trnh by nhng kt qu c tr v t phng thc RetrieveCustomers() trong customersDataGrid. Bin tp v chy ng dng Windows ca bn bi chn Debug Start Without Debugging. Nhp CustomerID= ' ALFKI' vo trong hp textbox, v kch nt Get Customers ; nhng kt qu c truy xut c trnh by trong Hnh 17.10.

Hnh 17.10: Form ang chy Tip theo, bn s thy cch ng k dch v Mng ca bn nh th no

ng k mt dch v Mng
Trong mc ny, bn s thy cch ng k mt dch v Mng s dng nhng dch v mng ca Microsoft nh: Universal Description, Discovery, and Integration (UDDI). Bn c th hiu UDDI nh mt th mc phn phi ca nhng dch v Mng m bn c th thng ng k v nh v nhng dch v mng c thnh lp bi nhng t chc. UDDI l mt tiu chun cng nghip c pht trin bi Microsoft, IBM, Sun Microsystems, v nhng cng ty phn mm v phn cng khc. Ghi ch: V thng tin ton din ca UDDI, thm www.uddi.org v uddi.microsoft.com. Mt khi bn ng k dch v Mng ca bn, bt c ai cng c th s dng dch v ca bn nh mt thnh phn phn mm trong h thng ca mnh; tng t, bn c th s dng nhng dch v Mng ca ngi khc trong h thng ca bn. Bn c th thm ch ng k nhng dch v Mng cho intranet ca t chc ca mnh v xy dng mt h thng bn trong to nn t nhng dch v Mng c vit bn trong. Trong mc ny, bn s ng k NorthwindWebService bn to ra trc trong chng ny. lm iu ny, thc hin theo nhng bc sau: T VS .NET, kch th "Start Page ", kch lin kt "XML Web Services" , v kch lin kt "Register Your XML Web Service Today" (xem Hnh 17.11). Bn c th tm kim nhng dch v Mng s dng "Find A Service page".

Hnh 17.11: nhng trang dch v Mng XML T trang ng k dch v Mng UDDI, bn c th ng k dch v mng ca bn hoc vi s th hoc mi trng sn xut.V dch v mng ca bn l ch l mt v d, kch nt kim UDDI Test Environment v kch nt Submit (xem Hnh 17.12). Nu bn to ra mt dch v mng hu ch thc s v bn tin tng nhng t chc khc s mun s dng, bn c th ng k dch v mng ca bn vi mi trng sn xut.

Hnh 17.12: Trang ng k dch v mng UDDI c vn bn trong trang UDDI Business Registry Node (xem Hnh 17.13). Trang ny gii thch nhng bc k tip bn phi theo . Kch nt Sign In khi bn han tt vic c vn bn.

Hnh 17.13: trang Nt Ni ng k Doanh nghip UDDI Bn s cn mt ti khon h chiu Microsoft tip tc. Nu bn c mt ti khon nh vy, nhp vo nhng chi tit ca bn (xem Hnh 17.14). Kch nt Continue tip tc.

Hnh 17.14: ng nhp s dng mt ti khon h chiu Microsoft Ghi nh: nu bn khng c mt ti khon h chiu, kch lin kt "Get One Now" v ng k cho mt ti khon h chiu. Nhp vo a ch email ca bn, tn v s in thoi trong trang UDDI Business Registry Node (xem Hnh 17.15). Tn v s in thoi gn y ca trang v bn s cn phi cun xung xem chng. Kch nt Save tip tc.

Hnh 17.15: Nhp vo a ch email , tn v s in thoi ca bn c nhng iu khon s dng ca trang v kch Accept (s chp nhn) nu bn mun tip tc.

Hnh 17.16: nhng iu khan s dng ca trang Nhp vo tn Doanh nghip ca bn v mt m t ty chn (xem Hnh 17.17). Kch Save tip tc.

Hnh 17.17: Thit t tn giao dch v s m t Bn s c yu cu chn mi trng UDDI ln na, v vy phi bo m rng nt rai UDDI Test Environment c chn kim, v kch Submit tip tc.

Chc chn rng t chc (organization) ca bn c chn, v kch Submit tip tc. Tip theo, nhp vo nhng chi tit cho dch v mng ca bn. Nhp vo mt tn cho dch v mng ca bn, cng vi mt s m t. URL .asmx cho NorthwindWebService ca bn s tng t nh URL sau : http://localhost/NorthwindWebService/Customers.asmx .Wsdl URL ca bn s tng t nh URL sau : http://localhost/NorthwindWebService/Customers.asmx?WSDL Chn nhng c tnh cho loi dch v ca bn. Nhng thit t ny c trnh by trong Hnh 17.18. Kch Submit ( trnh) ng k dch v mng ca bn.

Hnh 17.18: Thit t nhng chi tit dch v mng Nh th . Bn ng k mt cch thnh cng dch v mng ca bn. C thoi mi tm kim v kho st nhng dch v mng hin thi d ng k s dng trang Find A Service.

Tm lc
Mt dch v mng l mt thnh phn phn mm m bn c th im qua Mng, v mt trong s nhng c tnh kha ca .NET l kh nng d dng to ra dch v Mng. Nhng cng ty c th to ra nhng dch v Mng cho php nhng khch hng ca h tng tc vi h. V nhng dch v Mng tr v v chp nhn d liu trong form ca nhng ti liu XML, nhng dch v Mng thc s l nn tng c lp. Chng hn, bn c th c mt dch v mng vit bi C# giao tip vi dch v Mng khc vit bng ngn ng Java, thng qua d liu trong form ca nhng ti liu XML. Trong chng ny, bn thy cch to ra mt dch v Mng s dng VS .NET v s dng n trong mt ng dng Windows nh th no. Bn cng thy cch ng k mt dch v Mng nh th no nhng t chc khc c th s dng dch v ca bn. Ti hy vng bn tm thy trong sch ny nhiu thng tin hu ch, v ti hy vng c c s quan tm ca bn! Lp trnh C s d liu vi C# l mt ch rt ln , Nhng c v trang vi sch ny, Ti tin tng bn s lm ch c n.

You might also like