Thứ Năm, 28 tháng 7, 2011

SQL Error Codes

This document contains SQL error messages.

For some error codes, there are two possible error messages. When possible (usually at SQL compile time), error messages include explicit references to tables, views, or other entities. For those codes with two messages, the distinct messages are separated below by “OR”.
Note:
While this document lists error codes as negative values, JDBC and ODBC clients always receive positive values. For example, if an ODBC or JDBC application returns error code 30, look up error code -30 in this table.
SQL Error Codes
Error Code Description
100 No (more) data
0 Successful Completion
-1 Invalid SQL statement
-2 Exponent digits missing after ‘E’
-3 Closing quote (“) missing
-4 A term expected, beginning with one of the following: identifier, constant, aggregate, %ALPHAUP, %EXACT, %SQLSTRING, %SQLUPPER, %STRING, %UPPER, $$, :, +, -, (, NOT, EXISTS, or FOR
-5 Column number specified in ORDER does not match SELECT list
-6 ORDER must specify column number, not names, when after UNION
-7 ORDER column is not in the SELECT list
-8 Invalid DATEPART code for DATEPART(), DATENAME(), DATEADD(), or DATEDIFF()
-9 Incompatible SELECT lists used in UNION
-10 The SELECT list of the subquery must have exactly one item
-11 A scalar expression expected, not a condition
-12 A term expected, beginning with one of the following: identifier, constant, aggregate, $$, :, (, +, -, %ALPHAUP, %EXACT, %SQLSTRING, %SQLUPPER, %STRING, or %UPPER
-13 An expression other than a subquery expected here
-14 A comparison operator is required here
-15 A condition expected after NOT
-16 A qualifier SOME or ALL expected after the FOR in the for-expression
-17 A for-condition expected after the ( in the for-expression
-18 IS (or IS NOT) NULL predicate can be applied only to a field
-19 An aggregate function cannot be used in a WHERE clause
-20 Name conflict in the FROM list over label
-22 ORDER must specify column names, not numbers, when after ‘SELECT *’
-23 Label is not listed in FROM
-25 Input encountered after end of query
-26 Missing FROM clause
-27 Ambiguous labels for field
-28 Host variable name must begin with either % or a letter
-29 Field ambiguous/not found
-30 Table or View not found
-31 Field not (Found/Unique) in Table(s)
-32 Outer-join symbol ( =* or *= ) must be between two fields
-33 No field(s) found for table
-34 %INORDER: FROM order inconsistent with outer join order
-35 INSERT/UPDATE/DELETE not allowed for non-updatable view
-36 WITH CHECK OPTION (CHECKOPTION class parameter) not allowed for non-updatable views
-37 SQL Scalar/Aggregate/Unary function not supported for Stream fields
-38 No master map for table
-39 No RowID field for table
-40 ODBC escape extension not supported
-41 An extrinsic function call must have the form ‘$$tag^routine(…)’
-42 Closing quotes (“”) missing following pattern match
-43 Table is ambiguous within #IMPORT schema name list
-44 Duplicate method or query characteristic
-45 Duplicate method in Cache’ ObjectScript query body
-46 Required method missing in Cache’ ObjectScript query body
-47 Invalid method or query characteristic
-48 Invalid trigger REFERENCING clause for the trigger’s event
-49 Trigger REFERENCING clause cannot be specified when trigger language not SQL
-50 Trigger specifies UPDATE OF clause when trigger language not SQL
-51 SQL statement expected
-52 Cursor (Already/Was Not) DECLAREd
-53 Constant or variable expected as new value
-54 Array designator (last subscript omitted) expected after VALUES
-55 Invalid GRANT TO or REVOKE FROM
-56 GRANT/REVOKE Action not applicable to an object of this type
-57 Trigger specifies WHEN clause when trigger language not SQL
-58 Duplicate field found in trigger UPDATE OF clause
-59 Cannot have more than one field
-60 An action (%ALTER, SELECT, UPDATE, etc.) expected
-61 Cursor not updatable
-62 Additional new values expected for INSERT/UPDATE
-63 Data Exception – invalid escape character
-64 Incompatible SELECT list is used in INSERT
-65 Positive integer constant or variable expected
-66 Redundant Fields Found in SELECT list
-67 Aggregate not valid in subquery of FROM clause
-68 DISTINCT not valid in subquery of FROM clause
-69 SET = not allowed with WHERE CURRENT OF
-70 Multi-Line Field only valid for LIKE, Contains ([), or NULL Comparison.
-71 Multi-Line Field must be the Left operand of the Comparison.
-72 Multi-Line Field not valid in ORDER BY clause.
-73 Aggregates not supported in ORDER BY clause.
-74 Duplicate alias names found.
-75 and/or required before FROM in TRIM function.
-76 Cardinality mismatch between the SELECT-list and INTO-list.
-77 Qualified column reference not allowed in this JOIN context.
-78 Invalid transaction state.
-79 Referencing key and referenced key must be the same size
-80 Integer expected
-81 Column Constraint expected
-82 Multiple table %DESCRIPTION definitions found
-83 Multiple table %FILE definitions found
-84 Multiple table %NUMROWS definitions found
-85 Multiple table %ROUTINE definitions found
-86 Invalid field definition, no datatype defined
-87 Invalid table name
-88 Invalid field name
-89 Invalid index name
-90 Invalid view name
-91 cannot be specified more than once.
-92 cannot be READ UNCOMMITTED if READ WRITE specified.
-93 for the DIAGNOSTICS SIZE must be exact numeric.
-94 Unsupported usage of OUTER JOIN.
-95 Operation Disallowed by Operation Table
-96 Specified is not supported.
-97 Duplicate names found.
-98 License Violation
-99 Privilege Violation
-101 Attempt to open a cursor that is already open
-102 Operation (FETCH/CLOSE/UPDATE/DELETE/…) attempted on an unopened cursor
-103 Positioned UPDATE or DELETE attempted, but the cursor is not positioned on any row
-104 Field validation failed in INSERT
-105 Field validation failed in UPDATE
-106 Row to DELETE not found
-107 Cannot UPDATE RowID or RowID based on Fields
-108 Required field missing; INSERT or UPDATE not allowed
-109 Cannot find the row designated for UPDATE
-110 Locking conflict in filing
-111 Cannot INSERT into a ‘Default Only’ RowID or RowID based on field
-112 Access violation
-113 %THRESHOLD Violation
-114 One or more matching rows is locked by another user
-115 Cannot INSERT/UPDATE/DELETE on a read only table
-116 Cardinality mismatch on INSERT/UPDATE between values list and number of table columns.
-117 Aggregates not supported in Views
-118 Unknown or non-unique User or Role
-119 UNIQUE or PRIMARY KEY Constraint failed uniqueness check upon INSERT
-120 UNIQUE or PRIMARY KEY Constraint failed uniqueness check upon UPDATE
-121 FOREIGN KEY Constraint failed referential check upon INSERT of row in referencing table
-122 FOREIGN KEY Constraint failed referential check upon UPDATE of row in referencing table
-123 FOREIGN KEY Constraint failed referential check upon UPDATE of row in referenced table
-124 FOREIGN KEY Constraint failed referential check upon DELETE of row in referenced table
-125 UNIQUE or PRIMARY KEY Constraint failed uniqueness check upon creation of the constraint
-126 REVOKE with RESTRICT failed.
-127 FOREIGN KEY Constraint failed referential check upon creation of the constraint
-130 Before Insert trigger failed
-131 After Insert trigger failed
-132 Before Update trigger failed
-133 After Update trigger failed
-134 Before Delete trigger failed
-135 After Delete trigger failed
-136 View’s WITH CHECK OPTION validation failed in INSERT
-137 View’s WITH CHECK OPTION validation failed in UPDATE
-140 Invalid length parameter passed to the SUBSTRING function
-141 Invalid input value passed to the CONVERT function
-201 Table or View name not unique
-300 DDL not allowed on this table definition
-304 Attempt to add a NOT NULL field with no default value to a table which contains data
-305 Attempt to make field required when the table has one or more rows where the column value is NULL
-306 Column with this name already exists
-307 Primary key already defined for this table
-310 Foreign key references non-existent table
-311 Foreign key with same name already defined for this table
-314 Foreign key references non-unique key/column collection
-315 Constraint or Key not found
-317 Cannot DROP Constraint – One or more Foreign Key constraints reference this Unique constraint
-319 Referenced table has no primary key defined
-320 Cannot DROP table – One or more Foreign Key constraints reference this table
-324 Index with this name already defined for this table
-325 Index cannot be dropped because it is the IDKEY index and the table has data
-333 No such index defined
-340 Transaction failed to start.
-341 Transaction failed to COMMIT. Implicit ROLLBACK performed.
-342 Transaction failed to ROLLBACK.
-343 Not in a transaction.
-344 Invalid Transaction Sate – Active SQL-Transaction.
-345 Invalid condition number.
-346 Transaction failed to COMMIT. Implicit ROLLBACK also failed.
-347 Transaction failed to COMMIT
-358 SQL Function (function Stored Procedure) name not unique
-359 SQL Function (function Stored Procedure) not found
-360 Class not found
-361 Method or Query name not unique
-362 Method or Query not found
-363 Trigger not found
-364 Trigger with same EVENT, TIME, and ORDER already defined
-365 Trigger name not unique
-366 Schema name mismatch between trigger name and table name
-370 Embedded SQL CALL Statement can only be used for Method Procedures
-371 :HVar = CALL … Specified for a Procedure which does not return a value
-372 Support for extrinsic function calls are disabled
-373 An extrinsic function call may not call a % routine
-374 Cannot alter the datatype of a field to/from a stream type when the table contains data
-400 Fatal error occurred
-401 Fatal Connection error
-402 Invalid Username/Password
-405 Unable to read from communication device
-406 Unable to Write to Server
-407 Unable to Write to Server Master
-408 Unable to start server
-409 Invalid server function
-410 Invalid Directory
-411 No stream object defined for field
-412 General Stream Error
-413 Incompatible Client/Server Protocol
-415 Fatal error occurred within the SQL filer
-421 Warning: UPDATE or DELETE statement does not contain a WHERE clause
-422 SELECT request processed via ODBC, JDBC, or Dynamic SQL cannot contain an INTO clause
-425 Error processing Stored Procedure request
-426 Error preparing Stored Procedure
-427 Invalid Stored Procedure Name
-428 Stored Procedure Not Found
-429 Invalid number of input/output parameters for Stored Procedure
-430 Cannot initialize procedure context
-450 Unable to send client message
-451 Unable to receive server message
-452 Message sequencing error
-453 Error in User Initialization Code
-460 General error
-461 Communication link failure
-462 Memory allocation failure
-463 Invalid column number
-464 Function sequence error
-465 Invalid string or buffer length
-466 Invalid parameter number
-467 Column type out of range
-468 Fetch type out of range
-469 Driver not capable
-470 Option value changed
-471 Duplicate cursor name
-500 Fetch row count limit reached
-10050 WinSock: Network is down
-10051 WinSock: Network is unreachable
-10052 WinSock: Net dropped connection or reset
-10054 WinSock: Connection reset by peer (due to timeout or reboot)
-10055 WinSock: No buffer space available
-10056 WinSock: Socket is already connected
-10057 WinSock: Socket is not connected
-10058 WinSock: Cannot send after socket shutdown
-10060 WinSock: Connection timed out
-10061 WinSock: Connection refused
-10064 WinSock: Host is down
-10065 WinSock: No route to host
-10070 WinSock: Stale NFS file handle
-10091 WinSock: Network subsystem is unavailable
-10092 WinSock: WINSOCK DLL version out of range
-10093 WinSock: Successful WSASTARTUP not yet performed
-11001 WinSock: Host not found
-11002 WinSock: Nonauthoritative host not found

Các nguyên tắc cần biết khi lập trình 2

1. Sự khác nhau giữa các lớp Trace và Debug?

- Trace dùng để theo dõi các hành động xảy ra. Nó hoạt động trong các đóng gói cả Debug lẫn Release. Trace là khả năng của chương trình tự đưa ra các thông tin về hành động của mình.

- Debug dùng để tìm và sửa các lỗi trong chương trình. Nó chỉ hoạt động trong đóng gói Debug.

2. Sự khác nhau giữa static readonly và const?

- Static readonly là hằng số được khởi tạo khi thực thi chương trình.

- Const là hằng số được khởi tạo khi biên dịch chương trình.

3. Sự khác nhau giữa String và StringBuilder?

- String là lớp không thay đổi. Mọi phương thức sẽ tạo ra một biến String mới.

- StringBuilder là lớp thay đổi. Các phương thức của biến sẽ ảnh hưởng đến đến biến StringBuilder hiện tại.

4. Sự khác nhau giữa “” và String.Empty?

- “” sẽ tạo thêm 1 đối tượng khi làm việc với nó (so sánh, copy…)

- String.Empty không tạo đối tượng nào cả. String.Emtpy nằm trong mscorlib.

Khi kiểm tra 1 String có rỗng hay không nên dùng String.Length == 0 để có tốc độ nhanh nhất.

5. Có thể gán một struct bằng null hay không?

- Có thể nếu bạn lập trình với C# 2.0. Ví dụ: int? var = 1; var = null;

6. Sự khác nhau giữa == và phương thức Equals?

- == so sánh theo kiểu giá trị.

- Equals so sánh theo kiểu tham chiếu.

7. Sự khác nhau giữa throw và throw ex?

- throw đế đưa lại toàn bộ các tầng theo dõi của lỗi ra.

- throw ex bỏ bớt các tầng theo dõi bên dưới phương thức gọi throw ex.

8. Connection Pooling dùng để làm gì?

- Cho phép tăng tốc độ của các ứng dụng Web bằng cách dùng lại các kết nối thay vì tạo các kết nối mới với mỗi yêu cầu.

9. .NET có hỗ trợ thừa kế từ nhiều lớp hay không (multiple inheritance)? Tại sao?

- Không. Vì sẽ không hiểu được khi gọi 1 phương thức mà 2 lớp cha cùng override nó.

10. Sự khác nhau giữa abstract class và interface?

- Có thể thừa kế từ nhiều interface nhưng chỉ có thể thừa kế từ 1 abstract class.

- Có thể viết sẵn các thực thi trong Abstract class, nhưng interface thì không.

- Interface dùng để gom các hành động cần được hiện thực , các khả năng của một đối tượng (ví dụ con người và xe cộ cùng có khả năng đi lại, nhưng con người không cùng tính chất với xe cộ), còn abstract class cho các lớp thừa kế cùng 1 loại, tính chất hay trạng thái (ví dụ đàn ông, phụ nữ, trẻ con, người già đều là con người).

- Abstract class có tốc độ thực thi nhanh hơn interface.

- Thêm 1 tính năng mới vào interface sẽ phá vỡ toàn bộ các lớp hiện thực, còn abstract thì không.

11. Hàm GetHasCode() trong System.Object dùng để làm gì?

- Trả về giá trị của một đối tượng. Chú ý hàm này mặc định không trả về giá trị duy nhất hoặc không đổi. Hàm này có thể override.

12. Sự khác nhau giữa DataSet và DataReader?
- DataSet có thể đọc và ghi trong khi DataReader chỉ có thể đọc.
- DataSet có thể chứa nhiều bảng còn DataReader chỉ có thể chứa 1 bảng.
- DataSet làm việc ở chế độ không kết nối còn DataReader làm việc ở chế độ kết nối.
- DataSet có thể di chuyển tới và trở lại còn DataReader thì chỉ có thể di chuyển tới.
- DataSet truy cập chậm hơn DataReader.

13. Sự khác nhau giữa các phuơng thức Copy và Clone?
- Clone chỉ copy cấu trúc trong khi Copy copy cả cấu trúc lẫn dữ liệu.

14. Sự khác nhau giữa Dispose, Destructor và Finalize?
- Destructor sẽ được chuyển thành Finalize khi biên dịch. Hàm Finalize được gọi bởi .NET Runtime và chúng ta không thể đoàn được nó được gọi khi nào, nhưng nó chắc chắn sẽ được gọi.
- Dispose sẽ giải phóng bộ nhớ ngay khi nó được gọi. Lưu ý nếu lớp nào override Dispose mà quên gọi thì các đối tượng sẽ không tự giải phóng bộ nhớ.

15. Serialization là gì?
- Là sự chuyển chuyển đối tượng thành 1 luồng các bytes.

16. Sự khác nhau giữa XmlSerializer, BinaryFormatter và SoapFormatter?
- XmlSerializer dùng cho dịch vụ Web.
- BinaryFormatter/SoapFormatter dùng cho Remoting.
- SoapFormatter dùng để tuần tự hóa 1 đối tượng thành SOAP.
- BinaryFormatter dùng để tuần tự hóa 1 đối tượng thành dạng nhị phân.
- XmlSerializer chỉ chuyển đổi các tính chất public còn BinaryFormatter/SoapFormatter chuyển đổi cả public lẫn private.

17. Sự khác nhau giữa overriding và shadowing?
- Overriding cung cấp sự hiện thực mới của 1 hàm ở lớp thừa kế nhưng không thay đổi số biến, kiểu trả về, mức truy cập còn shadowing thì có thể thay đổi (từ khóa new trong C#).

18. Sự khác nhau giữa class, object, struct và interface?
- Class là cấu trúc dữ liệu định nghĩa bởi người dùng chứa các tính chất và phương thức. Object là một trường hợp cụ thể của class. Class không chiếm bộ nhớ, còn Object được tạo trong bộ nhớ.
- Class là cấu trúc dữ liệu định nghĩa bởi người dùng chứa các tính chất và phương thức. Struct là kiểu giá trị được lưu trữ trong stack còn class là kiểu tham chiếu (các object) được lưu trữ trong heap.
- Khi struct được khởi tạo không bằng hàm khởi tạo người dùng sẽ phải khởi tạo tất cả các Fields trước khi sử dụng nó.

- Interface là một hợp đồng gồm một nhóm các phương thức cần được hiện thực.

19. Sự khác nhau giữa Property và Field?
- Property dùng để quản lý sự truy cập đến Field. Dùng Property để đảm bảo Field không bị gán các giá trị không hợp lệ.

20. Sự khác nhau giữa static Method, static constructor với method và constructor thông thường?
- Static method có thể gọi mà không cần khởi tạo biến. Static constructor chỉ được gọi đúng một lần khi object đầu tiên được khởi tạo.

21. Các biến tĩnh và chỉ dẫn chương trình được lưu ở đâu?
- Ở 1 vùng bộ nhớ đặc biệt gọi là Permanent Storage area.
22. Sự khác nhau giữa stack và heap?
- Stack và heap là các vùng bộ nhớ. Heap nằm giữa stack và Permanent Storage area, và độ lớn có thể thay đổi khi thực thi chương trình.

23. Sự khác nhau giữa Boxing and Un-Boxing?
- Boxing là chuyển đổi kiểu giá trị thành kiểu tham chiếu. Un-Boxing ngược lại.

24. Mục đích của thừa kế (inheritance)?
- Để tái sử dụng.

25. Mục đích của đa hình (poymophism)?
- Một hành động có thể xảy ra theo nhiều cách khác nhau.

26. Sự khác nhau giữa Compile Time Polymorphism và Run Time Polymorphism?
- Compile Time Polymorphism – ví dụ Overloading, một hàm có thể có nhiều cách biểu diễn.
- Run Time Polymorphism – ví dụ Overriding, một hàm có thể có nhiều cách xử lý.

27. Sự khác nhau giữa delegate và event?
- delegate là một lớp (class) đại diện cho hàm con trỏ kiểu an toàn hoặc hàm gọi (call backs) chỉ đến địa chỉ tham chiếu của một (hay nhiều) hàm. Con trỏ hàm chứa trong delegate được gắn vào một đối tượng đích (target) và khi delegate được kích hoạt phương thức sẽ được gọi ở đối tượng đích. Sự hữu ích của delegate không nằm ở chỗ giữ địa chỉ tham chiếu của các hàm mà để định nghĩa và dùng các tên hàm khi runtime thay vì compile time.
- event cho phép xác định một delegate sẽ được gọi khi có sự xuất hiện của “sự kiện” nào đó. event là một modifier trong khi delegate là một lớp. event cho phép một delegate được khai báo trong interface.

29. AppDomain là gì?
- Là một miền riêng biệt lưu trữ code và dữ liệu cho một application. Một process có thể chứa nhiều AppDomains.
Khi bạn copy một DLL mới vào bin, ASP.NET runtime sẽ không thể đưa nó vào một AppDomain đang chạy.Nó sẽ dừng từ từ AppDomain cũ (dừng hẳn khi nó dừng tất cả các requests) và mở một AppDomain mới.

30. Sự khác nhau giữa publish và published interfaces.
- publish interface là interface mà bạn có thể sửa tất cả những code nào dùng nó còn published interface là interface mà bạn không thể sửa code dùng nó.

31. Sự khác nhau giữa try{}catch{} và try{}catch{Exception ex}?
- Chúng giống hệt nhau.

32. Sự khác nhau giữa 1/0; và try{1/0;} catch {throw;}
- Chúng giống hệt nhau. Vì vậy nếu không xử lý catch thì đừng catch.

33. Sự khác nhau giữa Remoting và Web service?
- Web service không có trạng thái, không cần biết đến client chỉ sử dụng trên HTTP, hỗ trợ không đồng nhất các môi trường, tốc độ chậm hơn Remoting.
- Remoting có trạng thái kết nối, hỗ trợ nhiều giao thức hơn HTTP, TCP…, đòi hỏi môi trường đồng nhất, tốc độ nhanh đặc biệt khi dùng trên TCP.

34. Sự khác nhau giữa error và exception?
- Error là lỗi của chương trình còn exception là lỗi chương trình được phát hiện và có thể xử lý.

35. Sự khác nhau giữa Procedure và OO?
- Procedure gồm các hàm và các biến, tất cả các hàm đều có thể truy cập đến tất cả các biến. Không thể quản lý các biến.
- OO gom hàm và biến vào các đơn vị object. Các hàm và biến được quản lý trong nội bộ object. Các object tương tác với nhau thông qua các interfaces.

36. CLR, CTS, CLS, MSIL, JIT, PE, GAC là viết tắt của những gì?
- Là Common Language Runtime: môi trường để chạy các ứng dụng .NET
- Là Common Type System: mô tả các loại dữ liệu trong .NET.
- Là Common Language Specification: mô tả các quy định và chuẩn cho các ngôn ngữ trong .NET
- Là Microsoft Intermediate Language: ngôn ngữ thông dịch của .NET.
- Là Just In Time: trình biên dịch MSIL thành mã máy.
- Là Portable Executable: file chứa MSIL.
- Là Global Assembly Cache: nơi lưu trữ các Asembly dùng chung.

37. Các mâu thuẫn giữa OO và RDBMS?
- Cấu trúc cấp bậc trong OO có thể là vô tận trong khi ở RDBMS chỉ có 4 loại table, row, column, cell.
- Các đối tượng trong OO bản thân là phân biệt trong khi trong RDBMS cần phải có primary-key.
- Các đối tượng trong OO có thể tham chiếu đến nhau rất đơn giản nhưng trong RDBMS thì phức tạp thông qua JOIN
- Sự thừa kế trong OO là đơn giản trong khi trong RDBMS hầu như không có khái niệm đó. Một bảng cần chứa tất cả các tính chất, có khi là thừa.
- Các đối tượng trong OO có thể có các hành động tác động đến tối tương khác.trong RDBMS thì phức tạp thông qua TRIGGER
- Khả năng truy cập trong OO là hạn chế trong khi ở RDBMS là không giới hạn.

38. Sự khác nhau giữa Response.Redirect và Server.Transfer.
- Response.Redirect đơn thuần là chuyển bạn đến một trang mới giống như bạn gõ địa chỉ trang đó trên browser và request đến server.
- Server.Transfer cũng chuyển bạn đến trang mới nhưng ở phía server, làm giảm request đến server, giữa nguyên URL của bạn và có thể chuyển cả các query string và biến trên form đên địa chỉ mới, chỉ thực hiện giữa các trang trên cùng 1 host.

39. Vai trò của ASPX page và ASPX page code-behind trong MVC.
- ASPX page là View còn ASPX page code-behind là Controller.

40. Làm thế nào để try/catch trên toàn bộ 1 ASPX page.
- Dùng Page_Error event.

41. Sự khác nhau giữa Cohesion và Coupling
- Cohesion là sự liên kết giữa các thành phần trong một module. Một thiết kế tốt nên có sự liên kết giữa các thành phần thật chặt chẽ.
- Coupling là sự kết nối giữa các module với nhau. Một thiết kế tốt nên có sự kết nối thật lỏng lẽo giữa các module.

42. Refractoring là gì?
- Là sự thiết kế lại cấu trúc của code bằng cách thay đổi cấu trúc bên trong mà không ảnh hưởng đến các hành vi bên ngoài (interface) của đoạn code (module, system) đó.

43. Phân biệt HttpApplication, Session, ViewSate và HttpContext?
- Cả 4 thành phần trên đều dùng để lưu dữ liệu của một Web Application.
- HttpApplication có tác dụng trong toàn bộ quá trình thực thi của Web Application.
- Session có tác dụng trong 1 lần ghé thăm (visit) của người dùng. Nó kết thúc khi gặp timeout.
- ViewState có tác dụng trong trong 1 trang web.
- HttpContext có tác dụng trong 1 request.

Các nguyên tắc cần biết khi lập trình 1

1. Program To An Interface, Not An Implementation. Lập trình trên các interface, tránh lập trình trên sự hiện thực hóa.

Khi cần gọi hàm, phương thức của một lớp chúng ta nên gọi từ interface mà lớp đó hiện thực hóa tránh gọi chính lớp đó.

2. Favor object composition over class inheritance. Chúng ta nên ưu tiên sự kết hợp hơn là thừa kế.

Khi cần thêm một chức năng nào đó vào nên viết riêng ra một lớp và tạo một instance của lớp đó trong lớp cần gọi thay vì thừa kế từ lớp cần gọi.

3. If your system is too complex, add more objects. Nếu hệ thống của bạn quá phức tạp hãy thêm vào các đối tượng.

Điều này mới nghe có vẻ vô lý . Thêm vào có thể làm phức tạp hơn chứ. Thực ra khi thêm vào chúng ta sẽ tách hệ thống thành các đối tượng nhỏ hơn, dễ hiểu, dễ quản lý hơn.

4. Rewrite code that needs comments. Hãy viết lại những đoạn code mà cần chú thích.

Các đoạn code mà bạn phải chú thích để người khác hiểu thể hiện rằng nó không rõ ràng, khó hiểu. Hãy viết lại nó theo cách rõ ràng, dễ hiểu.

5. Don’t catch or throw base exception types. Đừng bắt hoặc ném những loại exception cơ bản.

Khi bắt hoặc ném các exception cơ bản sẽ làm cho chương trình của bạn lúc nào cũng chạy ngay cả khi có lỗi hoặc cạn bộ nhớ hệ thống. Điều này có thể gây ra những hậu quả nghiêm trọng. Ngoài ra khi làm vậy chính bạn đã dấu đi những lỗi của chương trình. Tóm lại chỉ nên bắt và ném những exception nào mà bạn có thể xử lý.

6. Use finally blocks liberally. Hãy sử dụng finally thoải mái và tùy nghi.

Cho dù có lỗi xảy ra chăng nữa thì đoạn code nằm trong finally bao giờ cũng được chạy. Nó đảm bảo chắc chắn bạn đã làm những điều cần thiết khi lỗi xảy ra với chương trình.

7. Put a single catch (Exception ex) per thread.

Mỗi thread cần được bắt bằng 1 Exception cơ bản. Điều này sẽ giúp bạn truy lỗi dễ dàng hơn.