Thứ Năm, 27 tháng 5, 2010

Làm Quen với ASP.NET

Trong trang này, ta sẽ tham khảo một số vấn đề như sau:
• ASP.NET là gì?
• Phương pháp làm việc trong mạng
• Sơ lược về .NET Framework
• Bố trí và cài đặt ASP.NET
• Tạo trang ASP.NET đầu tiên
Chắc hẳn ta có dịp được nghe Nguyễn Ngọc Ngạn kể với Kỳ Duyên rằng ông đã bỏ công gần 2, 3 năm trời đằng đẳng để ...
nghiên cứu rất là cực khổ mới khám phá ra một chân lý như sau: 'Thà là lấy vợ vừa trẻ vừa đẹp còn hơn là lấy vợ ... vừa già
vừa xấu'. Ta thì không cần phải tốn nhiều năm tháng đến thế để biết được ASP.NET vừa trẻ vừa đẹp hơn là ASP hoặc những
phương pháp phát triển mạng cổ điển khác nhưng dù có biết rõ ASP.NET vừa trẻ vừa đẹp (Microsoft chính thức khai trương
sản phẩm .NET Framework và MS Visual studio.NET vào ngày 13 tháng Hai năm 2002, tuy nhiên rất nhiều phiên bản Beta2
đã được phổ biến khắp thế giới giữa năm 2001) nhưng mấy ai biết được ASP.NET là gì và dung nhan ... mùa hạ ra làm sao?
Vậy ta 'hãy ngồi xuống đây' để bắt đầu làm quen với ASP.NET.
ASP.NET - EM LÀ AI?
Trước hết, họ tên của ASP.NET là Active Server Pages .NET (.NET ở đây là .NET framework). Nói đơn giản, ngắn và gọn thì
ASP.NET là một công nghệ có tính cách mạng dùng để phát triển các ứng dụng về mạng hiện nay cũng như trong tương lai
(ASP.NET is a revolutionary technology for developing web applications). Bạn lưu ý ở chổ ASP.NET là một phương pháp tổ
chức hay khung tổ chức (framework) để thiết lập các ứng dụng hết sức hùng mạnh cho mạng dựa trên CLR (Common
Language Runtime) chứ không phải là một ngôn ngữ lập trình. Ngôn ngữ lập trình được dùng để diển đạt ASP.NET trong
khóa này là VB.NET (Visual Basic .NET) và VB.NET chỉ là một trong 25 ngôn ngữ .NET hiện nay được dùng để phát triển
các trang ASP.NET mà thôi.
Tuy mang họ tên gần giống như ASP cổ điển nhưng ASP.NET không phải là ASP. Ta sơ lược ở đây vài khác biệt giữa
ASP.NET và ASP để bạn có khái niệm tổng quát và sẽ trình bày thêm chi tiết khi đào sâu vào từng điểm đặc trưng (features)
của ASP.NET ở từng bài học một.
KHÁC BIỆT GIỮA ASP.NET VÀ ASP
ASP.NET được phác thảo (re-design) lại từ số không, nó được thay đổi tận gốc rễ và phát triển (develop) phù hợp với yêu cầu
hiện nay cũng như vạch một hướng đi vững chắc cho tương lai Tin Học. Lý do chính là Microsoft đã quá chán nãn trong việc
thêm thắt và kết hợp các công dụng mới vào các kiểu mẫu lập trình hay thiết kế mạng theo kiểu cổ điển nên Microsoft nghĩ
rằng tốt nhất là làm lại một kiểu mẫu hoàn toàn mới thay vì vá víu chổ này chổ nọ vào ASP. Ðó là chưa kể đến nhiều phát
minh mới ra đời sau này dựa trên các khái niệm mới mẽ theo xu hướng phát triển hiện nay của công nghệ Tin Học
(Information Technology) cần được đưa vào kiểu mẫu phát triển mới đó. Nhờ vậy, ta mới có thể nói ... khơi khơi ASP.NET
không phải là ASP. Thật vậy , ASP.NET cung cấp một phương pháp hoàn toàn khác biệt với phương pháp của ASP.
Lưu ý, mặc dù ASP.NET và ASP khác biệt nhau nhưng chúng có thể hoạt động vui vẽ hài hoà với nhau trong Web Server của
bạn (operate side-by-side). Do đó, khi bạn cài ASP.NET engine, bạn không cần lập trình lại các ứng dụng hiện có dưới dạng
ASP của bạn tuy rằng, nếu muốn, bạn có thể làm điều đó rất dễ dàng.
SỰ THAY ÐỔI CƠ BẢN
ASP đã và đang thi hành sứ mạng được giao cho nó để phát triển mạng một cách tốt đẹp như vậy thì tại sao ta cần phải đổi mới hoàn
toàn? Lý do đơn giản là ASP không còn đáp ứng đủ nhu cầu hiện nay trong lãnh vực phát triển mạng của công nghệ Tin Học. ASP
được thiết kế riêng biệt và nằm ở tầng phiá trên hệ điều hành Windows và Internet Information Server, do đó các công dụng
của nó hết sức rời rạt và giới hạn.
Trong khi đó, ASP.NET là một cơ cấu trong các cơ cấu của hệ điều hành Windows dưới dạng nền hay khung .NET (.NET
framework), như vậy ASP.NET không những có thể dùng các object của các ứng dụng cũ mà còn có thể xử dụng tất cả mọi
tài nguyên mà Windows có, dễ dàng như ... ăn cơm tấm bì sườn chả vậy.
Ta có thể tóm tắc đại khái sự thay đổi như sau:
• Tập tin của ASP.NET (ASP.NET file) có extension là .ASPX, còn tập tin của ASP là .ASP.
• Tập tin của ASP.NET (ASP.NET file) được phân tích ngữ pháp (parsed) bởi XSPISAPI.DLL, còn tập tin của ASP
được phân tích bởi ASP.DLL.
• ASP.NET là kiểu mẫu lập trình phát động bằng sự kiện (event driven), còn các trang ASP được thi hành theo thứ tự
tuần tự từ trên xuống dưới.
• ASP.NET xử dụng trình biên dịch (compiled code) nên rất nhanh, còn ASP dùng trình thông dịch (interpreted code)
do đó hiệu suất và tốc độ phát triển cũng thua sút hẳn.
• ASP.NET yểm trợ gần 25 ngôn ngữ lập trình mới với .NET và chạy trong môi trường biên dịch (compiled
environment), còn ASP chỉ chấp nhận VBScript và JavaScript nên ASP chỉ là một scripted language trong môi
trường thông dịch(in the interpreter environment). Không những vậy, ASP.NET còn kết hợp nhuần nhuyễn với XML
(Extensible Markup Language) để chuyển vận các thông tin (information) qua mạng.
• ASP.NET yểm trợ tất cả các browser và quan trọng hơn nữa là yểm trợ các thiết bị lưu động (mobile devices). Chính
các thiết bị lưu động, mà mỗi ngày càng phổ biến, đã khiến việc dùng ASP trong việc phát triển mạng nhằm vươn tới
thị trường mới đó trở nên vô cùng khó khăn.

Tại sao ta lại quan tâm và phát triển mạng với ASP.NET

Ta phải công nhận một điều là .NET Framework và các ứng dụng của nó đã và đang tạo một cuộc cách mạng kỹ thuật trong
công nghệ Tin Học (Information Technology), thay đổi tận gốc rễ các kiểu mẫu lập trình hay phát triển và triển khai mạng
trên thế giới và do đó tạo một vận hội mới đáp ứng mọi yêu cầu khẩn thiết cho các ngành nghề kỹ thuật và thương mại hiện
nay cũng như vạch một hướng đi vững chắc và dài lâu cho tương lai Tin Học. ASP.NET chính là một trong những ứng dụng
quan trọng nhất để phát triển và triển khai mạng một cách dễ dàng chưa từng ... thấy từ xưa đến nay. Thật vậy, không phải là
chúng tôi khoái ... nổ đâu, hãy lắng nghe thử chính Microsoft đã nói về ASP.NET như thế nào:
'ASP.NET is a revolutionary programming frramework that enables the rapid development of powerful web
applications and services. Part of the Microsoft .NET Platform, it provides the easiest and most scalable way to
develop, deploy and run distributed web applications that can target any browser or any application.'
Có y chang như vậy hay không? hay là chỉ quảng cáo theo kiểu ... 'cao đơn hườn tán' mà thôi? Chúng ta hãy ... 'ngồi xuống
đây, hãy ngồi xuống đây' và ngồi gần lại với nhau để nhìn cho rõ những đặc tính không ... tầm thường của ASP.NET như sau:
Developer Productivity
Easy Programming Model:
ASP.NET giúp ta phát triển và triển khai các ứng dụng về mạng trong một thời gian kỷ lục vì nó cung cấp cho ta một kiểu
mẫu lập trình dễ dàng và gọn gàng nhất. Ngoài ra còn bãnh hơn nữa, các trang ASP.NET làm việc với mọi browsers hiện nay
như Internet Explorer (IE), Netscape, Opera, AOL, ... mà không cần phải đổi tới đổi lui các nguồn mã rất vất vã như trước.
Flexible Language Options:
Không như ASP kiểu cổ điển chỉ giới hạn với VBScripts and JScripts, ASP.NET yểm trợ trên 25 .NET ngôn ngữ lập trình (dĩ
nhiên ngoài các ngôn ngữ mới thiết lập đã cài sẵn yểm trợ .NET framework như là VB.NET, C# và JScript.NET còn có
MC++.NET, Smalltalk.NET, COBOL.NET, Eiffel.NET, Perl.NET, Component Pascal.NET, Mercury.NET, Oberon.NET,
Python.NET, vân vân và vân vân ... không kể xiết).
Great Tool Support:
Mặc dù ta có thể chỉ cần dùng tới Notepad để triển khai các trang ASP.NET nhưng Visual Studio.NET giúp năng suất triển
khai mạng thêm phần hiệu quả ví ta có thể quan sát các kế hoạch của ta dễ dàng hơn khi phát họa (design) các thành phần của
ASP.NET bằng hình ảnh với ASP.NET Web Forms hay Services theo phương pháp 'drag-drop-doubleclick' quen thuộc của
nền Windows. Thêm nữa, lại còn yểm trợ ta trong việc phát hiện và loại bỏ những lỗi sai một cách rất thuận lợi trong khi phát
triển các ứng dụng về mạng (support for debugging and deploying ASP.NET Web applications).
Ðây là trang đầu tiên khi dùng Visual Studio.NET:
Rich Class Framework:
Nhờ nền tảng vững vàng và tài nguyên phong phú của .NET Framework với hơn 5000 classes bao gồm đủ thứ mọi chuyện
trên trời dưới đất như XML, data access, file upload, regular expressions, transactions, message queuing, SMTP mail, vân vân
và vân vân ... nên việc thiết kế các đặc tính trong một ứng dụng trở nên nhẹ nhàng và thoải mái hơn xưa rất nhiều.
Improved Performance and Scalability
Compile execution:
ASP.NET không những chạy nhanh hơn ASP cổ điển gấp 5 lần mà còn có thể duy trì kiểu mẫu cập nhật gọi là kiểu mẫu 'just
hit save', nghĩa là ASP.NET tự động dò tìm mọi sự thay đổi và compile files khi cần thiết cũng như lưu trữ kết quả compile
đó để cung ứng dịch vụ cho những yêu cầu tiếp theo sau, nhờ vậy ứng dụng của bạn luôn luôn cập nhật hóa và chạy nhanh
hơn cả ... ngựa Nhâm Ngọ 2002.
Rich output caching:
ASP.NET có khả năng lưu trữ một kết quả chung trong phân bộ memory của trang để gởi giải đáp cho cùng một yêu cầu từ
nhiều khách hàng khác nhau và nhờ đó không những tiết kiệm được sự lập đi lập lại công tác thi hành của một trang web mà
còn gia tăng hiệu xuất một cách ngoạn mục do giới hạn tối đa việc chất vấn các cơ sở dữ liệu (eliminating the need to query
the database on every request) rất tốn nhiều thời gian.
.NET Outperforms J2EE:
Trong việc đối đầu với nhau về hiệu xuất (performance) và scalability với cùng một ứng dụng phát triển giữa Sun's Java Pet
Store J2EE và ASP.NET thì ASP.NET không những nhanh vượt trội hơn J2EE đến 28 lần (khoãng 2700%), nguồn mã lại ít
hơn nhiều (khoãng 1/4 nguồn mã của J2EE) mà còn dùng bộ xử lý (processor) chỉ khoãng 1/6 lần so với việc sử dụng
processor của J2EE. Nếu muốn tìm hiểu thêm, bạn có thể truy tìm dễ dàng những trang so sánh như vậy khi nối vào Internet
để 'search' về hiệu xuất của cả hai sản phẩm.
Enhanced Reliability
Memory Leak, DeadLock và Crash protection:
ASP.NET cũng có khả năng tự động dò tìm và phục hồi (detects and recovers) những trở ngại nghiêm trọng như deadlocks
hay bộ nhớ (memory) bị rỉ để bảo đảm ứng dụng của bạn luôn luôn sẵn sàng khi dùng mà không làm cản trở việc cung ứng
dịch vụ cần thiết thường lệ.
Easy Deployment
Simple application deployment:
ASP.NET đơn giản hóa việc triển khai ứng dụng mạng, do đó biến việc triển khai toàn bộ ứng dụng trở nên dễ dàng và thuận
lợi hơn hẳn trước kia vì bây giờ ta chỉ cần sao (với XCOPY) và lưu trữ ở Server chứ không cần phải chạy chương trình
'regsrv32' để đăng ký bất cứ thành phần nào cả, và thêm nữa, khi cần lưu trữ những yếu tố phụ cần thiết cho việc thiết lập hay
bố trí các ứng dụng, ta chỉ cần lưu giữ nó vào trong một hồ sơ dưới dạng XML là đủ.
Dynamic update of running application:
ASP.NET cho phép ta tự động cập nhật hóa (update) các thành phần đã compiled (compiled components) mà không cần phải
khởi động lại (re-start) các Web Server.
Easy Migration Path:
Ta không cần phải du nhập những ứng dụng được phát triển và triển khai bằng ASP cổ điển hiện có của bạn vào ASP.NET vì
ASP.NET có thể chạy song song với ... cựu chiến binh ASP ở cùng một Internet Information Server (IIS) trong nền Windows
2000 hay nền Windows XP. Các ứng dụng cũ vẫn tiếp tục chạy hết sức thoải mái với ASP.DLL trong khi ASP.NET engine sẽ
xử lý các ứng dụng mới. Ngoài ra, ASP.NET còn cho phép bạn dùng lại những thành phần thương mại hiện nay kiểu COM cổ
điển trong các ứng dụng của nó.
XML Web Services:
Dịch vụ tân kỳ về mạng với XML cũng cho phép bạn truyền đạt (communicate) và chia xẽ (share) các dữ kiện (data) xuyên
qua mạng Internet dễ dàng tới các SOAP client mà không hề phân biệt đối xữ các hệ điều hành hay các ngôn ngữ lập trình
khác nhau (regardless of OS or programming language). Nhờ đó, ta không cần phải học thêm hay đào sâu các kiến thức về
Networking, XML hay SOAP, ...
Mobile Web Service Support:
Thêm nữa, ASP.NET Mobile Controls còn giúp ta phát triển và triển khai mạng nhắm vào thị trường những cell phone hay
PDA với gần hơn 80 Mobile Web Services đuợc cung cấp trong .NET framework. Bạn chỉ cần lập trình cho ứng dụng của
bạn như thường lệ rồi phó mặc cho Mobile Controls đó tự động phát sinh ra những nguồn mã như WAP/WML, HTML hay
iMode thích hợp với từng loại thiết bị (device) riêng biệt.
Thôi, đến đây ta tạm ngừng ... 'đánh bóng' những gì đã sáng chói đó mà hít một hơi thật dài, bước một bước khởi đầu cho
cuộc hành trình tìm hiểu và thực hành về ASP.NET. Vậy xin mời bạn hãy sang sông, à không, sang ... trang với bài số 1
'Làm Quen với ASP.NET'

Hành trang vào Khóa Học ASP.NET

Ta nên chuẩn bị sẵn một số kiến thức căn bản về lập trình hay phát triển mạng khi bước vào khóa học này thì tốt hơn, vì tuy
bạn không cần phải biết về ASP cổ điển (classic ASP) nhưng, như chúng tôi đã trình bày trong phần FAQ ở trang Chào Mừng
đầu khóa học, bạn cần:
• tham khảo các bài viết trong khóa Học Microsoft .NET của thầy Lê Ðức Hồng để làm quen với .NET framework,
Visual Basic.NET, Visual Studio.NET. VB.NET sẽ được dùng làm ngôn ngữ mặc định (default) trong các thí dụ, các
bài tập hay các dự án của khoá.
• biết tổng quát về HTML (HyperText Markup Language) khi ta cần trình bày các trang web trên browser. Browser
được dùng trong khoá này là IE6 (Internet Explorer Version 6).
• quen thuộc với các hệ điều hành mới hiện nay (Operating System) như Windows 2000 (Professional hay Server) hay
Windows XP (Home hay Professional), cũng như quen thuộc cách quản lý các ứng dụng liên hệ như Web Server
(Personal Web Server hay Internet Information Server - IIS) và các cơ sở dữ liệu (database) MS SQL Server 2000 -
xin tham khảo các bài viết về MCSE của thầy Vũ Hữu Tín, thầy Tăng Vinh Tài và lớp MCSE.
• vài kiến thức căn bản về XML liên quan đến việc chuyển thông tin từ chổ này qua chổ khác. Về XML, bạn nên tham
khảo các bài viết XML, Kỹ Thuật Nồng Cốt trong Tương Lai của thầy Lê Ðức Hồng và các bài tự học XML của cô
Bạch Trí cũng trên mạng Vovisoft này).
Thật ra, ta đâu làm khó nhau chi nhưng phải rào trước đón sau như vậy là vì con đường ta đi tìm hiểu về ASP.NET hơi lắt lẽo
gập ghềnh. Một khi ta phát triển mạng với ASP.NET, ta phải vận dụng tất cả các ứng dụng liên hệ và kết hợp mọi thứ vào
nhau. Ðó cũng là lý do tại sao khoá học này chỉ nhắm vào các lập trình viên đã có kinh nghiệm phát triển mạng. Tuy vậy,
chúng tôi sẽ cố gắng trình bày một cách đơn sơ, ngắn và gọn khi đề cập đến các ứng dụng kể trên trong các bài học có liên
quan đến để bạn (nhất là bạn nào thích thú trong việc phát triển mạng và mới làm quen với ASP.NET) dễ dàng theo dỏi và
tìm hiểu về ASP.NET.
Nhu Liệu (Software)
Nhu liệu (phần mền hay software) tối thiểu phải có để học khoá ASP.NET thành công:
• Về hệ điều hành (Operating System): ta nên dùng Windows 2000 (Professional hay Server) hay Windows XP
(Home hay Professional). Lý do chính là các versions của Windows này hỗ trợ Unicode và có thể cài tự do Internet
Information Server (IIS Version 5) hỗ trợ ASPX để ta dùng cho ASP.NET vì IIS được cung cấp miễn phí trong các
hệ điều hành kể trên.
• Ngoài ra, bạn cần phải có .NET framework SDK (Software Development Kit) tải xuống từ mạng Microsoft. Chúng
tôi sẽ trình bày việc at3i xuống ở đâu và công cuộc bố trí như thế nào ở bài học số 1. Nếu như bạn đã có và cài đặt
Microsoft Visual Studio.Net (VS.NET) theo sự hướng dẫn các bài học của khóa Học Microsoft .NET thì càng tốt
nữa. Vì rãi rác trong các bài học về ASP.NET, chúng tôi cũng trình bày một số thí dụ dùng VS.NET cho ASP.NET
mặc dù thật ra chỉ cần có Notepad thôi đã cũng ... dư xài suốt năm.
• Cuối cùng, bạn cần phải có và cài đặt thành công một cơ sở dữ liệu (Database) vững mạnh tương ứng với OLE DBcompliant
database system như SQL Server 2000 để dùng lưu trữ những thông tin cần thiết. Tuy nhiên, ta cũng có
thể dùng MS Access 2000 để tạm thời thay thế SQL Server 2000 cho các thí dụ trong khoá phần nhiều trình bày các
nối và các kiểu thu thập dữ liệu hay thông tin xuyên qua SQL Server 2000.

Thứ Tư, 26 tháng 5, 2010

VB6

Hình 1
Hỏi: Trong VB6, tôi tạo ra một nút bấm trên form. Khi bấm vào nút này, chương trình tạo ra một tập tin văn bản Text.txt (trong ổ đĩa C:) có nội dung như sau: abc abc "abc abc". Tôi dùng lệnh Print thì có được trên một dòng: abc abc. Nếu dùng lệnh Write thì có được trên dòng khác: "abc abc". Tuy nhiên, tôi muốn tất cả văn bản trên chỉ nằm trên một đoạn thôi, không có xuống dòng. Mong giúp đỡ!


Trả lời: Hai lệnh Print và Write chỉ khác nhau ở chỗ: chuỗi được lệnh Write tạo ra luôn luôn được bao bởi cặp dấu nháy kép và các mục khác nhau của lệnh Write (liệt kê trong lệnh để in ra) luôn được phân cách bởi dấu phẩy. Bạn có thể sử dụng lệnh Print để in dấu nháy kép bằng cách sử dụng hàm Chr() với mã ASCII là 34. Trong cả hai lệnh, bạn có thể sử dụng dấu chấm phẩy (;) ở cuối lệnh để lệnh Print hoặc Write sau đó vẫn in kết quả trên cùng một dòng như ví dụ sau đây:
Open "D:\Text.txt" For Output As #1
Print #1, "abc abc"; Chr(34); "123 123"; Chr(34)
Write #1, "abc abc";
Print #1, "def def";
Write #1, "def def"
Close #1
Ví dụ trên tạo ra một tập tin Text.TXT có nội dung như hình 1.

Hiện thông báo

Hỏi:Tôi có 1 combo box (cboMaHang), tôi muốn khi người dùng đánh mã hàng không có trong hộp danh sách thì hiện lên thông báo có thêm giá trị mới này vào Combobox ko? Làm cách nào


Trả lời:

Bạn làm theo cách này xem:

Private Sub Cboname_NotInList(NewData As String, Response As Integer)

Dim db As Database

Dim LSQL As String
Dim LResponse As Integer
Dim ctl As Control

On Error GoTo Err_Execute
Set ctl = Me!Cboname
LResponse = MsgBox(NewData & " là một giá trị mới. Bạn có muốn thêm nó vào combo box?", vbYesNo, "Xác nhận")
If LResponse = vbYes Then
Set db = CurrentDb()
LSQL = "insert into tablename (cboname) values ('" & NewData & "')"

db.Execute LSQL, dbFailOnError

Set db = Nothing

Response = acDataErrAdded

Else
Response = acDataErrContinue
ctl.Undo
End If
On Error GoTo 0
Exit Sub

Err_Execute:
ctl.Undo
MsgBox "Action failed"

End Sub

Chèn flash trong VB.NET

Hỏi: Có thể chèn tập tin Flash SWF vào form trong Visual Basic .NET hay không? Nếu có thể chèn được thì xin cho biết mã cụ thể. Cảm ơn!


Việc thêm một tập tin Flash vào form như bạn hỏi được thực hiện bằng một Shockwave Flash control. Trên máy bạn cần cài đặt Macromedia Flash 8.0 (hoặc phiên bản mới hơn), hoặc cần đăng ký tập tin Flash8.OCX vào Registry bằng lệnh:
Regsvr32 /s Flash8.OCX
Ví dụ sau đây được thực hiện với VB 2005 phiên bản Professional và phiên bản Macromedia Flash 8.0 ActiveX Control:
- Tạo một project mới trong VB 2005.
- Trong cửa sổ Solution Explore, bấm chuột phải vào mục References và chọn mục Add Reference. Trong hộp thoại Add Reference, chọn phân trang COM, chọn mục Shockwave Flash (tôi đang sử dụng Windows XP, cột TypeLib Version là 1.0, đường dẫn đến tập tin là C:\WINDOWS\system32\Macromed\Flash\Flash8.ocx) rồi bấm nút OK. Khi ấy, ShockwaveFlashObject được thêm vào danh sách References.
- Bấm chuột phải vào vùng trống của Toolbox, chọn mục Choose Items trên trình đơn vừa hiện ra (hoặc chọn mục Choose Box Items trên trình đơn Tools) để hiển thị hộp thoại Choose Toolbox Items. Trong hộp thoại này, chọn phân trang COM Components, chọn mục Shockwave Flash Object rồi bấm nút OK. Khi ấy, ShockwaveFlashObject được thêm vào Toolbox.
- Trên Toolbox, chọn ShockwaveFlashObject để vẽ một ShockwaveFlashObject control lên form Form1 mặc định. Có thể bạn sẽ nhận được thông báo lỗi: "Failed to import the ActiveX control. Please ensure it is properly registered". Bạn cứ bấm nút OK. Lúc đó, trong danh sách References sẽ xuất hiện thêm AxShockwaveFlashObject với biểu tượng tam giác màu vàng. Để khắc phục lỗi, bấm chuột phải vào tên project (nằm ở mục đầu tiên) trong Solution Explorer, chọn mục Rebuild. Khi việc tạo lại project thành công (biểu tượng tam giác màu vàng biến mất), bạn sẽ vẽ được đối tượng AxShockwaveFlashObject lên form. Cũng có thể bạn phải làm điều này một hoặc hai lần mới được.
- Bạn bấm vào ShockwaveFlashObject trên Toolbox rồi vẽ một đối tượng AxShockwaveFlashObject lên form. Vẽ tiếp 2 nút lệnh có tên Button1 (thuộc tính Caption là Play) và Button2 (thuộc tính Caption là Exit) như hình 1.
- Sau đó, gõ đoạn mã 1. Nhấn phím F5 để chạy thử, bấm nút lệnh Play để xem Flash.

Đoạn mã 1

Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
With (AxShockwaveFlash1)
.Stop()
.Movie = "D:\FlashObjectOnForm\ClockAnalo_uialfoot.swf"
.Play()
End With
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
AxShockwaveFlash1.Dispose()
Application.Exit()
End Sub
End Class

CRC (Cyclic Redundancy Check)

Trong quá trình sử dụng máy tính, chắc hẳn bạn đã không ít lần cảm thấy khó chịu (đặc biệt là khi bạn đã tốn hàng giờ để download một tập tin quan trọng) khi gặp phải thông báo lỗi của WinZip từ chối xả nén một tập tin vì phép kiểm CRC thấy bại. Tại sao các phần mềm nén lại phải thực hiện phép kiểm tra CRC mỗi khi nó xả nén một tập tin?


Thực ra, CRC là một phương pháp nhằm kiểm tra xem nội dung một tập tin có bị thay đổi hay không (đặc biệt là khi tập tin này được truyền đi trên mạng). Điều này cực kỳ quan trọng đối với các phần mềm nén vì chỉ cần sai lệch một byte cũng đủ để làm sai lệch hoàn toàn nội dung các tập tin bị nén.

Ý tưởng về CRC cũng không quá phức tạp. Trong bài viết này, chúng ta sẽ xem xét qua một thuật toán phát sinh CRC đơn giản.

Trước tiên, để đơn giản hóa bài toán mà không làm mất tính tổng quát, ta sẽ xem nội dung tập tin F cần kiểm tra như là một con số nguyên khổng lồ trong đó, byte có nghĩa nhất là byte đầu tiên của tập tin, byte tiếp theo là byte có nghĩa kế tiếp và cứ thế cho đến byte cuối cùng của tập tin là byte ít có nghĩa nhất. Hay nói một cách khác, tập tin cần được kiểm tra F sẽ được đại diện bởi một con số nguyên SF mà giá trị của nó là :

(1)

trong đó b[i] là byte thứ i của tập tin.

Chẳng hạn, giả sử tập tin cần kiểm tra có nội dung là TEST thì giá trị SF của nó sẽ là :

SF = 84´2563 + 69´2562 + 83´2561 + 84 = 1 413 829 716

(trong đó mã ASCII của ký tự các T, E và S lần lượt là 84, 69, 83)

Giá trị CRC của một tập tin F là một số nguyên 2 byte sao cho với một hằng số nguyên cho trước G, đẳng thức sau được thỏa mãn (MOD là toán tử chia lấy phần dư, giống toán tử % của C, chẳng hạn 5 mod 2 = 1 vì 5 chia cho 2 còn dư 1 )

(SF ´ 2562 + CRC) MOD G = 0 (2)

Người ta thường chọn G là một số nguyên tố.

Giá trị CRC thỏa (2) có thể được xác định bằng công thức sau :

CRC = G – ( (SF ´ 2562) MOD G ) (3)

Khi truyền tập tin F sang nơi khác, ta đồng thời truyền cả giá trị CRC sang nơi nhận. Nơi nhận sẽ nhận được một tập tin có nội dung là Fnhận­ và giá trị
CRC­nhận. Áp dụng công thức (1) với Fnhận ­ để tính ra giá trị số nguyên đại diện cho Fnhận là S’F

Tại nơi nhận, phép kiểm tra CRC được thực hiện bằng cách áp dụng công thức (2) đối với S’F và giá trị CRCnhận, nghĩa là kiểm tra đẳng thức:

(S’F ´ 2562 + CRCnhận) MOD G = 0 (4)

Nếu (4) sai thì chắc chắn Fnhận ¹ F. Ngược lại, nếu (4) đúng thì không chắc chắn Fnhận ¹ F nhưng cũng không chắc chắn là Fnhận = F !!!

Điều này mới nghe có vẻ rất ngạc nhiên vì nếu đúng như vậy thì phương pháp này chẳng có giá trị gì cả ! Nhưng may mắn là, trong điều kiện thực tế, khi (3) đúng thì khả năng xảy ra trường Fnhận ¹ F là cực kỳ thấp, thấp đến mức mà ta có thể yên tâm là nó không thể xảy ra. Cơ sở cho khẳng định này là các sai sót trong quá trình truyền tập tin thường xảy ra ngẫu nhiên và số bit bị sai sót thường ít (1-2 bit). Trong khi đó, để xảy ra trường hợp Fnhận ¹ F và đẳng thức (3) được thỏa mãn cùng lúc, nội dung của Fnhận phải tuân theo một quy luật khá đặc biệt và số bit bị thay đổi giá trị cũng thường nhiều. Sự ngẫu nhiên khó có thể tạo ra một sai sót đặc biệt như vậy.

Cách cài đặt thuật toán phát sinh và kiểm tra CRC cho một tập tin cũng khá rõ ràng. Tuy nhiên, bạn đọc nên lưu ý đến vấn đề tràn số khi tính tổng SF. Để tránh điều này, bạn có thể sử dụng tính chất sau của toán tử mod : (A + B) MOD C = ( (A MOD C) + B ) MOD C

Đoạn chương trình minh họa sau dùng để phát sinh giá trị CRC của một chuỗi ký tự F (biến value sẽ giữ giá trị CRC khi đoạn chương trình kết thúc).

len = strlen(F);

value = 0;

// Tính giá trị số nguyên đại diện cho F dùng công thức (1)

for (i = 0; i < len; i++) {

value = value << 8;

value += F[i];

value = value % G;

}

// Tính giá trị CRC dùng công thức (3)

value = value << 16;

value = value % G;

if (value) value = G - value;

...

Làm sao lập trình TIẾNG VIỆT vỚI “LẬP TRÌNH C TRÊN WINDOWS”

Chào các anh chị và các bạn , khi xây dựng các ứng dụng trên Windows . Một vấn đề chúng ta quan tâm , đó là làm sao hiển thị được tiếng Việt trong các ứng dụng của mình. Trong bài chia sẻ kinh nghiệm này , Tôi sẽ trình bày các cách hiển thị tiếng Việt dưới góc độ lập trình API.


Còn với lập trình MFC thì vấn đề dễ dàng hơn nhiều (Do chúng ta có thể sử dụng các Component UNICODE). Nếu các anh chị quan tâm đến việc hiển thị tiếng Việt bằng cách dùng MFC thì Tôi sẽ có bài viết sau. Tôi sẽ hướng dẫn các anh chị và các bạn thao tác từng bước.

Trước hết, font của menu, của MesageBox là font hệ thống của Windows. Các ứng dụng chaỵ trên đó phải tuân theo qui định trên. Do đó sẽ không có font hệ thống của riêng ứng dụng. Do vậy, Anh Chị phải đổi font hệ thống khi muốn xuất hiện menu tiếng Việt.

Tuy nhiên chúng ta vẫn có thể thay đổi font của menu hay các thành phần khác mà không cần can thiệp vào font hệ thống bằng cách sau:

1. Với Message Box

Với Message Box thì các anh chị có thể sử dụng Dialog thay thế. Muốn thay đổi font của nguyên Dialog Box bạn thực hiện như sau:

1. Click phải vào Dialog và chọn Properties

2. Nhấn nút font

Chọn font thích hợp.

Tuy nhiên bạn chỉ đổi được font của các text box… chứ phần Caption thì nó đổi không được.

Bạn có thể lách chỗ này bằng cách vẽ một dòng chữ đè lên vùng đó. Chú ý, bạn phải vẽ trong WM_NCPAINT.

Tuy nhiên, Tôi nghĩ hiện nay bạn nên dùng font VK Sans Serif. Đây là font của VietKey nên chắc máy nào cũng có cả. Và nó là một dạng font TCVN3 nên rất dễ làm việc.

Còn một cách nữa là Anh Chị sử dụng hàm MessageBoxW

2. Với menu:

Tôi nghĩ Anh Chị nên thực hiện “chiêu” sau:

Mở file *.rc (Nếu project của bạn là ABC thì file đó là ABC.rc). Biên soạn lại menu thành tiếng Việt UNICODE bằng NotePad, rồi lưu lại file đó với thuộc tính UNIODE

Khi đó bạn sẽ bị cảnh báo lỗi khi vào VC++ nhưng không sao. Khi bạn chạy thì menu sẽ xuất hiện Tiếng Việt

3. Với caption:

Đây là phần khó nhất của việc hiển thị tiếng Việt trên giao diện chương trình. Phương án của Tôi đưa ra ở đây là các bạn nên xử lý trong sự kiện WM_NCPAINT

4. Phụ lục:

Cách tạo một project có menu và caption bằng tiếng Việt

1. Sử dụng Wizard để tạo một chương trình có tên TestViet dạng Win32 Application.

2. Tìm tập tin TestViet.rc và mở tập tin này bằng Notepad hay chương trình soạn thảo file text nào đó cũng được

3. Sửa phần menu trong tập tin TestViet.rc lại lại như hình sau

4. Sau đó chọn Save As với Encoding là Unicode

5. Chạy thử chương trình. Bạn thấy menu có tiếng Việt 100%

6. Bây giờ, chúng ta sẽ hiển thị tiếng Việt trên thanh Caption. Đầu tiên chúng ta sẽ tạo một chuỗi UNICODE trong resource.

Mở file TestViet.rc và chèn vào dòng IDS_STRING1 "Chương trình tiếng Việt" như hình dưới

IDS_STRING1 được định nghĩa trong file resource.h như sau

7. Sau đó, các anh chị phải viết thêm vào chương trình một hàm[1]

void DrwCaption(HWND hWnd, bool fActive)

{

HDC dc; // Ma khung ve

COLORREF rgbText; // Mau chu

COLORREF rgbBkGrnd; // Mau nen

LOGFONT lf; // Thong tin ve font chu

HFONT font; // Ma Font

WCHAR wCaption[MAX_LOADSTRING]; // Tieu de thanh caption

dc = GetWindowDC(hWnd); // Lay ma khung ve cua cua so

// Kiem tra trang thai cua so de chon mau thich hop

if (fActive)

{ rgbText = GetSysColor(COLOR_CAPTIONTEXT);
rgbBkGrnd = GetSysColor(COLOR_ACTIVECAPTION);

}

else

{ rgbText = GetSysColor(COLOR_INACTIVECAPTIONTEXT);

rgbBkGrnd = GetSysColor(COLOR_INACTIVECAPTION);

}

// Dat mau nen va mau chu cho cua so

SetTextColor(dc, rgbText);

SetBkColor(dc, rgbBkGrnd);

// Ve chu o che do trong suot (khong can den mau nen)

SetBkMode(dc, OPAQUE); //TRANSPARENT

// Chuan bi thong tin ve Font chu

FillMemory(&lf, sizeof(lf), 0);

lf.lfHeight = 15; // Kich thuoc Font

lf.lfCharSet = ANSI_CHARSET;

lf.lfQuality = DEFAULT_QUALITY;

lf.lfClipPrecision = CLIP_LH_ANGLES | CLIP_STROKE_PRECIS;

lf.lfPitchAndFamily = FF_SWISS;

strcpy(lf.lfFaceName, "Arial"); // Ten Font

// Tao Font chu de ve dua tren cac thong tin da thiet lap

font = CreateFontIndirect(&lf);

// Chon font chu Arial vao khung ve va luu lai font chu cu

font = (HFONT)SelectObject(dc, font);

// Dat tieu de va ve chuoi tren thanh caption

LoadStringW(hInst,IDS_STRING1,wCaption,MAX_LOADSTRING);

TextOutW(dc, 20, 5, wCaption, 23);

// Dat Font chu cu tra lai cho khung ve

font = (HFONT)SelectObject(dc, font);

// Xoa doi tuong Font chu, giai phong tai nguyen cho he thong

DeleteObject(font);

// Tra lai bo dieu khien khung ve cho Windows

ReleaseDC(hWnd, dc);

}

8. Tiếp theo, bạn viết lệnh cho 2 thông điệp WM_NCPAINT

case WM_NCPAINT[2]:

DefWindowProc(hWnd, message, wParam, lParam);

fActive = (hWnd == GetActiveWindow());

DrwCaption(hWnd, fActive);

break;

case WM_NCACTIVATE:

DefWindowProc(hWnd, message, wParam, lParam);

fActive = (wParam != 0);

DrwCaption(hWnd, fActive);

break;

9. Cuối cùng, bạn chạy thử chương trình

Đến đây thì chương trình của các anh chị đã hiển thị được tiếng Việt rồi , không khó chút nào phải không các anh chị và các bạn . Chúc các anh chị và các bạn thành công.

Các anh chị có thể download chương trình tiếng Việt mẫu ở đây : TViet.Zip

1] Hàm này tác giả có tham khảo và bổ sung hàm của SV 100B1210

[2] Đoạn lệnh này tác giả có tham khảo của SV 100B1210

Thứ Hai, 3 tháng 5, 2010

Bài 3: thiết kế và thực thi CSDL Sql Server.



Như đã trình bày ở các bài trước một trong những đặc điểm của SQL Server 2000 là Multiple-Instance nên khi nói đến một (SQL) Server nào đó là ta nói đến một Instance của SQL Server 2000, thông thường đó là Default Instance.





Một Instance của SQL Server 2000 có 4 system databases và một hay nhiều user database. Các system databases bao gồm:

Cấu Trúc Của SQL Server

Như đã trình bày ở các bài trước một trong những đặc điểm của SQL Server 2000 là Multiple-Instance nên khi nói đến một (SQL) Server nào đó là ta nói đến một Instance của SQL Server 2000, thông thường đó là Default Instance. Một Instance của SQL Server 2000 có 4 system databases và một hay nhiều user database. Các system databases bao gồm:

  • Master : Chứa tất cả những thông tin cấp hệ thống (system-level information) bao gồm thông tin về các database khác trong hệ thống như vị trí của các data files, các login account và các thiết đặt cấu hình hệ thống của SQL Server (system configuration settings).
  • Tempdb : Chứa tất cả những table hay stored procedure được tạm thời tạo ra trong quá trình làm việc bởi user hay do bản thân SQL Server engine. Các table hay stored procedure này sẽ biến mất khi khởi động lại SQL Server hay khi ta disconnect.
  • Model : Database này đóng vai trò như một bảng kẻm (template) cho các database khác. Nghĩa là khi một user database được tạo ra thì SQL Server sẽ copy toàn bộ các system objects (tables, stored procedures...) từ Model database sang database mới vừa tạo.
  • Msdb : Database này được SQL Server Agent sử dụng để hoạch định các báo động và các công việc cần làm (schedule alerts and jobs).

Cấu Trúc Vật Lý Của Một SQL Server Database

Mỗi một database trong SQL Server đều chứa ít nhất một data file chính (primary), có thể có thêm một hay nhiều data file phụ (Secondary) và một transaction log file.

  • Primary data file (thường có phần mở rộng .mdf) : đây là file chính chứa data và những system tables.
  • Secondary data file (thường có phần mở rộng .ndf) : đây là file phụ thường chỉ sử dụng khi database được phân chia để chứa trên nhiều dĩa.
  • Transaction log file (thường có phần mở rộng .ldf) : đây là file ghi lại tất cả những thay đổi diễn ra trong một database và chứa đầy đủ thông tin để có thể roll back hay roll forward khi cần.

Data trong SQL Server được chứa thành từng Page 8KB và 8 page liên tục tạo thành một Extent.

Trước khi SQL Server muốn lưu data vào một table nó cần phải dành riêng một khoảng trống trong data file cho table đó. Những khoảng trống đó chính là các extents. Có 2 loại Extents: Mixed Extents (loại hỗn hợp) dùng để chứa data của nhiều tables trong cùng một Extent và Uniform Extent (loại thuần nhất) dùng để chứa data của một table. Ðầu tiên SQL Server dành các Page trong Mixed Extent để chứa data cho một table sau đó khi data tăng trưởng thì SQL dành hẳn một Uniform Extent cho table đó.

Nguyên Tắc Hoạt Ðộng Của Transaction Log Trong SQL Server

Transaction log file trong SQL Server dùng để ghi lại các thay đổi xảy ra trong database. Quá trình này diễn ra như sau: đầu tiên khi có một sự thay đổi data như Insert, Update, Delete được yêu cầu từ các ứng dụng, SQL Server sẽ tải (load) data page tương ứng lên memory (vùng bộ nhớ này gọi là data cache), sau đó data trong data cache được thay đổi(những trang bị thay đổi còn gọi là dirty-page). Tiếp theo mọi sự thay đổi đều được ghi vào transaction log file cho nên người ta gọi là write-ahead log. Cuối cùng thì một quá trình gọi là Check Point Process sẽ kiểm tra và viết tất cả những transaction đã được commited (hoàn tất) vào dĩa cứng (flushing the page).

Ngoài Check Point Process những dirty-page còn được đưa vào dĩa bởi một Lazy writer. Ðây là một anh chàng làm việc âm thầm chỉ thức giấc và quét qua phần data cache theo một chu kỳ nhất định sau đó lại ngủ yên chờ lần quét tới.

Xin giải thích thêm một chút về khái niệm transaction trong database. Một transaction hay một giao dịch là một loạt các hoạt động xảy ra được xem như một công việc đơn (unit of work) nghĩa là hoặc thành công toàn bộ hoặc không làm gì cả (all or nothing). Sau đây là một ví dụ cổ điển về transaction:

Chúng ta muốn chuyển một số tiền $500 từ account A sang
account B như vậy công việc này cần làm các bước sau:

1. Trừ $500 từ account A

2. Cộng $500 vào account B

Tuy nhiên việc chuyển tiền trên phải được thực hiện dưới dạng một transaction nghĩa là giao dịch chỉ được
xem là hoàn tất (commited) khi cả hai bước trên đều thực hiện thành công. Nếu vì một lý do nào đó ta chỉ
có thể thực hiện được bước 1 (chẳng hạn như vừa xong bước 1 thì điện cúp hay máy bị treo) thì xem như giao
dịch không hoàn tất và cần phải được phục hồi lại trạng thái ban đầu (roll back).

Thế thì Check Point Process hoạt động như thế nào để có thể đảm bảo một transaction được thực thi mà không làm "dơ" database.

Trong hình vẽ trên, một transaction được biểu diễn bằng một mũi tên. Trục nằm ngang là trục thời gian. Giả sử một Check Point được đánh dấu vào thời điểm giữa transaction 2 và 3 như hình vẽ và sau đó sự cố xãy ra trước khi gặp một Check point kế tiếp. Như vậy khi SQL Server được restart nó sẽ dựa trên những gì ghi trong transaction log file để phục hồi data (xem hình vẽ).

Ðiều đó có nghĩa là SQL Server sẽ không cần làm gì cả đối với transaction 1 vì tại thời điểm Check point data đã được lưu vào dĩa rồi. Trong khi đó transaction 2 và 4 sẽ được roll forward vì tuy đã được commited nhưng do sự cố xảy ra trước thời điểm check point kế tiếp nên data chưa kịp lưu vào dĩa. Tức là dựa trên những thông tin được ghi trên log file SQL Server hoàn toàn có đầy đủ cơ sở để viết vào dĩa cứng. Còn transaction 3 và 5 thì chưa được commited (do bị down bất ngờ) cho nên SQL Server sẽ roll back hai transaction này dựa trên những gì được ghi trên log file.

Cấu Trúc Logic Của Một SQL Server Database

Hầu như mọi thứ trong SQL Server được tổ chức thành những objects ví dụ như tables, views, stored procedures, indexes, constraints.... Những system objects trong SQL Server thường có bắt đầu bằng chữ sys hay sp. Các objects trên sẽ được nghiên cứu lần lượt trong các bài sau do đó trong phần này chúng ta chỉ bàn sơ qua một số system object thông dụng trong SQL Server database mà thôi.

Một số Sytem objects thường dùng:

System Stored Procedure
Ứng dụng
Sp_help ['object']
Cung cấp thông tin về một database object (table, view...) hay một data type.
Sp_helpdb ['database']
Cung cấp thông tin về một database cụ thể nào đó.
Sp_monitor
Cho biết độ bận rộn của SQL Server
Sp_spaceused ['object', 'updateusage' ]
Cung cấp thông tin về các khoảng trống đã được sử dụng cho một object nào đó
Sp_who ['login']
Cho biết thông tin về một SQL Server user

Ví dụ:

sp_helpdb 'Northwind' sẽ cho kết quả có dạng như bảng dưới đây

name db_size owner dbid created status .....
-------------------------------------------------------------------------------------------------------------------------------- -------
Northwind 3.94 MB sa 6 Aug 6 2000 Status=ONLINE, Updateability=READ_WRITE, .....

stored procedure sp_spaceused như ví dụ sau

USE Northwind
Go
sp_spaceused 'Customers'

sẽ cho biết thông tin về table Customer:

name rows reserved data index_size unused
------------------------------------- ------------------------------------------
Customers 91 104 KB 24 KB 80 KB 0 KB

Tạo Một User Database

Chúng ta có thể tạo một database dễ dàng dùng SQL Server Enterprise bằng cách right-click lên trên "database" và chọn "New Database".

Sau đó chúng ta chỉ việc đánh tên của database và click OK.

Ngoài ra đôi khi chúng ta cũng dùng SQL script để tạo một database. Khi đó ta phải chỉ rõ vị trí của primary data file và transaction log file.

Ví dụ:

USE master
GO
CREATE DATABASE Products
ON
( NAME = prods_dat,
FILENAME = 'c:\program files\microsoft SQL server\mssql\data\prods.mdf',
SIZE = 4,
MAXSIZE = 10,
FILEGROWTH = 1
)
GO

Trong ví dụ trên ta tạo một database tên là Products với logical file name là prods_dat và physical file name là prods.mdf, kích thước ban đầu là 4 MB và data file sẽ tự động tăng lên mỗi lần 1 MB cho tới tối đa là 10 MB. Nếu ta không chỉ định một transaction log file thì SQL sẽ tự động tạo ra 1 log file với kích thước ban đầu là 1 MB.

Lưu Ý:

Khi tạo ra một database chúng ta cũng phải lưu ý một số điểm sau: Ðối với các hệ thống nhỏ mà ở đó vấn đề tốc độ của server không thuộc loại nhạy cảm thì chúng ta thường chọn các giá trị mặc định (default) cho Initial size, Automatically growth file. Nhưng trên một số production server của các hệ thống lớn kích thước của database phải được người DBA ước lượng trước tùy theo tầm cỡ của business, và thông thường người ta không chọn Autogrowth(tự động tăng trưởng) và Autoshrink(tự động nén). Câu hỏi được đặt ra ở đây là vì sao ta không để SQL Server chọn một giá trị khởi đầu cho datafile và sau đó khi cần thì nó sẽ tự động nới rộng ra mà lại phải ước lượng trước? Nguyên nhân là nếu chọn Autogrowth (hay Autoshrink) thì chúng ta có thể sẽ gặp 2 vấn đề sau:

  • Performance hit: Ảnh hưởng đáng kể đến khả năng làm việc của SQL Server. Do nó phải thường xuyên kiểm tra xem có đủ khoảng trống cần thiết hay không và nếu không đủ nó sẽ phải mở rộng bằng cách dành thêm khoảng trống từ dĩa cứng và chính quá trình này sẽ làm chậm đi hoạt động của SQL Server.
  • Disk fragmentation : Việc mở rộng trên cũng sẽ làm cho data không được liên tục mà chứa ở nhiều nơi khác nhau trong dĩa cứng điều này cũng gây ảnh hưởng lên tốc độ làm việc của SQL Server.

Trong các hệ thống lớn người ta có thể dự đoán trước kích thước của database bằng cách tính toán kích thước của các tables, đây cũng chỉ là kích thước ước đoán mà thôi (xin xem "Estimating the size of a database" trong SQL Books Online để biết thêm về cách tính) và sau đó thường xuyên dùng một số câu lệnh SQL (thường dùng các câu lệnh bắt đầu bằng DBCC .Phần này sẽ được bàn qua trong các bài sau) kiểm tra xem có đủ khoảng trống hay không nếu không đủ ta có thể chọn một thời điểm mà SQL server ít bận rộn nhất (như ban đêm hay sau giờ làm việc) để nới rộng data file như thế sẽ không làm ảnh hưởng tới performance của Server.

Chú ý giả sử ta dành sẵn 2 GB cho datafile, khi dùng Window Explorer để xem ta sẽ thấy kích thước của file là 2 GB nhưng data thực tế có thể chỉ chiếm vài chục MB mà thôi.

Những Ðiểm Cần Lưu Ý Khi Thiết Kế Một Database

Trong phạm vi bài này chúng ta không thể nói sâu về lý thuyết thiết kế database mà chỉ đưa ra một vài lời khuyên mà bạn nên tuân theo khi thiết kế.

Trước hết bạn phải nắm vững về các loại data type. Ví dụ bạn phải biết rõ sự khác biệt giữa char(10), nchar(10) varchar(10), nvarchar(10). Loại dữ liệu Char là một loại string có kích thước cố định nghĩa là trong ví dụ trên nếu data đưa vào "This is a really long character string" (lớn hơn 10 ký tự) thì SQL Server sẽ tự động cắt phần đuôi và ta chỉ còn "This is a". Tương tự nếu string đưa vào nhỏ hơn 10 thì SQL sẽ thêm khoảng trống vào phía sau cho đủ 10 ký tự. Ngược lại loại varchar sẽ không thêm các khoảng trống phía sau khi string đưa vào ít hơn 10. Còn loại data bắt đầu bằng chữ n chứa dữ liệu dạng unicode.

Một lưu ý khác là trong SQL Server ta có các loại Integer như : tinyint, smallint, int, bigint. Trong đó kích thước từng loại tương ứng là 1,2,4,8 bytes. Nghĩa là loại smallint tương đương với Integer và loại int tương đương với Long trong VB.

Khi thiết kế table nên:

  • Có ít nhất một cột thuộc loại ID dùng để xác định một record dễ dàng.
  • Chỉ chứa data của một entity (một thực thể)

Trong ví dụ sau thông tin về Sách và Nhà Xuất Bản được chứa trong cùng một table

Books

BookID Title Publisher PubState PubCity PubCountry
1 Inside SQL Server 2000 Microsoft Press CA Berkely USA
2 Windows 2000 Server New Riders MA Boston USA
3 Beginning Visual Basic 6.0 Wrox CA Berkely USA

Ta nên tách ra thành table Books và table Publisher như sau:

Books

BookID Title PublisherID
1 Inside SQL Server 2000 P1
2 Windows 2000 Server P2
3 Beginning Visual Basic 6.0 P3

Publishers

PublisherID Publisher PubState PubCity PubCountry
P1 Microsoft Press CA Berkely USA
P2 New Riders MA Boston USA
P3 Wrox CA Berkely USA
  • Tránh dùng cột có chứa NULL và nên luôn có giá trị Default cho các cột
  • Tránh lập lại một giá trị hay cột nào đó

Ví dụ một cuốn sách có thể được viết bởi hơn một tác giả và như thế ta có thể dùng một trong 2 cách sau để chứa data:

Books

BookID Title Authors
1 Inside SQL Server 2000 John Brown
2 Windows 2000 Server Matthew Bortniker, Rick Johnson
3 Beginning Visual Basic 6.0 Peter Wright, James Moon, John Brown

hay

Books

BookID Title Author1 Author2 Author3
1 Inside SQL Server 2000 John Brown Null Null
2 Windows 2000 Server Matthew Bortniker Rick Johnson Null
3 Beginning Visual Basic 6.0 Peter Wright James Moon John Brown

Tuy nhiên việc lập đi lập lại cột Author sẽ tạo nhiều vấn đề sau này. Chẳng hạn như nếu cuốn sách có nhiều hơn 3 tác giả thì chúng ta sẽ gặp phiền phức ngay....Trong ví dụ này ta nên chặt ra thành 3 table như sau:

Books

BookID Title
1 Inside SQL Server 2000
2 Windows 2000 Server
3 Beginning Visual Basic 6.0

Authors

AuthID First Name Last Name
A1 John Brown
A2 Matthew Bortniker
A3 Rick Johnson
A4 Peter Wright
A5 James Moon

AuthorBook

BookID AuthID
1 A1
2 A2
2 A3
3 A4
3 A5
3 A1

Ngoài ra một trong những điều quan trọng là phải biết rõ quan hệ (Relationship) giữa các table:

  • One-to-One Relationships : trong mối quan hệ này thì một hàng bên table A không thể liên kết với hơn 1 hàng bên table B và ngược lại.
  • One-to-Many Relationships : trong mối quan hệ này thì một hàng bên table A có thể liên kết với nhiều hàng bên table B.
  • Many-to-Many Relationships : trong mối quan hệ này thì một hàng bên table A có thể liên kết với nhiều hàng bên table B và một hàng bên table B cũng có thể liên kết với nhiều hàng bên table A. Như ta thấy trong ví dụ trên một cuốn sách có thể được viết bởi nhiều tác giả và một tác giả cũng có thể viết nhiều cuốn sách. Do đó mối quan hệ giữa Books và Authors là quan hệ Many to Many. Trong trường hợp này người ta thường dùng một table trung gian để giải quyết vấn đề (table AuthorBook).

Ðể có một database tương đối hoàn hảo nghĩa là thiết kế sao cho data chứa trong database không thừa không thiếu bạn cần biết thêm về các thủ thuật Normalization. Tuy nhiên trong phạm vi khóa học này chúng tôi không muốn bàn sâu hơn về đề tài này, bạn có thể xem thêm trong các sách dạy lý thuyết cơ sở dữ liệu.

Tóm lại trong bài này chúng ta đã tìm hiểu về cấu trúc của một SQL Server database và một số vấn đề cần biết khi thiết kế một database. Trong bài sau chúng ta sẽ bàn về Backup và Restore database như thế nào.

Bài 2: Transact SQL



Transact-SQL là ngôn ngữ SQL mở rộng dựa trên SQL chuẩn của ISO (International Organization for Standardization) và ANSI (American National Standards Institute) được sử dụng trong SQL Server khác với P-SQL (Procedural-SQL) dùng trong Oracle.


Bài 1: Tổng quan về SQL Server 2000


Giới Thiệu Sơ Lược Về Transact SQL (T-SQL)

Transact-SQL là ngôn ngữ SQL mở rộng dựa trên SQL chuẩn của ISO (International Organization for Standardization) và ANSI (American National Standards Institute) được sử dụng trong SQL Server khác với P-SQL (Procedural-SQL) dùng trong Oracle.

Trong bài này chúng ta sẽ tìm hiểu sơ qua về T-SQL. Chúng được chia làm 3 nhóm:

Data Definition Language (DDL):

Ðây là những lệnh dùng để quản lý các thuộc tính của một database như định nghĩa các hàng hoặc cột của một table, hay vị trí data file của một database...thường có dạng

  • Create object_Name
  • Alter object_Name
  • Drop object_Name

Trong đó object_Name có thể là một table, view, stored procedure, indexes...

Ví dụ:

Lệnh Create sau sẽ tạo ra một table tên Importers với 3 cột CompanyID,CompanyName,Contact

USE Northwind

CREATE TABLE Importers(
CompanyID int NOT NULL,
CompanyName varchar(40) NOT NULL,
Contact varchar(40) NOT NULL
)

Lệnh Alter sau đây cho phép ta thay đổi định nghĩa của một table như thêm(hay bớt) một cột hay một Constraint...Trong ví dụ này ta sẽ thêm cột ContactTitle vào table Importers

USE Northwind

ALTER TABLE Importers
ADD ContactTitle varchar(20) NULL

Lệnh Drop sau đây sẽ hoàn toàn xóa table khỏi database nghĩa là cả định nghĩa của table và data bên trong table đều biến mất (khác với lệnh Delete chỉ xóa data nhưng table vẫn tồn tại).

USE Northwind

DROP TABLE Importers

Data Control Language (DCL):

Ðây là những lệnh quản lý các quyền truy cập lên từng object (table, view, stored procedure...). Thường có dạng sau:

  • Grant
  • Revoke
  • Deny

Ví dụ:

Lệnh sau sẽ cho phép user trong Public Role được quyền Select đối với table Customer trong database Northwind (Role là một khái niệm giống như Windows Group sẽ được bàn kỹ trong phần Security)

USE Northwind
GRANT SELECT
ON Customers
TO PUBLIC

Lệnh sau sẽ từ chối quyền Select đối với table Customer trong database Northwind của các user trong Public Role

USE Northwind
DENY SELECT
ON Customers
TO PUBLIC

Lệnh sau sẽ xóa bỏ tác dụng của các quyền được cho phép hay từ chối trước đó

Data Manipulation Language (DML):

Ðây là những lệnh phổ biến dùng để xử lý data như Select, Update, Insert, Delete

Ví dụ:

Select

USE Northwind
SELECT CustomerID, CompanyName, ContactName
FROM Customers
WHERE (CustomerID = 'alfki' OR CustomerID = 'anatr')
ORDER BY ContactName

Insert

USE Northwind
INSERT INTO Territories
VALUES (98101, 'Seattle', 2)

Update

USE Northwind
UPDATE Territories
SET TerritoryDescription = 'Downtown Seattle'
WHERE TerritoryID = 98101

Delete

USE Northwind
DELETE FROM Territories
WHERE TerritoryID = 98101

Vì phần này khá căn bản nên chúng tôi thiết nghĩ không cần giải thích nhiều. Chú ý trong lệnh Delete bạn có thể có chữ From hay không đều được.

Nhưng mà chúng ta sẽ chạy thử các ví dụ trên ở đâu?

Ðể chạy các câu lệnh thí dụ ở trên bạn cần sử dụng và làm quen với Query Analyser

Cơ bản về SQL Server 2000

Cú Pháp Của T-SQL:

Phần này chúng ta sẽ bàn về các thành phần tạo nên cú pháp của T-SQL

Identifiers

Ðây chính là tên của các database object. Nó dùng để xác định một object. (Chú ý khi nói đến Object trong SQL Server là chúng ta muốn đề cập đến table, view, stored procedure, index.....Vì hầu như mọi thứ trong SQL Server đều được thiết kế theo kiểu hướng đối tượng (object-oriented)). Trong ví dụ sau TableX, KeyCol, Description là những identifiers

CREATE TABLE TableX
(KeyCol INT PRIMARY KEY, Description NVARCHAR(80))

Có hai loại Identifiers một loại thông thường (Regular Identifier) và một loại gọi là Delimited Identifier, loại này cần có dấu "" hay dấu [] để ngăn cách. Loại Delimited được dùng đối với các chữ trùng với từ khóa của SQL Server (reserved keyword) hay các chữ có khoảng trống.

Ví dụ:

SELECT * FROM [My Table]
WHERE [Order] = 10

Trong ví dụ trên chữ Order trùng với keyword Order nên cần đặt trong dấu ngoặc vuông [].

Variables (Biến)

Biến trong T-SQL cũng có chức năng tương tự như trong các ngôn ngữ lập trình khác nghĩa là cần khai báo trước loại dữ liệu trước khi sử dụng. Biến được bắt đầu bằng dấu @ (Ðối với các global variable thì có hai dấu @@)

Ví dụ:

USE Northwind
DECLARE @EmpIDVar INT
SET @EmpIDVar = 3
SELECT * FROM Employees
WHERE EmployeeID = @EmpIDVar + 1

Functions (Hàm)

Có 2 loại hàm một loại là built-in và một loại user-defined

Các hàm Built-In được chia làm 3 nhóm:

  • Rowset Functions : Loại này thường trả về một object và được đối xử như một table. Ví dụ như hàm OPENQUERY sẽ trả về một recordset và có thể đứng vị trí của một table trong câu lệnh Select.
  • Aggregate Functions : Loại này làm việc trên một số giá trị và trả về một giá trị đơn hay là các giá trị tổng. Ví dụ như hàm AVG sẽ trả về giá trị trung bình của một cột.
  • Scalar Functions : Loại này làm việc trên một giá trị đơn và trả về một giá trị đơn. Trong loại này lại chia làm nhiều loại nhỏ như các hàm về toán học, về thời gian, xử lý kiểu dữ liệu String....Ví dụ như hàm MONTH('2002-09-30') sẽ trả về tháng 9.

Các hàm User-Defined (được tạo ra bởi câu lệnh CREATE FUNCTION và phần body thường được gói trong cặp lệnh BEGIN...END) cũng được chia làm các nhóm như sau:

  • Scalar Functions : Loại này cũng trả về một giá trị đơn bằng câu lệnh RETURNS.
  • Table Functions : Loại này trả về một table

Data Type (Loại Dữ Liệu)

Các loại dữ liệu trong SQL Server sẽ được bàn kỹ trong các bài sau

Expressions

Các Expressions có dạng Identifier + Operators (như +,-,*,/,=...) + Value

Các thành phần Control-Of Flow

Như BEGIN...END, BREAK, CONTINUE, GOTO, IF...ELSE, RETURN, WHILE.... Xin xem thêm Books Online để biết thêm về các thành phần này.

Comments (Chú Thích)

T-SQL dùng dấu -- để đánh dấu phần chú thích cho câu lệnh đơn và dùng /*...*/ để chú thích cho một nhóm

Thực Thi Các Câu Lệnh SQL

Thực thi một câu lệnh đơn:

Một câu lệnh SQL được phân ra thành các thành phần cú pháp như trên bởi một parser, sau đó SQL Optimizer (một bộ phận quan trọng của SQL Server) sẽ phân tích và tìm cách thực thi (Execute Plan) tối ưu nhất ví dụ như cách nào nhanh và tốn ít tài nguyên của máy nhất... và sau đó SQL Server Engine sẽ thực thi và trả về kết quả.

Thực Thi một nhóm lệnh (Batches)

Khi thực thi một nhóm lệnh SQL Server sẽ phân tích và tìm biện pháp tối ưu cho các câu lệnh như một câu lệnh đơn và chứa execution plan đã được biên dịch (compiled) trong bộ nhớ sau đó nếu nhóm lệnh trên được gọi lại lần nữa thì SQL Server không cần biên dịch mà có thể thực thi ngay điều này giúp cho một batch chạy nhanh hơn.

Lệnh GO

Lệnh này chỉ dùng để gởi một tín hiệu cho SQL Server biết đã kết thúc một batch job và yêu cầu thực thi. Nó vốn không phải là một lệnh trong T-SQL.

Tóm lại trong phần này chúng ta đã tìm hiểu về Transact- SQL là ngôn ngữ chính để giao tiếp với SQL Server. Trong bài sau chúng ta sẽ tiếp tục bàn về cấu trúc bên trong của SQL Server .



Nguồn: ngocdv - zensoft

Bài 1: Tổng quan về SQL Server 2000



SQL Server 2000 là một hệ thống quản lý cơ sở dữ liệu (Relational Database Management System (RDBMS) ) sử dụng Transact-SQL để trao đổi dữ liệu giữa Client computer và SQL Server computer. Một RDBMS bao gồm databases, database engine và các ứng dụng dùng để quản lý dữ liệu và các bộ phận khác nhau trong RDBMS.


Giới Thiệu SQL Server 2000

Tôi muốn giới thiệu cho mọi người một cách hệ thống về SQL Server 2000. Bắt đầu từ bài 1: Tổng quan về SQL Server 2000.

SQL Server 2000 là một hệ thống quản lý cơ sở dữ liệu (Relational Database Management System (RDBMS) ) sử dụng Transact-SQL để trao đổi dữ liệu giữa Client computer và SQL Server computer. Một RDBMS bao gồm databases, database engine và các ứng dụng dùng để quản lý dữ liệu và các bộ phận khác nhau trong RDBMS.

SQL Server 2000 được tối ưu để có thể chạy trên môi trường cơ sở dữ liệu rất lớn (Very Large Database Environment) lên đến Tera-Byte và có thể phục vụ cùng lúc cho hàng ngàn user. SQL Server 2000 có thể kết hợp "ăn ý" với các server khác như Microsoft Internet Information Server (IIS), E-Commerce Server, Proxy Server....

SQL Server có 7 editions:

Enterprise : Chứa đầy đủ các đặc trưng của SQL Server và có thể chạy tốt trên hệ thống lên đến 32 CPUs và 64 GB RAM. Thêm vào đó nó có các dịch vụ giúp cho việc phân tích dữ liệu rất hiệu quả (Analysis Services)

Standard : Rất thích hợp cho các công ty vừa và nhỏ vì giá thành rẻ hơn nhiều so với Enterprise Edition, nhưng lại bị giới hạn một số chức năng cao cấp (advanced features) khác, edition này có thể chạy tốt trên hệ thống lên đến 4 CPU và 2 GB RAM.

Personal: được tối ưu hóa để chạy trên PC nên có thể cài đặt trên hầu hết các phiên bản windows kể cả Windows 98.

Developer : Có đầy đủ các tính năng của Enterprise Edition nhưng được chế tạo đặc biệt như giới hạn số lượng người kết nối vào Server cùng một lúc.... Ðây là edition mà các bạn muốn học SQL Server cần có. Chúng ta sẽ dùng edition này trong suốt khóa học. Edition này có thể cài trên Windows 2000 Professional hay Win NT Workstation.

Desktop Engine (MSDE): Ðây chỉ là một engine chạy trên desktop và không có user interface (giao diện). Thích hợp cho việc triển khai ứng dụng ở máy client. Kích thước database bị giới hạn khoảng 2 GB.

Win CE : Dùng cho các ứng dụng chạy trên Windows CE

Trial: Có các tính năng của Enterprise Edition, download free, nhưng giới hạn thời gian sử dụng.

Cài Ðặt SQL Server 2000 (Installation)

Các bạn cần có Developer Edition và ít nhất là 64 MB RAM, 500 MB hard disk để có thể install SQL Server. Bạn có thể install trên Windows Server hay Windows XP Professional, Windows 2000 Professional hay NT Workstation nhưng không thể install trên Win 98 family.

Vì một trong những đặc điểm của các sản phẩm Microsoft là dễ install nên chúng tôi không trình bày chi tiết về cách install hay các bước install mà chỉ trình bày các điểm cần lưu ý khi install mà thôi. Nếu các bạn gặp trở ngại trong việc install thì có thể đưa lên forum để hỏi thêm. Khi install bạn cần lưu ý các điểm sau:

Ở màn hình thứ hai bạn chọn Install Database Server. Sau khi install xong SQL Server bạn có thể install thêm Analysis Service nếu bạn thích.

Ở màn hình Installation Definition bạn chọn Server and Client Tools.

Sau đó bạn nên chọn kiểu Customchọn tất cả các bộ phận của SQL Server. Ngoài ra nên chọn các giá trị mặc định (default)

Ở màn hình Authentication Mode nhớ chọn Mixed Mode . Lưu ý vì SQL Server có thể dùng chung chế độ bảo mật (security) với Win NT và cũng có thể dùng chế độ bảo mật riêng của nó. Trong Production Server người ta thường dùng Windows Authetication vì độ an toàn cao hơn và dễ dàng cho người quản lý mạng và cả cho người sử dụng. Nghĩa là một khi bạn được chấp nhận (authenticated) kết nối vào domain thì bạn có quyền truy cập dữ liệu (access data) trong SQL Server. Tuy nhiên ta nên chọn Mixed Mode để dễ dàng cho việc học tập.

Sau khi install bạn sẽ thấy một icon nằm ở góc phải bên dưới màn hình, đây chính là Service Manager. Bạn có thể Start, Stop các SQL Server services dễ dàng bằng cách double-click vào icon này.

Một chút kiến thức về các Version của SQL Server

SQL Server của Microsoft được thị trường chấp nhận rộng rãi kể từ version 6.5. Sau đó Microsoft đã cải tiến và hầu như viết lại một engine mới cho SQL Server 7.0. Cho nên có thể nói từ version 6.5 lên version 7.0 là một bước nhảy vọt. Có một số đặc tính của SQL Server 7.0 không tương thích với version 6.5. Trong khi đó từ Version 7.0 lên version 8.0 (SQL Server 2000) thì những cải tiến chủ yếu là mở rộng các tính năng về web và làm cho SQL Server 2000 đáng tin cậy hơn.

Một điểm đặc biệt đáng lưu ý ở version 2000 là Multiple-Instance. Nói cho dễ hiểu là bạn có thể install version 2000 chung với các version trước mà không cần phải uninstall chúng. Nghĩa là bạn có thể chạy song song version 6.5 hoặc 7.0 với version 2000 trên cùng một máy (điều này không thể xảy ra với các version trước đây). Khi đó version cũ trên máy bạn là Default Instance còn version 2000 mới vừa install sẽ là Named Instance.

Các thành phần quan trọng trong SQL Server 2000

SQL Server 2000 được cấu tạo bởi nhiều thành phần như Relational Database Engine, Analysis Service và English Query.... Các thành phần này khi phối hợp với nhau tạo thành một giải pháp hoàn chỉnh giúp cho việc lưu trữ và phân tích dữ liệu một cách dễ dàng.

Relational Database Engine - Cái lõi của SQL Server:

Ðây là một engine có khả năng chứa data ở các quy mô khác nhau dưới dạng table và support tất cả các kiểu kết nối (data connection) thông dụng của Microsoft như ActiveX Data Objects (ADO), OLE DB, and Open Database Connectivity (ODBC). Ngoài ra nó còn có khả năng tự điều chỉnh (tune up) ví dụ như sử dụng thêm các tài nguyên (resource) của máy khi cần và trả lại tài nguyên cho hệ điều hành khi một user log off.

Replication - Cơ chế tạo bản sao (Replica):

Giả sử bạn có một database dùng để chứa dữ liệu được các ứng dụng thường xuyên cập nhật. Một ngày đẹp trời bạn muốn có một cái database giống y hệt như thế trên một server khác để chạy báo cáo (report database) (cách làm này thường dùng để tránh ảnh hưởng đến performance của server chính). Vấn đề là report server của bạn cũng cần phải được cập nhật thường xuyên để đảm bảo tính chính xác của các báo cáo. Bạn không thể dùng cơ chế back up and restore trong trường hợp này. Thế thì bạn phải làm sao? Lúc đó cơ chế replication của SQL Server sẽ được sử dụng để bảo đảm cho dữ liệu ở 2 database được đồng bộ (synchronized). Replication sẽ được bàn kỹ trong bài 12

Data Transformation Service (DTS) - Một dịch vụ chuyển dịch data vô cùng hiệu quả

Nếu bạn làm việc trong một công ty lớn trong đó data được chứa trong nhiều nơi khác nhau và ở các dạng khác nhau cụ thể như chứa trong Oracle, DB2 (của IBM), SQL Server, Microsoft Access....Bạn chắc chắn sẽ có nhu cầu di chuyển data giữa các server này (migrate hay transfer) và không chỉ di chuyển bạn còn muốn định dạng (format) nó trước khi lưu vào database khác, khi đó bạn sẽ thấy DTS giúp bạn giải quyết công việc trên dễ dàng như thế nào. DTS sẽ được bàn kỹ trong bài 8.

Analysis Service - Một dịch vụ phân tích dữ liệu rất hay của Microsoft

Dữ liệu (Data) chứa trong database sẽ chẳng có ý nghĩa gì nhiều nếu như bạn không thể lấy được những thông tin (Information) bổ ích từ đó. Do đó Microsoft cung cấp cho bạn một công cụ rất mạnh giúp cho việc phân tích dữ liệu trở nên dễ dàng và hiệu quả bằng cách dùng khái niệm hình khối nhiều chiều (multi-dimension cubes) và kỹ thuật "đào mỏ dữ liệu" (data mining) sẽ được chúng tôi giới thiệu trong bài 13.

English Query - Một dịch vụ mà người Việt Nam chắc là ít muốn dùng :-) (?)

Ðây là một dịch vụ giúp cho việc query data bằng tiếng Anh "trơn" (plain English).

Meta Data Service:

Dịch vụ này giúp cho việc chứa đựng và "xào nấu" Meta data dễ dàng hơn. Thế thì Meta Data là cái gì vậy? Meta data là những thông tin mô tả về cấu trúc của data trong database như data thuộc loại nào String hay Integer..., một cột nào đó có phải là Primary key hay không....Bởi vì những thông tin này cũng được chứa trong database nên cũng là một dạng data nhưng để phân biệt với data "chính thống" người ta gọi nó là Meta Data. Phần này chắc là bạn phải xem thêm trong một thành phần khác của SQL Server sắp giới thiệu sau đây là SQL Server Books Online vì không có bài nào trong loạt bài này nói rõ về dịch vụ này cả.

SQL Server Books Online - Quyển Kinh Thánh không thể thiếu:

Cho dù bạn có đọc các sách khác nhau dạy về SQL server thì bạn cũng sẽ thấy books online này rất hữu dụng và không thể thiếu được( cho nên Microsoft mới hào phóng đính kèm theo SQL Server).

SQL Server Tools - Ðây là một bộ đồ nghề của người quản trị cơ sở dữ liệu (DBA )

Ái chà nếu kể chi tiết ra thì hơi nhiều đấy cho nên bạn cần đọc thêm trong books online. Ở đây người viết chỉ kể ra một vài công cụ thông dụng mà thôi.

  • Ðầu tiên phải kể đến Enterprise Manager. Ðây là một công cụ cho ta thấy toàn cảnh hệ thống cơ sở dữ liệu một cách rất trực quan. Nó rất hữu ích đặc biệt cho người mới học và không thông thạo lắm về SQL.
  • Kế đến là Query Analyzer. Ðối với một DBA giỏi thì hầu như chỉ cần công cụ này là có thể quản lý cả một hệ thống database mà không cần đến những thứ khác. Ðây là một môi trường làm việc khá tốt vì ta có thể đánh bất kỳ câu lệnh SQL nào và chạy ngay lập tức đặc biệt là nó giúp cho ta debug mấy cái stored procedure dễ dàng.
  • Công cụ thứ ba cần phải kể đến là SQL Profiler. Nó có khả năng "chụp" (capture) tất cả các sự kiện hay hoạt động diễn ra trên một SQL server và lưu lại dưới dạng text file rất hữu dụng trong việc kiểm soát hoạt động của SQL Server.
  • Ngoài một số công cụ trực quan như trên chúng ta cũng thường hay dùng osqlbcp (bulk copy) trong command prompt.

Tóm lại trong bài này chúng ta đã dạo qua một vòng để tìm hiểu về SQL Server. Trong bài sau chúng ta cũng sẽ tiếp tục dạo chơi thêm một chút với Transact-SQL trước khi đi sâu vào các đề tài khác.


Gửi bởi: ngocdv

Hướng dẫn viết một chương trình Sniffer



Bài này mình hướng dẫn các bạn viết một sniffer (nghe lén) packet đơn giản trên Windows. Để lập trình được thì cần các bạn hiểu rõ cách lập trình socket trong ngôn ngữ C.



Với cách lập trình socket thông thường chúng ta sử dụng SOCK_STREAM, SOCK_DGRAM tức lập trình ở mức Application của mạng mà thôi, để lập trình ở mức IP (tức tầng Network trong 4 tầng của Internet: Tầng vật lý --> Tầng Ip--> Tầng TCP --> Tầng ứng dụng) sử dụng SOCK_RAW là một dạng socket "thô"
Điều đầu tiên bao giờ chúng ta cũng phải khởi tạo thư viện Winsocket
Hàm khởi tạo thư viện như sau:
Code:

void InitWinSock()
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0) return;
}


Chi tiết hàm WSAStartup có thể xem trợ giúp của MSDN ...

Cách tạo một Raw Socket như sau:
Code:

int CreateRawSocket()
{
int sock;
if ((sock=WSASocket(AF_INET,SOCK_RAW,0,NULL,NULL,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) return 0;
return sock;
}


Hàm trên trả về một sock mới nếu như không gặp lỗi

Như chúng ta đã biết mô hình mạng Internet được phân chia thành 4 tầng (Tầng vật lý <--> Tầng Ip<--> Tầng TCP <--> Tầng ứng dụng) tương ứng với 7 tầng của mô hình OSI (Tầng vật lý <--> Tầng liên kết <--> Tầng mạng <--> Tầng vận chuyển <--> Tầng phiên <---> Tầng trình diễn <--> Tầng ứng dụng). Mình khỏi phải nhắc lại mô hình OSI như thế nào vì có rất nhiều bài viết trong diễn đàn đã nói đến OSI
Giới thiệu cấu trúc của gói IP, TCP, ICMP
a. Gói IP (ở tầng IP)
Định nghĩa một struct mô tả gói IP
Code:

struct ip_hdr{
unsigned char ver_ihl; //<-- Version (4 bits) + Internet Header Length (4 bits)
unsigned char tos; //<-- Type Of Service
unsigned short tol_len //<-- Total Length (Ip Header + TCP Header + Data)
unsigned short id //<-- Identification
unsigned short offset //<-- Frame Offset trong đó 8 bits cho flags
unsigned char ttl //<-- Time to Live
unsigned char protocol //<-- Protocol
unsigned short checksum//<-- Header Checksum
unsigned int saddr //<-- Source Address
unsigned int daddr //<-- Destination Address
};


b. Gói TCP
Định nghĩa một struct mô tả gói TCP
Code:

struct tcp_hdr{
unsigned short sport //<-- Source Port
unsigned short dport //<-- Destiantion Port
unsigned int seq_num //<-- Sequence Number
unsigned int ack_num //<-- Acknowledgment Number
unsigned char dataoffset//<--Data Offset
unsigned char flags //Flags: SYN, ACK, FIN, RST, PUSH, URG (2 bits) + 6 bits Reserve
unsigned short window //Windows
unsigned short checksum //Checksum
unsigned short urgpointer //Urgent Pointer
}


c. Gói ICMP
Định nghĩa một struct mô tả gói ICMP
Code:

struct icmp_hdr{
unsigned char type //Type
unsigned char code //Code
unsigned short checksum
unsigned short id //Identification
unsigned short sequence
unsigned short timestamp
}


Ở trên là toàn bộ định nghĩa về các gói IP, ICMP, TCP. Trong bài này mình chỉ hướng dẫn bắt các gói TCP và ICMP mà thôi, còn các gói khác thì có thể làm tương tự

Code:

#include
#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
#pragma comment (lib,"ws2_32.lib")
void InitWinSock();
int CreateRawSocket();
int Sniffer(int sock);
int packetcapture(char *packet);
int tcp_display(struct ip_hdr *ip,struct tcp_hdr *tcp);
int icmp_display(struct ip_hdr *ip,struct icmp_hdr *icmp);
struct ip_hdr
{
unsigned char ver_ihl;//VER va IHL (Internet Header Length)
unsigned char tos; //Type of Server
unsigned short tol_len;//Total Length=IpHeader + TCP Header + Data
unsigned short id; //Identification
unsigned short offset; //Frame offset
unsigned char ttl; //Time To Live
unsigned char protocol;
unsigned short checksum;
unsigned int saddr; //Source Address
unsigned int daddr; //Destination Address
};

struct tcp_hdr
{
unsigned short sport; //Source Port
unsigned short dport; //Detinations Port
unsigned int seqnum; //Sequence;
unsigned int acknum; //Acknowlege
unsigned char dataoffset; //Data Offset
unsigned char flags; //SYN, URG, FIN, ACK, RST, PUSH + Preserve
unsigned short windows;
unsigned short checksum;
unsigned short urgpointer;
};
struct icmp_hdr
{
unsigned char type;
unsigned char code;
unsigned short checksum;
unsigned short id;
unsigned short sequence;
unsigned short timestamp;
};
int socksniffer;
int main()
{
InitWinSock();
socksniffer=CreateRawSocket();
printf("Seamoun (http://nhomvicki.net)\n");
printf("Sniffer TCP, ICMP v1.0\n\n");
printf(" Packet Capture ...\n");
Sniffer(socksniffer);
return 0;
}
//Ham khoi tao thu vien WinSock
void InitWinSock()
{
WSADATA wsaData;
if (WSAStartup(MAKEWORD(1,1),&wsaData)!=0) return;
}
//Ham tao RawSocket
int CreateRawSocket()
{
int sock;
if ((sock=WSASocket(AF_INET,SOCK_RAW,0,NULL,NULL,WSA_FLAG_OVERLAPPED))==INVALID_SOCKET) return 0;
return sock;
}
//Ham thuc hien Sniffer
int Sniffer(int sock)
{
DWORD dwBufferLen[10], dwBufferInLen = 1, dwBytesReturned = 0;

char *HostName=new char [32];
unsigned long nSize=32;
struct hostent *hp;
sockaddr_in from,dest;
int sread,fromlen=sizeof(from);

char *packet=new char [2048];
if (GetComputerName(HostName,&nSize)==0) return -1;
if ((hp=gethostbyname(HostName))==0) return -1;
delete(HostName);

int i=0;
while ((hp->h_addr_list[i+1])!=NULL)
{
i++;
}
memcpy(&from.sin_addr.s_addr,hp->h_addr_list[i],hp->h_length);
if ((hp=gethostbyname(inet_ntoa(from.sin_addr)))==NULL) return -1;

memset(&dest,0,sizeof(dest));
memcpy(&dest.sin_addr.s_addr,hp->h_addr_list[0],hp->h_length);
dest.sin_family=AF_INET;
dest.sin_port=htons(8000);
if (bind(sock,(struct sockaddr *)&dest,sizeof(dest))==SOCKET_ERROR) return -1;

//WSAIoctl : dieu khien vao ra socket
if(WSAIoctl(sock, SIO_RCVALL, &dwBufferInLen, sizeof(dwBufferInLen), &dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL) == SOCKET_ERROR) return(-1);

//Don nhan va su ly goi du lieu
while (1)
{
sread=recvfrom(sock,packet,8191,0,(struct sockaddr *)&from.sin_addr,&fromlen);
if ((sread==SOCKET_ERROR)||sread<0) continue ;
packetcapture(packet);
}
delete(packet);

return 0;
}
//Ham thuc hien phan tich goi du lieu
int packetcapture(char *packet)
{
struct ip_hdr *ip;
struct tcp_hdr *tcp;
struct icmp_hdr *icmp;
ip=(struct ip_hdr *)packet;
tcp=(struct tcp_hdr *)(packet+sizeof(struct ip_hdr));
icmp=(struct icmp_hdr *)(packet+sizeof(struct ip_hdr));
switch(ip->protocol)
{
case 6:
tcp_display(ip,tcp);
break;
case 1:
icmp_display(ip,icmp);
break;
default:
break;
}
return 0;
}
//Ham hien thi goi TCP
int tcp_display(ip_hdr *ip,tcp_hdr *tcp)
{
printf("TCP: [%d] %s:%d", ntohs(ip->tol_len), inet_ntoa(*(struct in_addr *)&ip->saddr), ntohs(tcp->sport));
printf(" > %s:%d|ttl = %d|win = %d|checksum = %d|flag = %d\n\n", inet_ntoa(*(struct in_addr *)&ip->daddr),
ntohs(tcp->dport), ip->ttl, ntohs(tcp->windows), tcp->checksum, tcp->flags);
return 0;
}
//Ham hien thi goi ICMP
int icmp_display(struct ip_hdr *ip, struct icmp_hdr *icmp)
{

printf("ICMP: [%d] %s", ntohs(ip->tol_len), inet_ntoa(*(struct in_addr *)&ip->saddr));
printf(" > %s type = %d|code = %d|ttl = %d|seq = %x\n", inet_ntoa(*(struct in_addr *)&ip->daddr), icmp->type, icmp->code, ip->ttl, ntohs(icmp->sequence));
return 0;
}


Kết quả khi chạy chương trình
+ Thực hiện gửi gói ICMP bằng cách dùng lệnh PING
Code:

C:\>ping 10.0.0.2
Reply from 10.0.0.2: bytes=32 time<10ms TTL=64
Reply from 10.0.0.2: bytes=32 time=15ms TTL=64
Reply from 10.0.0.2: bytes=32 time=15ms TTL=64
Reply from 10.0.0.2: bytes=32 time=15ms TTL=64

Ping statistics for 10.0.0.2:
Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 15ms, Average = 11ms

Chương trình Sniffer:
Seamoun (http://nhomvicki.net)
Sniffer TCP, ICMP v1.0

Packet Capture ...
ICMP: [60] 10.0.0.1 > 10.0.0.2 type = 8|code = 0|ttl = 128|seq = 3d00
ICMP: [60] 10.0.0.2 > 10.0.0.1 type = 0|code = 0|ttl = 64|seq = 3d00
ICMP: [60] 10.0.0.1 > 10.0.0.2 type = 8|code = 0|ttl = 128|seq = 3e00
ICMP: [60] 10.0.0.2 > 10.0.0.1 type = 0|code = 0|ttl = 64|seq = 3e00
ICMP: [60] 10.0.0.1 > 10.0.0.2 type = 8|code = 0|ttl = 128|seq = 3f00
ICMP: [60] 10.0.0.2 > 10.0.0.1 type = 0|code = 0|ttl = 64|seq = 3f00
ICMP: [60] 10.0.0.1 > 10.0.0.2 type = 8|code = 0|ttl = 128|seq = 4000
ICMP: [60] 10.0.0.2 > 10.0.0.1 type = 0|code = 0|ttl = 64|seq = 4000


+Thực hiện gửi gói TCP bằng netcat
Code:

C:\>nx -vv -n 10.0.0.1

Chương trình Sniffer:
Seamoun (http://nhomvicki.net)
Sniffer TCP, ICMP v1.0

Packet Capture ...
TCP: [64] 10.0.0.1:80 > 10.0.0.2:1033|ttl = 128|win = 64240|checksum = 55340|flag = 18
TCP: [60] 10.0.0.2:1033 > 10.0.0.1:80|ttl = 64|win = 5840|checksum = 5942|flag = 2
TCP: [52] 10.0.0.2:1033 > 10.0.0.1:80|ttl = 64|win = 5840|checksum = 23589|flag = 16