laptrinhcosodulieuvoi-csharp_phan-3 68

Upload: hbfysm

Post on 08-Jul-2015

866 views

Category:

Documents


1 download

TRANSCRIPT

Phn 3: Lp trnh C s d liu nng cao vi ADO.NETDANH 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 caoTng quanTrong 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 SqlTransactionBn 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 dchMc 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 lpChaos ReadCommitted

M tNhng 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- SQLCng 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 SqlTransactionCng 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 serverSQL 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 ServerMy 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 SQLBn 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 dchMt 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 khaTheo 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 TransactionsSerializable 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 tcMt 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 lcNgy 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 quanNhng 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.NETTrong 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.aspxBn 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 WebForm1

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 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. WebForm1 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: 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

Nhng hng k tip cha nhng chi tit ca iu khin Nt m bn thm vo form ca bn Nhng hng cn li trong file WebForm1.aspx kt thc form, thn v file:

File WebForm1.aspx.csFile 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 description for WebForm1. /// 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); } /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// 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 khinLabel TextBox

M tHin 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 hnTrong 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 WebForm1

Hello Enter your name Favorite season Sex You must enter your name! Spring Summer Fall Winter Male Female 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 liuMt 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 WebThc 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 DataGridBn 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 trangTip 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 ( 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 liuTrong 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

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 WebForm1 Products End of list

Bo tr trng thi trong mt ng dng WebGiao 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 CookiesMt 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 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."; } 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 ViewStateBn 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. 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."; }

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 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."; }

Ct gi thng tin s dng i tng trnh ng dngi tng trnh ng dng cho php bn ct gi thng tin m dng chung cho tt c nhng