Thư viện lớp, một thành phần chính khác của .NET Framework là một tập hợp hướng đối tượng của các kiểu dữ liệu được dùng lại, nó cho phép có thể phát triển những ứng dụng từ những ứng dụ
Trang 1MỤC LỤC LỜI CẢM ƠN Error! Bookmark not defined.
LỜI MỞ ĐẦU 3
CHƯƠNG 1 5
CƠ SỞ LÝ THUYẾT 5
1.1 Giới thiệu NET và C# 5
1.2 Ứng dụng Windows với NET 6
1.3 Truy cập cơ sở dữ liệu với NET 9
1.3.1 Tổng quan về ADO.NET 9
1.3.2 Sử dụng các Database Connection 12
1.3.3 Sử dụng commands 16
1.3.4 Truy cập dữ liệu sử dụng Data Reader, DataSet, DataTable 17
1.4 Sử dụng thủ tục lưu trữ stored procedure trong SQL Server 24
1.5 Lập trình với mô hình 3 lớp 27
CHƯƠNG 2 30
KHẢO SÁT VÀ PHÂN TÍCH HỆ THỐNG 30
2.1 Quy định chung trong quản lý thu lệ phí trước bạ 30
2.1.1 Đối tượng chịu lệ phí trước bạ 30
2.1.2 Đối tượng nộp lệ phí trước bạ 31
2.1.3 Mẫu tờ khai 31
2.1.4 Hồ sơ kê khai 35
2.2 Hướng dẫn nộp lệ phí trước bạ 36
2.2.1 Trình tự, thủ tục kê khai nộp lệ phí trước bạ 36
2.2.2 Nguyên tắc áp giá tính lệ phí trước bạ 38
2.3 Bài toán quản lý thu lệ phí trước bạ 39
2.3.1 Kết quả khảo sát ban đầu 39
2.3.2 Công tác quản lý thu lệ phí trước bạ tại chi cục thuế 39
2.4 Yêu cầu và cách giải quyết bài toán 40
2.5 Phân tích hệ thống về chức năng 43
2.5.1 Sơ đồ chức năng nghiệp vụ - BFD 43
2.5.2 Sơ đồ luồng dữ liệu - DFD 44
2.6 Phân tích hệ thống về dữ liệu 47
2.6.1 Chuẩn hóa các lược đồ quan hệ 47
2.6.2 Mô hình cơ sở dữ liệu 51
Trang 2CHƯƠNG 3 62
THIẾT KẾ VÀ CÀI ĐẶT CHƯƠNG TRÌNH 62
3.1 Thiết kế các form 62
3.2 Thiết kế cơ sở dữ liệu 67
3.3 Thiết kế các báo cáo 70
3.4 Một số đoạn mã trong chương trình 66
KẾT LUẬN 71
TÀI LIỆU THAM KHẢO 73
Trang 3LỜI MỞ ĐẦU
Công nghệ thông tin được ứng dụng trong nhiều lĩnh vực khác nhau như trong quản lý, thương mại điện tử, nghiên cứu khoa học.v.v Từ đó yêu cầu đặt ra việc quản lý và lưu trữ thông tin trong các cơ quan hành chính nhà nước là vô cùng quan trọng, cùng với sự phát triển của chính phủ điện từ, công nghệ thông tin ngày càng được áp dụng rộng rãi hơn trong các cơ quan nhà nước như: cơ quan thuế, trường học, ngân hàng…
Ở nước ta trong các ban ngành các cơ quan nhà nước hiện nay hầu hết đã và đang đưa công nghệ thông tin vào công tác quản lý Từ tình hình cũng như nhu cầu thực tế thấy rằng, tại cơ quan thuế đặc biệt là tại các chi cục thuế quận, huyện thường xuyên phải tiếp nhận hồ sơ kê khai cũng như nộp thuế của người dân Từ đó đòi hỏi làm thế nào để quản lý việc thu thuế sao cho nhanh chóng và hiệu quả nhất? và có thể trợ giúp cho cán bộ thuế thực hiện việc thu thuế, tiếp nhận, giải quyết hồ sơ kê khai của người nộp thuế như thế nào? Từ những yêu cầu đó cho thấy cần thiết kế một chương trình quản lý để quản lý việc thu nộp thuế
Tại các chi cục thuế quận, huyện thường xuyên phải tiếp nhận và xử lý nhiều loại hồ sơ kê khai thuế khác nhau, trong các loại đó có việc thu lệ phí trước bạ áp dụng với các tài sản như: đất đai, nhà cửa, các tài sản (ô tô, xe máy, tàu thuyền,….) Từ những nhu cầu này cho thấy cần phải thiết kế chương trình
để quản lý việc thu lệ phí trước bạ
Trong đợt làm đồ án tốt nghiệp này với sự hướng dẫn của cô giáo ThS Đỗ Thị Bắc, em đã tìm hiểu khảo sát và thiết kế chương trình Quản Lý Thuế Trước
Bạ để quản lý việc thu lệ phí trước bạ tại các chi cục thuế quận, huyện
Đồ án được chia làm 3 chương:
Chương 1: Cơ sở lý thuyết
Chương 2: Phân tích và thiết kế hệ thống
Trang 4Chương 3: Cài đặt chương trình
Mặc dù đã cố gắng hoàn thiện chương trình với mục đích triển khai trong thực tế, chương trình này còn phải hoàn thiện thêm một số tính năng cũng như nghiệp vụ xử lý khác khi được chạy thử nghiệm Do đó sẽ không tránh khỏi sai sót và một số lỗi về nghiệp vụ cũng như trong ứng dụng xử lý Rất mong nhận được những ý kiến đóng góp của các Thầy Cô giáo cũng như của các sinh viên
để đề tài này trở thành một dự án thực sự được triển khai trong thực tế
Trang 5CHƯƠNG 1
CƠ SỞ LÝ THUYẾT 1.1 Giới thiệu NET và C#
C# là một ngôn ngữ lập trình mới được thiết kế riêng để dùng cho Microsoft's NET Framework (Một nền khá mạnh cho sự phát triển, triển khai, hiện thực và phân phối các ứng dụng)
Nó là một ngôn ngữ hoàn toàn hướng đối tượng được thiết kế dựa trên kinh nghiệm của các ngôn ngữ hướng đối tượng khác như Java, C++…
Đây là một ngôn ngữ độc lập được thiết kế để có thể sinh ra mã đích trong môi trường NET, nó không phải là một phần của NET bởi vậy có một vài đặc trưng được hỗ trợ bởi NET nhưng C# không hỗ trợ và ngược lại
.NET Framework có hai thành phần chính: Common Language Runtime (CLR) và thư viện lớp NET Framework CLR là nền tảng của NET Framework Runtime như là một agent quản lý mã nguồn khi nó được thực thi, cung cấp các dịch vụ cốt lõi như: quản lý bộ nhớ, quản lý tiểu trình, và quản lý từ xa Ngoài ra
nó còn thúc đẩy việc sử dụng kiểu an toàn và các hình thức khác của việc chính xác mã nguồn, đảm bảo cho việc thực hiện được bảo mật và mạnh mẽ Khái niệm quản lý mã nguồn là nguyên lý nền tảng của runtime Mã nguồn mà đích tới runtime thì được biết như là mã nguồn được quản lý (managed code) Trong khi
đó mã nguồn mà không có đích tới runtime thì được biết như mã nguồn không được quản lý (unmanaged code)
Thư viện lớp, một thành phần chính khác của NET Framework là một tập hợp hướng đối tượng của các kiểu dữ liệu được dùng lại, nó cho phép có thể phát triển những ứng dụng từ những ứng dụng truyền thống command-line hay những ứng dụng có giao diện đồ họa (GUI) đến những ứng dụng mới nhất được cung cấp bởi ASP.NET, như là Web Form và dịch vụ XML Web
Mặc dù C# và NET được thiết kế để phát triển web, nhưng chúng vẫn hỗ trợ mạnh mẽ cho cái gọi là ứng dụng "fat client", các ứng dụng có thể được cài đặt trên một máy người dùng cuối Hỗ trợ này gọi là Windows Forms
Một Windows Form là câu trả lời của NET cho VB 6 Form Dùng để thiết
Trang 6kế một giao diên window sinh động, chỉ đơn giản kéo các control từ vào trên Windows Form Để xác định cách xử của window, cần viết các thủ tục quản lí sự kiện cho form controls Một đề án Windows Form được dịch thành một EXE phải được cài đặt trong một môi trường ở máy tính người dùng cuối Giống như các kiểu đề án NET khác, đề án Windows Form được hỗ trợ cho cả VB.NET và C#
Trong lúc những ứng dụng kinh doanh phát triển ngày nay được thiết kế bởi World Wide Web, những client cổ điển vẫn tồn tại và sẽ luôn luôn được yêu cầu
Nó là một ứng dụng Intranet sử dụng bên trong một tổ chức hay là mẫu phần mềm cài đặt trên máy để bàn Những chức năng mạnh và kinh nghiệm của người
sử dụng như một môi trường cung cấp sẽ luôn luôn được yêu cầu cho những kiểu ứng dụng Web form thì tuyệt vời nhưng chúng không thể so sánh kinh nghiệm của người sử dụng thông qua một client tốt
.NET cung cấp một khả năng để tạo những client mạnh thực thi bên trong Common Language Runtime Bất kỳ ngôn ngữ NET nào cũng có thể sử dụng Window Form để xây dựng Windows Applications Những ứng dụng này được truy cập đến NET FrameWork của các namespace và đối tượng
1.2 Ứng dụng Windows với NET
Để hiểu sự khác nhau giữa rich client và thin client, bởi vì nó là điểm cốt yếu để hiểu tại sao Windows applications được xem như rich clients Một thin client không yêu cầu quá nhiều cài đặt và hình thể trước khi sử dụng những ứng dụng của nó Rich clients đôi lúc gọi là fat clients, yêu cầu một vài mẫu cài đặt và hình thể trên máy client Các rich client khi chạy trên client, thì chúng có thể đạt được thuận lợi đầy đủ của môi trường và năng lượng xử lý của máy client Vấn
đề này cho phép các nhà phát triển tạo một sự tác động qua lại và thân thiện với người dùng hơn
Trước NET, các nhà phát triển có vài chọn lựa trong việc xây dựng một ứng dụng Window Họ có thể có nhiều cách đi xuống lớp API và xây dựng một ứng dụng C hay C++ sử dụng Win32 API Việc này là công việc rất khó và chi phối thời gian và không có nhiều cơ sở nào có thể bỏ ra nhiều thời gian để phát
Trang 7triển ứng dụng tại tầng lớp này Bởi vì thế, Các môi trường mở ra để cung cấp một giao diện dễ dàng hơn cho Win32 API và cho phép các nhà phát triển có nhiều chọn lựa hơn Microsoft Foundation Classes (MFC) là một thư viện lớp sử dụng C++ được gói gọn trong Win32 API Visual Basic là một công cụ phát triển ứng dụng nhanh chóng, sử dụng một nguồn gốc của ngôn ngữ lập trình Basic cho phép mọi nhà phát triển tạo các ứng ụng Window tương đối nhanh chóng Tuy nhiên, các giải pháp này đều không sử dụng NET Framework hay CLR
.NET Framework chứa một tầng lớp năng xuất mới gói gọn trong Win32 API, và giống như MFC và Visual Basic, nó cho phép phát triển hiệu suất cao hơn và dễ dàng hơn của các ứng dụng Window Môi trường này được gọi là Windows Forms; nó cho phép các nhà phát triển tạo một tương tác cấp cao và các ứng dụng Window lớn sử dụng bất kỳ ngôn ngữ NET nào sẽ được xem xét môi trường Windows Forms trong chương này
Bằng cách sử dụng NET để tạo các ứng dụng Window, các nhà phát triển biết được nhiều tính năng mới và hay được cung cấp bởi NET Tất cả namespaces và classes trong NET Framework có thể sử dụng bên trong một NET rich client Thêm vào đó, ứng dụng có thể được phát triển trong bất kỳ ngôn ngữ NET nào; các thành phần khác nhau của ứng dụng có thể sử dụng các ngôn ngữ khác nhau
Hầu như tất cả chức năng đang xem xét trong chương này không được giải thích thông qua các lớp chứa bên trong System.Windows.Forms namespace Đây
là một namespaces lớn chứa nhiều lớp và các namespace phụ vào, tất cả chúng làm cho ta dễ dàng tạo các ứng dụng Window Biểu đồ bên dưới hiển thị vài lớp thừa hưởng từ System.Windows.Forms.Control Đối tượng này hành động như một lớp cơ sở cho đa số lớp trong namespace này, và chứa nhiều chức năng cơ bản của giao diện hiển thị và tương tác với người dùng
Hầu hết mọi ứng dụng Windows Form mở rộng chức năng của System.Windows.Forms Chức năng cơ bản của lớp Form không thể tạo một cửa
sổ có thể sống và tương tác trong môi trường Windows một cách đúng đắn Đây
là một thuận lợi như một điểm khởi đầu và bằng việc mở rộng lớp Form và thêm
Trang 8các control tuỳ biến và các bộ điều khiển sự kiện tuỳ biến, một ứng dụng rất hữu ích được tạo để có thể tương tác với người dùng và dữ liệu hiện tại thông qua một giao diện người dùng tinh vi
.NET Framework lấy khái niệm thừa kế và cho phép một nhà phát triển sử dụng nó để phát triển các ứng dụng Windows Forms Một đối tượng Form có thể thừa kế từ một đối tượng Form khác, vì thế chiếm được sự truy cập đến tất cả Buttons, TextBoxes, và Menus Nó là một đặc trưng rất mạnh trong NET khi sử dụng để giảm số lượng mã yêu cầu cho việc tạo các cửa sổ và màn hình giống nhau Khái niệm này gọi visual inheritance
Một Form luôn luôn thừa kế từ System.Windows.Forms Có nghĩa là nó có thể truy cập đến tất cả thành phần dữ liệu và các phương thức của lớp Form cơ bản Việc thực thi sự thừa kế yêu cầu một nhà phát triển thừa hưởng đối tượng Form từ một lớp Form tuỳ biến thay cho System.Windows.Forms Đó là nguyên nhân tất cả control và thuộc tính trong lớp Form tuỳ biến truyền qua các lớp Form được tạo mới
Tuy nhiên, cấp truy cập của các control khác nhau phải được hiểu, giống như cấp truy cập của các thừa kế chuẩn Một thành phần dữ liệu private thì không thể được truy cập bởi bất kỳ đối tượng nào bên ngoài đối tượng ban đầu Vì thế, nếu một control không được đánh dấu là protected hay public, lớp thừa hưởng sẽ không tham khảo đến control hay override bất kỳ phương thức của control
Sử dụng thừa kế trực quan có thể rất có lợi khi thừa kế tạo ra một số lượng lớn màn hình mà phải có một thiết kế giống nhau và/hoặc làm các chức năng như nhau Một ví dụ điển hình là một màn hình thực thể dữ liệu Nếu ứng dụng của không cần nhập các mẫu tin cá nhân, mà còn thông tin automobie, sử dụng thừa
kế trực quan để định nghĩa một kiểu thông thường phải là một sự chọn lựa tốt Hiển nhiên, sẽ muốn một màn hình trông giống nhau, nhưng vài control sẽ thay đổi
Các ứng dụng Windows Forms bao gồm nhiều contrrol khác nhau Các control này có thể đơn giản như các control Button và TextBox, hay chúng có thể tinh vi và phức tạp hơn như các control Charting và TreeView .NET framework
Trang 9có nhiều control sẳn sàng kết hợp với các ứng dụng Windows Forms, và có hàng trăm control được dùng trong các phát triển ứng dụng NET tuỳ biến Chính vì thế, sẽ xem xét cách tất cả control hoạt động và tương tác tại một cấp cao hơn Các control trong Windows Forms bao gồm những cái mà một nhà phát triển sẽ muốn tìm trong một thư viện lớp được thiết kế cho các giao diện người dùng đồ hoạ:
ADO (Microsoft's ActiveX Data Objects) là một thư viên của các thành phần COM đã từng được ca ngợi trong một vài năm trở lại đây Phiên bản hiện tại là 2.7, các thành phần chủ yếu của ADO là Connection, Command, Recordset,
và các Field object Một connection có thể mở cơ sở dữ liệu, một vài dữ liệu được chọn vào một recordset, bao gồm các trường, dữ liệu này sau đó có thể thao tác, cập nhập lên server, và connection cần phải được đóng lại ADO cũng giới thiệu một disconnected recordset, cái được dùng khi không muốn giữ kếp nối trong một thời gian dài
Trang 10Có một vài vấn đề với ADO đó là sự không hài lòng về địa chỉ, sự cồng kềnh của một disconnected recordset Hỗ trợ này không cần thiết với sự tiến hoá của tin học "web-centric", vì vậy nó cần được loại bỏ Có một số giống nhau giữa lập trình ADO.NET và ADO (không phải ở cái tên), vì thế việc chuyển từ ADO không qua khó khăn Hơn thế nữa, nếu dùng SQL Server, có một bộ các quản mới cho viêc thao tác bên ngoài cơ sở dữ liệu
ADO.NET chứa hai không gian tên cơ sơ dữ liệu - một cho SQL Server, và một cái khác cho các cơ sở dữ liệu được trình bày thông qua một giao diện OLE
DB Nếu cơ sở dữ liệu được chọn là một bộ phận của OLE DB, có thể dễ dàng kết nối với nó từ NET - chỉ cần dùng các lớp OLE DB và kết nối thông qua các driver cơ sở dữ liêu hiện hành của
Các Namespace(không gian tên) Các không gian tên sau chỉ ra các lớp và các giao diện được dùng cho việc truy xuất dữ liệu trong NET:
System.Data - Các lớp truy xuất dữ liệu chung
System.Data.Common - Các lớp dùng chung bởi các data provider khác nhau
System.Data.OleDb - Các lớp của OLE DB provider
System.Data.SqlClient - Các lớp của SQL Server provider
System.Data.SqlTypes - Cac kiểu của SQL Server
Các lớp dùng chung: ADO.NET chứa một số lớp được dùng không quan tâm là đang dùng các lớp của SQL Server hay là các lớp của OLE DB Các lớp trong không gian tên System.Data được liệt kê sau đây:
DataSet - Đối tượng này chứa một bộ các DataTable, có thể bao gồm quan hệ giữa các bảng, và nó được thiết kế cho truy xuất dữ liệu không kết nối
DataTable - Một kho chứa dữ liệu Một DataTable bao gồm một hoặc nhiều DataColumns, và khi được tạo ra nó sẽ có một hoặc nhiều DataRows chứa dữ liệu
DataRow - Một bộ giá trị, có bà con với một dòng trong bảng cơ sở
dữ liệu, hoặc một dòng của bảng tính
Trang 11 DataColumn - Chứa cá định nghĩa của một cột, chẳng hạn như tên và kiểu dữ liệu
DataRelation - Một liên kết giữa hai DataTable trong một DataSet
Sử dụng cho khóa ngoại và các mối quan hệ chủ tớ
Constraint - Định nghĩa một qui tắt cho một DataColumn (hoặc môt
bộ các cột dữ liệu), như các giá trị là độc nhất
Sau đây là hai lớp được tìm thấy trong không gian tên System.Data.Common:
DataColumnMapping - Ánh xạ tên của một cột từ cơ sở dữ liệu vào tên của một cột trong một DataTable
DataTableMapping - Ánh xạ tên của một bảng từ cơ sở dữ liệu vào một bảng trong một DataSet
Các lớp cơ sở dữ liệu chuyên biệt: Bổ sung cho các lớp dùng chung ở trên, ADO.NET có một số các lớp dữ liệu chuyên biệt được đưa ra dưới đây Các lớp này thực thi một bộ các giao diện chuẩn được định nghĩa trong không gian tên System.Data, cho phép sử dụng các lớp có cùng kiểu giao diện Ví dụ cả hai lớp SqlConnection và OleDbConnection thực thi giao diện IDbConnection
SqlCommand, OleDbCommand - Một vỏ bọc của các câu lệnh SQL hoặc các lời gọi stored procedure
SqlCommandBuilder, OleDbCommandBuilder - Một lớp sử dụng các câu lệnh SQL (chẳng hạn như các câu lệnh INSERT, UPDATE, vàDELETE) từ một câu lệnh SELECT
SqlConnection, OleDbConnection - Kết nối với cơ sở dữ liệu Giống như một ADO Connection
SqlDataAdapter, OleDbDataAdapter - Một lớp giữ các câu lệnh select, insert, update, và delete, chúng được sử dụng để tạo một DataSet và cập nhật Database
SqlDataReader, OleDbDataReader - Chỉ đọc, kết nối với data reader
SqlParameter, OleDbParameter - Định nghĩa một tham số cho một stored procedure
Trang 12 SqlTransaction, OleDbTransaction - Một giao tiếp cơ sở dữ liện, được bọc trong một đối tượng
Một đặc tính quan trọng của các lớp ADO.NET là chúng được thiết kế để làm việc trong môi trường không kết nối, đóng một vai trò quan trọng trong thế giới "web-centric" Nó hiện được dùng để kiến trúc một server (chẳng hạn như mua sách qua mạng) để kết nối một server, lấy một vài dữ liệu, và làm việc trên những dữ liệu này trên PC khách trước khi kết nối lại và truyền dữ liệu trở lại để
xử lí
ADO 2.1 giới thiệu recordset không kết nối, nó cho phép dữ liệu có thể được lấy từ một cơ sở dữ liệu, được truyền cho trình khách để xử lí Nó thường khó xử dụng do cách ứng xử không kết không được thiết kế từ đâu Các lớp ADO.NET thì khác - Sql/OleDb DataReader được thiết kết cho để dùng cho các
cơ sở dữ liệu offline
Trang 13liệu Cũng có thể sử dụng User ID pwd=QSPassword - và đây là password cho người dùng đó .NET SDK là một bộ các cơ sở dữ liệu giống nhau, và user/password này được liên kết và được thêm vào trong quá trình cài đặt các ví
dụ NET Cũng có thể dùng Password database=Northwind - Cái này mô tả loại
dữ liệu để kết nối - mỗi tiến trình SQL Server có thể đưa ra một vài loại dữ liệu khác nhau
SQL Server có một chế độ bảo mật khác - nó có thể dùng chế độ bảo mật của Windows, vì thế các khả năng truy cập của Windows có thể truyền cho SQL Server Với lựa chọn này có thể bỏ đi các vị trí uid và pwd trong chuỗi kết nối,
và thêm vào Integrated Security=SSPI
Sử dụng hiệu quả các Connection : Một cách tổng quát, khi sử dụng các tài nguyên "hiếm" trong NET, chẳng hạn như các kết nối cơ sở dữ liệu, các cửa sổ,hoặc các đối tượng đồ họa, tốt hơn hết nên đảm bảo rằng các tài nguyên này luôn phải được đóng lại sau khi đã sử dụng xong Dù vậy các nhà thiết kết của NET có thể làm điều này nhờ trình thu gom rác, nó luôn làm sau bộ nhớ sau một khoảng thời gian nào đó, tuy nhiên nó nên được giải phóng càng sớm càng tốt
Rõ ràng là khi viết mã truy xuất một cơ sở dữ liệu, việc giữ một kết nối càng ít thời gian càng tốt để không làm ảnh hưởng đến các phần khác Trong nhiều tình huống tiêu cực, nếu không đóng một kết nối có thể khoá không cho các người dùng khác truy nhập vào các bảng dữ liệu đó, một tác hại to lớn đối với khả năng thực thi của ứng dụng Việc đóng một kết nối cơ sở dữ liệu có thể coi là bắt buộc,
vì thế ứng dụng này chỉ ra cách cấu trúc mã để giảm thiểu các rủi ro cho một mã nguồn mở Có hai cách để đảm bảo rằng các kết nối cơ sở dữ liệu được giải phóng sau khi dùng
Trang 14 Tùy chọn thứ nhất để đảm bảo rằng các tài nguyên được dọn sạch là
sử dụng các khối lệnh try…catch…finally, và đảm bảo rằng đã đóng các kết nối trong khối lệnh finally
Với khối kết nối có thể giải phóng bất kì tài nguyên nào đã dùng Vấn đề duy nhất trong phương thức này là phải bảo đảm rằng có đóng các kết nối - rất là dễ quên việc thêm vào khối finally, vì vậy một phong cách lập trình tốt rất quan trọng
Ngoài ra, có thể mở một số tài nguyên (chẳng hạn hai kết nối cơ sở
dữ liệu và một file) trong một phương thức, vì vậy đôi khi các khối try…catch…finally trở nên khó đọc Có một cách khác để đảm bảo rằng các tài nguyên được dọn dẹp - sử dụng khối câu lệnh
Tùy chọn hai - Sử dụng khối câu lệnh
Trong lúc phát triển C#, phương thức NET's dọn dẹp các đối tượng khi chúng không còn được tham chiếu nữa sử dụng các huỷ bất định trở thành một vấn đề nóng hổi Trong C++, ngay khi một đối tượng rời khỏi tầm vực, khối huỷ tử của nó sẽ tự động được gọi Nó là một điều rất mới cho các nhà thiết cớ các lớp sử dụng tài nguyên, khi một huỷ tử được sử dụng để đóng các tài nguyên nếu các người dùng quên làm điều đó Một huỷe tử C++ được gọi bất kì khi nào một đối tượng vượt quá tầm vực của nó - vì vậy khi một ngoại lệ được phát ra
Trang 15mà không được chặn, tât cả các hủy tử cần phải được gọi
Với C# và các ngôn ngữ có quản khác, tất cả đều tự động, các khối huỷ tử định trước được thay thế bởi trình thu gom rác, cái được dùng
để tháo các tài nguyên tại một thời điểm trong tương lai Chúng mang tính bất định, nghĩa là sẽ không biết trước được khi nào thì việc
đó sẽ xảy ra Nếu quên không đóng một kết nối cơ sở dữ liệu có thể
là nguyên nhân gây ra lỗi khi chạy trong NET Mã sau đây sẽ giải thích cách để sử dụng giao diện IDisposable để giải phóng tài nguyên khi thoát khỏi khối using
using ( SqlConnection conn = new SqlConnection ( source ) )
Khi lập trình nên dùng cả hai tùy chọn trên.Ở nhưng chỗ cần các tài nguyên tốt nhất là sử dụng mệnh đề using(), dù vậy cũng có thể sử dụng câu lệnh Close(), nếu quên không sử dụng thì khối lệnh using
sẽ đóng lại Không gì có thể thay thế được một bẫy ngoại lệ tốt, vì thế tốt nhất dùng trộn lẫn hai phương thức như ví dụ sau:
Trang 16 Thêm vào đó, nếu một ngoại lệ xảy ra bên trong khối using, thì phương thức IDisposable.Dispose sẽ được gọi để bảo đảm rằng tài nguyên được giải phóng, điều này đảm bảo rằng kết nối cơ sở dữ liệu luôn luôn được đóng lại Điều này làm cho mã dễ đọc và luôn đảm bảo rằng kết nối luôn được đóng khi một ngoại lệ xảy ra
Cuối cùng, nếu ta viết các lớp bao bọc một tài nguyên có lẽ luôn thưc hiện giao diện IDisposable để đóng tài nguyên Bằng cách dùng câu lệnh using() nó luôn đảm bảo rằng tài nguyên đó sẽ được dọn dẹp
1.3.3 Sử dụng commands
Một command là một một kiểu đơn giản, một chuỗi lệnh SQL được dùng để truy xuất dữ liệu Một command có thể là một stored procedure, hoặc là tên của một bảng sẽ trả về
Các mệnh đề SqlCommand và OleDbCommand thường được gọi là CommandType, chúng được dùng để định nghĩa các mệnh đề SQL, một stored
Trang 17procedure, hoặc một câu lệnh SQL
Khi thực thi một stored procedure, cần truyền các tham số cho procedure bắt đầu bằng @, dù vậy có nhiều cách để cài giá trị tham số
Đã định nghĩa các command, và muốn thực thi chúng Có một số cách để phát ra các statement, dựa vào kết quả mà muốn command đó muốn trả về Các mệnh đề SqlCommand và OleDbCommand cung cấp các phương thức thực thi sau:
- ExecuteNonQuery() – Thực thi các command không trả về kết quả gì cả
- ExecuteReader() – Thực thi các command và trả về kiểu IDataReader
- ExecuteScalar() – Thực thi các command và trả về một giá trị đơn
Lớp SqlCommand cung cấp thêm một số phương thức sau ExecuteXmlReader() Thực thi các command trả về một đối tượng XmlReader, các đối tượng được dùng đề xem xét các XML được trả về từ cơ sở dữ liệu
1.3.4 Truy cập dữ liệu sử dụng Data Reader, DataSet, DataTable
Một data reader là cách đơn giản nhất và nhanh nhất để chọn một vài dữ liệu từ một nguồn cơ sơ dữ liệu, nhưng cũng ít tính năng nhất Có thể truy xuất trực tiếp một đối tượng data reader – Một kết quả được trả về từ một đối tượng SqlCommand hoặc OleDbCommand từ việc gọi một phương thức ExecuteReader() – có thể là một đối tượng SqlCommand, một đối tượng SqlDataReader, từ một đối tượng OleDbCommand là một OleDbDataReader Lớp DataSet được thiết kế như là một thùng chứa các dữ liệu không kết nối
Nó không có khái niệm về các kết nối dữ liệu Thật vậy, dữ liệu được giữ trong một DataSet không quan tâm đến nguồn cơ sở dữ liệu – nó có thể chỉ là những mẫu tin chứa trong một file CSV, hoặc là những đầu đọc từ một thiết bị đo lường Một DataSet bao gồm một tập các bảng dữ liệu, mỗi bảng là một tập các cột
dữ liệu và dòng dữ liệu Thêm vào đó là các định nghĩa dữ liệu, có thể định nghĩa các link giữa các DataSet Mối quan hệ phổ biến giữa các DataSet là parent-child relationship Một mẫu tin trong một bảng (gọi là Order) có thể liên kết với nhiều mẫu tin trong bảng khác (Bảng Order_Details) Quan hệ này có thể được định nghĩa và đánh dấu trong DataSet
Trang 18Một data table rất giống một bảng cơ sở dữ liệu vật lí – nó bao gồm một bộ các cột với các thuộc tính riêng, và có thể không chứa hoặc chứa nhiều dòng dữ liệu Một data table có thể định nghĩa một khóa chínhm, bao gồm một hoặc nhiều cột, và cũng có thể chứa các ràng buộc của các cột Tất cả các thông tin đó được thể hiện trong schema
Một đối tượng DataTable (cũng như một DataColumn) có thể có một số các
mở rộng riêng liên quan đến thuộc tính của nó Tập hợp này có thể nằm trong thông tin user-defined gắng liền với đối tượng Ví dụ, một cột có thể đưa ra một mặt nạ nhập liệu dùng để giới hạn các giá trị hợp lệ cho cột đó – một ví dụ về số phúc lợi xã hội Mĩ Các thuộc tính mở rộng đặc biệt quan trọng khi dữ liệu được cấu trúc ở một tầng giữa và trả về cho client trong một số tiến trình có thể lưu một chuẩn hợp lệ (như min và max) cho các số của các cột
Khi một bảng dữ liệu được tạo ra, có thể do việc chọn dữ liệu từ một cơ sở
dữ liệu, đọc dữ liệu từ một file, hoặc truy xuất thủ công trong mã, tập hợp Rows được dùng để chứa giá trị trả về
Tập hợp Columns chứa các thể hiện DataColumn có thể được thêm vào bảng này Những định nghĩa schema của dữ liệu, ví dụ như kiểu dữ liệu, tính khả rỗng, giá trị mặc định, vân vân Tập Constraints có thể được tạo ra bởi các ràng buộc khóa chính hoặc tính độc nhất
Thông tin về sơ đồ của một bảng dữ liệu có thể được sử dụng trong việc biểu diễn của một bảng dữ liệu bằng DataGrid Điều khiển DataGrid sử dụng các thuộc tính như kiểu dữ liệu của cột để quyết định điều khiển gì dùng cho cột đó Một trường bit trong cơ sở dữ liệu có thể được biểu diễn như một checkbox trong DataGrid Nếu một cột được định nghĩa trong cơ sở sơ đồ dữ liệu như là một NOT NULL, lựa chọn này được lưu trữ trong DataColumn vì vậy nó sẽ được kiểm tra khi người dùng cố gằng di chuyển khỏi một dòng
Data Columns
Một đối tượng DataColumn định nghĩa các thuộc tính của một cột trong DataTable, chẳng hạn như kiểu dữ liệu của cột đó, chẳng hạn cột là chỉ đọc, và các sự kiện khác Một cột có thể được tạo bằng mã,
Trang 19hoặc có thể được tạo tự động trong thời gian chạy
Khi tạo một cột, tốt hơn hết là nên đặt cho nó một cái tên; nếu không thời gian chạy sẽ tự động sinh cho một cái tên theo định dạng Columnn, n là mố sô tự động tăng
Kiểu dữ liệu của một cột có thể cài đặt bằng cách cung cấp trong cấu trúc của nó, hoặc bằng cách cài đặt thuộc tính DataType Một khi đã load dữ liệu vào một bảng dữ liệu không thể sửa lại kiểu dữ liệu của một cột – nếu không sẽ nhận một ngoại lệ
Các cột dữ liệu có thể được tạo để giữ các kiểu dữ liệu của NET Framework sau:
Các thuộc tính sau có thể được cài đặt trong một DataColumn:
ColumnMapping Cho biết cách một cột ánh xạ sang XML khi
một DataSet được lưu bằng cách gọi phương thức DataSet.WriteXml
ColumnName Tên của cột Nó tự động tạo ra trong thời gian
Trang 20 Một trong những điều quan trọng nhất của một DataRow là phiên bản của nó Điều đó cho phép nhận được những giá trị khác nhau cho một dòng cụ thể Các phiên bản được mô tả trong bảng sau: DataRow
Version Value
Mô tả
Current Giá trị sẵn có của cột Nếu không xảy một hiệu
chỉnh nào, nó sẽ mang giá trị gốc Nếu có một hiệu chỉnh xảy ra, giá trị sẽ là giá trị hợp lệ cuối cùng được cập nhật
Default Giá trị mặc định (nói một cách khác, giá trị mặc
định được cài đặt cho cột)
Original Giá trị của cột trong cơ sở dữ liệu vào lúc chọn
Nếu phương thức AcceptChanges DataRow được gọi, thì giá trị này sẽ được cập nhật thành giá trị hiện tại
Proposed Khi các thay đổi diễn ra trên một dòng nó có thể
truy lục giá trị thay đổi này Nếu gọi BeginEdit() trên mộg dòng và tạo các thay đổi, mỗi một cột giữ một giá trị cho đến khi phương thức EndEdit() hoặc CancelEdit() được gọi
Trang 21 Mỗi dòng có một cờ trạng thái gọi là RowState, nó có thể dùng để xác định thực thi nào là cần thiết cho dòng đó khi nó cập nhật cơ sở
dữ liệu Thuộc tính RowState có thể được cài đặt để theo dõi tất cả các trạng thái thay đổi trên DataTable, như thêm vào các dòng mới, xóa các dòng hiện tại, và thay đổi các cột bên trong bảng Khi dữ liệu được cập nhật vào cơ sở dữ liệu, cờ trạng thái được dùng để nhận biết thực thi SQL nào sẽ xảy ra Những cờ này được định nghĩa bởi bảng liệt kê DataRowState:
DataRowState
Value
Mô tả
Added Dòng được vừa mới được thêm vào tập hợp
DataTable's Rows Tất cả các dòng đựoc tạo trên máy khách đều được cài đặt giá trị này, và cuối cùng
là phát ra câu lệnh SQL INSERT khi cập nhật cho cơ
sở dữ liệu
Deleted Giá trị này cho biết dòng đó có thể được đánh dấu
xoá trong DataTable bởi phương thức DataRow.Delete() Dòng này vẫn tồn tại trong DataTable, nhưng không thể trông thấy từ màn hình (trừ khi một DataView được cài đặt rõ ràng) Các DataView sẽ được trình bày trong chương tiếp theo Các dòng được đánh dấu trong DataTable sẽ bị xoá khỏi cơ sở dữ liệu khi nó được cập nhật
Detached Một dòng sẽ có trạng thái này ngay sau khi nó đươc
tạo ra , và có thể cũng trả về trạng thái này bởi việc gọi phương thức DataRow.Remove() Một dòng detached không được coi là một thành phần của bảng dữ liệu
Modified Một dòng sẽ được Modified nếu giá trị trong cột bất
Trang 22dữ liệu)
Cách phổ biến nhất để thay đổi dữ liệu trong một DataRow là sử dụng chỉ số, tuy vậy nếu có một số thay đổi ccũgn cần gọi các phương thức BeginEdit() và EndEdit() methods
Khi một cập nhật được tạo ra trên một cột trong một DataRow, sự kiện ColumnChanging sẽ được phát ra trên các dòng của DataTable
Nó cho phép ghi đè lên thuộc tính ProposedValue của các lớp DataColumnChangeEventArgs, và thay đổi nó nếu muốn Cách này cho phép các giá tri trên cột có hiệu lực Nếu gọi BeginEdit() trước khi tạo thay đổi, sự kiện ColumnChanging vẫn xảy ra Chúng cho phép tạo một sự thay đổi kép khi cố gọi EndEdit() Nếu muốn phục hồi lại giá trị gốc, hãy gọi CancelEdit()
Một DataRow có thể liên kết với một vài dòng khác của dữ liệu Điều này cho phép tạo các liên kết có thể điều khiển được giữa các dòng, đó là kiểu master/detail DataRow chứa một phương thức GetChildRows() dùng để thay đổi một mảng các dòng liên quan đến các cột từ một bản khác trong cùng DataSet như là dòng hiện tại
Trang 231.4 Sử dụng thủ tục lưu trữ stored procedure trong SQL Server
SQL Server dựa trên công nghệ Client/Server Một number của các client gửi các queries tới server Sau khi nhận các query, server phân tích cú pháp query (kiểm tra lỗi cú pháp) và sau đó thực hiện (process) các yêu cầu này Khi các query chuyển từ client tới các server thông qua network, Do đó khi số query tăng lên từ fía client dẫn tới mạng tắc nghẽn và tăng tải trên server Một Thủ tục lưu trữ là một solution tới các vấn đề này Một Thủ tục lưu trữ có thể được tạo bởi Enterprise Manager hoặc sử dụng Query Analyzer với các câu lệnh CREATE PROCEDURE
Một Thủ tục lưu trữ là một tập hợp hoặc là một batch của các câu lệnh SQL và ngôn ngữ điều khiển luồng (control-of-flow language), được lưu trữ dưới một tên gọi và được thực hiện như một đơn vị riêng lẻ Nó giúp thực hiện tốt hơn các truy vấn
T-Một Thủ tục lưu trữ là một đối tượng được biên dịch trước và lưu trong CSDL Nghĩa là một Procedure được compile trước và chuẩn bị cho nhiều ứng dụng thực hiện Không mất thời gian để gửi truy vấn này tới máy chủ, việc phân tích cú pháp và biên dịch lại thủ tục
Ưu điểm của stored procedure:
Performance : Khi thực thi một câu lệnh SQL thì SQL Server phải kiểm tra permission xem user gởi câu lệnh đó có được phép thực hiện câu lệnh hay không đồng thời kiểm tra cú pháp rồi mới tạo ra một execute plan và thực thi Nếu có nhiều câu lệnh như vậy gởi qua network có thể làm giảm đi tốc độ làm việc của server SQL Server
sẽ làm việc hiệu quả hơn nếu dùng stored procedure vì người gởi chỉ gởi một câu lệnh đơn và SQL Server chỉ kiểm tra một lần sau đó tạo
ra một execute plan và thực thi Nếu stored procedure được gọi nhiều lần thì execute plan có thể được sử dụng lại nên sẽ làm việc nhanh hơn Ngoài ra cú pháp của các câu lệnh SQL đã được SQL Sever kiểm tra trước khi save nên nó không cần kiểm lại khi thực thi
Programming Framework : Một khi stored procedure được tạo ra nó
Trang 24có thể được sử dụng lại Ðiều này sẽ làm cho việc bảo trì (maintainability) dễ dàng hơn do việc tách rời giữa business rules (tức là những logic thể hiện bên trong stored procedure) và database
Ví dụ nếu có một sự thay đổi nào đó về mặt logic thì ta chỉ việc thay đổi code bên trong stored procedure mà thôi Những ứng dụng dùng stored procedure này có thể sẽ không cần phải thay đổi mà vẫn tương thích với business rule mới Cũng giống như các ngôn ngữ lập trình khác stored procedure cho phép ta đưa vào các input parameters (tham số) và trả về các output parameters đồng thời nó cũng có khả năng gọi các stored procedure khác
Security : Giả sử muốn giới hạn việc truy xuất dữ liệu trực tiếp của một user nào đó vào một số tables, ta có thể viết một stored procedure để truy xuất dữ liệu và chỉ cho phép user đó được sử dụng stored procedure đã viết sẵn mà thôi chứ không thể "đụng" đến các tables đó một cách trực tiếp Ngoài ra stored procedure có thể được encrypt (mã hóa) để tăng cường tính bảo mật
Các loại stored procedure: Stored procedure có thể được chia thành 5 nhóm như sau:
System Stored Prcedure : Là những stored procedure chứa trong Master database và thường bắt đầu bằng tiếp đầu ngữ sp_ Các stored procedure này thuộc loại built-in và chủ yếu dùng trong việc quản lý database (administration) và security Ví dụ có thể kiểm tra tất cả các processes đang được sử dụng bởi user DomainName\Administrators có thể dùng sp_who
@loginame='DomainName\Administrators' Có hàng trăm system stored procedure trong SQL Server có thể xem chi tiết trong SQL Server Books Online
Local Stored Procedure : Ðây là loại thường dùng nhất Chúng được chứa trong user database và thường được viết để thực hiện một công việc nào đó Thông thường người ta nói đến stored procedure là nói
Trang 25đến loại này Local stored procedure thường được viết bởi DBA hoặc programmer
Temporary Stored Procedure : Là những stored procedure tương tự như local stored procedure nhưng chỉ tồn tại cho đến khi connection
đã tạo ra chúng bị đóng lại hoặc SQL Server shutdown Các stored procedure này được tạo ra trên TempDB của SQL Server nên chúng
sẽ bị delete khi connection tạo ra chúng bị cắt đứt hay khi SQL Server down Temporary stored procedure được chia làm 3 loại : local (bắt đầu bằng #), global (bắt đầu bằng ##) và stored procedure được tạo ra trực tiếp trên TempDB Loại local chỉ được sử dụng bởi connection đã tạo ra chúng và bị xóa khi disconnect, còn loại global
có thể được sử dụng bởi bất kỳ connection nào Permission cho loại global là dành cho mọi người (public) và không thể thay đổi Loại stored procedure được tạo trực tiếp trên TempDB khác với 2 loại trên
ở chỗ ta có thể set permission, chúng tồn tại kể cả sau khi connection tạo ra chúng bị cắt đứt và chỉ biến mất khi SQL Server shut down
Extended Stored Procedure : Ðây là một loại stored procedure sử dụng một chương trình ngoại vi (external program) vốn được compiled thành một DLL để mở rộng chức năng hoạt động của SQL Server Loại này thường bắt đầu bằng tiếp đầu ngữ xp_ Ví dụ, xp_sendmail dùng đề gởi mail cho một người nào đó hay xp_cmdshell dùng để chạy một DOS command Ví dụ xp_cmdshell 'dir c:\' Nhiều loại extend stored procedure được xem như system stored procedure và ngược lại
Remote Stored Procedure : Những stored procedure gọi stored procedure ở server khác
Viết stored procedure: Ðể tạo ra một stored procedure ta dùng lệnh CREATE PROCEDURE theo sau là tên của nó (nếu là temporary stored procedure thì thêm dấu # trước tên của procedure Nếu muốn encrypt thì dùng WITH ENCRYPTION trước chữ AS) và các input hoặc ouput parameters Nếu là
Trang 26output thì thêm keyword OUTPUT đằng sau parameter Ta có thể cho giá trị default cùng lúc với khai báo data type của parameter Kể từ sau chữ AS là phần body của stored procedure
1.5 Lập trình với mô hình 3 lớp
Trong phát triển ứng dụng, để dễ quản lý các thành phần của hệ thống, cũng như không bị ảnh hưởng bởi các thay đổi, người ta hay nhóm các thành phần có cùng chức năng lại với nhau và phân chia trách nhiệm cho từng nhóm để công việc không bị chồng chéo và ảnh hưởng lẫn nhau Ví dụ trong một công ty sẽ có từng phòng ban, mỗi phòng ban sẽ chịu trách nhiệm một công việc cụ thể nào đó, phòng này không được can thiệp vào công việc nội bộ của phòng kia như Phòng tài chính thì chỉ phát lương, còn chuyện lấy tiền đâu phát cho các anh phòng Marketing thì các anh không cần biết Trong phát triển phần mềm, người ta cũng
áp dụng cách phân chia chức năng này sẽ nghe nói đến thuật ngữ kiến trúc đa tầng/nhiều lớp, mỗi lớp sẽ thực hiện một chức năng nào đó, trong đó mô hình 3 lớp là phổ biến nhất Đó là Presentation, Business Logic, và Data Access Các lớp này sẽ giao tiếp với nhau thông qua các dịch vụ (services) mà mỗi lớp cung cấp để tạo nên ứng dụng, lớp này cũng không cần biết bên trong lớp kia làm gì
mà chỉ cần biết lớp kia cung cấp dịch vụ gì cho mình và sử dụng nó mà thôi
Mô hình 3 lớp mà Microsoft đề nghị dùng cho các hệ thống phát triển trên nền NET như sau:
Presentation Layer
Lớp này làm nhiệm vụ giao tiếp với người dùng cuối để thu thập dữ liệu và hiển thị kết quả/dữ liệu thông qua các thành phần trong giao
Trang 27diện người sử dụng Lớp này sẽ sử dụng các dịch vụ do lớp Business Logic cung cấp Trong NET thì có thể dùng Windows Forms, ASP.NET hay Mobile Forms để hiện thực lớp này
Trong lớp này có 2 thành phần chính là User Interface Components
và User Interface Process Components
UI Components là những phần tử chịu trách nhiệm thu thập và hiển thị thông tin cho người dùng cuối Trong ASP.NET thì những thành phần này có thể là các TextBox, các Button, DataGrid…
UI Process Components: là thành phần chịu trách nhiệm quản lý các qui trình chuyển đổi giữa các UI Components Ví dụ chịu trách nhiệm quản lý các màn hình nhập dữ liệu trong một loạt các thao tác định trước như các bước trong một Wizard…
Lưu ý là lớp này không nên sử dụng trực tiếp các dịch vụ của lớp Data Access mà nên sử dụng thông qua các dịch vụ của lớp Business Logic vì khi sử dụng trực tiếp như vậy, có thể bỏ qua các ràng buộc, các logic nghiệp vụ mà ứng dụng cần phải có
Business Logic Layer
Lớp này thực hiện các nghiệp vụ chính của hệ thống, sử dụng các dịch vụ do lớp Data Access cung cấp, và cung cấp các dịch vụ cho lớp Presentation Lớp này cũng có thể sử dụng các dịch vụ của các nhà cung cấp thứ 3 (3rd parties) để thực hiện công việc của mình(ví
dụ như sử dụng dịch vụ của các cổng thanh toán trực tuyến như VeriSign, Paypal…)
Trong lớp này có các thành phần chính là Business Components, Business Entities và Service Interface Service Interface là giao diện lập trình mà lớp này cung cấp cho lớp Presentation sử dụng Lớp Presentation chỉ cần biết các dịch vụ thông qua giao diện này
mà không cần phải quan tâm đến bên trong lớp này được hiện thực như thế nào
Business Entities là những thực thể mô tả những đối tượng thông
Trang 28tin mà hệ thống xử lý Trong ứng dụng các đối tượng này là các chuyên mục(Category) và bản tin(News) Các business entities này cũng được dùng để trao đổi thông tin giữa lớp Presentation và lớp Data Access
Business Components là những thành phần chính thực hiện các dịch vụ mà Service Interface cung cấp, chịu trách nhiệm kiểm tra các ràng buộc logic(constraints), các qui tắc nghiệp vụ(business rules), sử dụng các dịch vụ bên ngoài khác để thực hiện các yêu cầu của ứng dụng
Trong ứng dụng của , lớp này sẽ chứa các thành phần là CategoryService và NewsService làm nhiệm vụ cung cấp các dịch
vụ quản lý chuyên mục và các bản tin (thêm, xóa, sửa, xem chi tiết, lấy danh sách…)
Data Access Layer
Lớp này thực hiện các nghiệp vụ liên quan đến lưu trữ và truy xuất
dữ liệu của ứng dụng Thường lớp này sẽ sử dụng các dịch vụ của các hệ quản trị cơ sở dữ liệu như SQL Server, Oracle,… để thực hiện nhiệm vụ của mình Trong lớp này có các thành phần chính là Data Access Logic, Data Sources, Servive Agents)
Data Access Logic components (DALC) là thành phần chính chịu trách nhiệm lưu trữ vào và truy xuất dữ liệu từ các nguồn dữ liệu - Data Sources như RDMBS, XML, File systems… Trong NET Các DALC này thường được hiện thực bằng cách sử dụng thư viện ADO.NET để giao tiếp với các hệ cơ sở dữ liệu hoặc sử dụng các O/R Mapping Frameworks để thực hiện việc ánh xạ các đối tượng trong bộ nhớ thành dữ liệu lưu trữ trong CSDL
Trang 29CHƯƠNG 2 KHẢO SÁT VÀ PHÂN TÍCH HỆ THỐNG 2.1 Quy định chung trong quản lý thu lệ phí trước bạ
Theo văn bản pháp luật hiện hành về luật Quản Lý thuế, nghị định của chính phủ về Lệ phí trước bạ Các thông tư của Bộ tài chính hướng dẫn thực hiện các quy định của pháp luật về lệ phí trước bạ
Các quy định chung đối với đối tượng chịu lệ phí trước bạ, đối tượng nộp lệ phí trước bạ, các mẫu tờ khai và hồ sơ kê khai đưa ra như sau:
2.1.1 Đối tượng chịu lệ phí trước bạ
Đối tượng đầu tiên được nêu là nhà gồm nhà ở, nhà làm việc, nhà xưởng, nhà kho, cửa hàng, cửa hiệu và các công trình kiến trúc khác
Thứ hai là đất là tất cả các loại đất quy định tại Khoản 1, 2 Điều 13 Luật Đất đai 2003 đã thuộc quyền quản lý sử dụng của tổ chức, hộ gia đình, cá nhân (không phân biệt đã xây dựng công trình hay chưa xây dựng công trình), bao gồm: đất nông nghiệp (đất sản xuất nông nghiệp, đất lâm nghiệp, đất nuôi trồng thuỷ sản, đất làm muối và đất nông nghiệp khác); đất phi nông nghiệp (đất ở, đất chuyên dùng, đất phi nông nghiệp khác)
Phương tiện vận tải, gồm: phương tiện vận tải cơ giới đường bộ, phương tiện vận tải cơ giới đường thuỷ (sông, biển, đầm, hồ ), phương tiện đánh bắt và vận chuyển thuỷ sản, cụ thể:
Tàu thuỷ, kể cả sà lan, ca nô, tàu kéo, tàu đẩy, vỏ hoặc tổng thành máy tàu thuỷ
Thuyền gắn máy (trừ thuyền không gắn máy loại không phải đăng ký quyền sở hữu, quyền sử dụng với cơ quan nhà nước có thẩm quyền theo quy định của pháp luật)
Ô tô là tất cả các phương tiện vận tải cơ giới đường bộ có từ 4 bánh trở lên, kể cả: rơ moóc và sơ mi rơ moóc; xe tải chở cần cẩu; xe chở
bê tông; xe chở xăng dầu; xe gắn các thiết bị ra đa, máy đo tần số,
thiết bị truyền hình; khung hoặc tổng thành máy ô tô thay thế phải
Trang 30đăng ký lại quyền sở hữu tài sản Trừ các máy, thiết bị không phải là phương tiện vận tải, như: xe lu, cần cẩu (kể cả xe cần cẩu tự hành chỉ chuyên dùng để cẩu), máy xúc, máy ủi, xe máy nông lâm nghiệp (máy cày, máy bừa, máy xới, máy làm cỏ, máy tuốt lúa, máy kéo ),
xe tăng, xe xích, xe bọc thép và các máy, các thiết bị khác không phải là phương tiện vận tải
Xe máy, gồm: xe mô tô hai bánh, mô tô ba bánh, xe hai bánh gắn máy, xe ba bánh gắn máy (kể cả xe lam), khung hoặc tổng thành máy
xe máy Tổng thành máy thay thế có số khung, số máy khác với số khung, số máy của tài sản đã được cơ quan nhà nước có thẩm quyền cấp giấy chứng nhận sở hữu, sử dụng Trường hợp sửa chữa khung, máy hoặc chỉ thay blok máy thì không phải chịu lệ phí trước bạ
Súng săn, sung thể thao
2.1.2 Đối tượng nộp lệ phí trước bạ
Tổ chức, cá nhân Việt Nam và tổ chức, cá nhân nước ngoài, kể cả các doanh nghiệp có vốn đầu tư nước ngoài hoạt động theo Luật đầu tư số 59/2005/QH11 ngày 29 tháng 11 năm 2005, có các tài sản thuộc đối tượng chịu lệ phí trước bạ nêu tại mục 1 phần này, phải nộp lệ phí trước bạ trước khi đăng ký quyền sở hữu, quyền sử dụng với cơ quan nhà nước có thẩm quyền (trừ các trường hợp không
phải nộp lệ phí trước bạ)
Trường hợp điều ước quốc tế mà Việt Nam ký kết, tham gia hoặc thoả thuận
có quy định khác thì thực hiện theo quy định của điều ước quốc tế đó
2.1.3 Mẫu tờ khai
Mẫu 01/LPTB; Mẫu 02/LPTB ban hành kèm theo Thông tư số 60/2007/ BTC ngày 14/6/2007 của Bộ Tài chính
Trang 31TT-Mẫu 01/LPTB với đối tượng là nhà đất:
CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập - Tự do - Hạnh phúc
TỜ KHAI LỆ PHÍ TRƯỚC BẠ NHÀ, ĐẤT [01] Người nộp thuế: [02] Mã số thuế:
[03] Địa chỉ: [04] Quận/huyện: [05] Tỉnh/Thành phố: [06] Điện thoại: [06] Fax: [08] Email:
a) Tên tổ chức, cá nhân chuyển giao QSDĐ:
Địa chỉ người giao QSDĐ:
b) Thời điểm làm giấy tờ chuyển giao QSDĐ ngày tháng năm 1.6 Giá trị đất thực tế chuyển giao (nếu có):
- Năm hoàn công (hoặc năm bắt đầu sử dụng nhà):
b) Mua, thừa kế, cho, tặng:
- Thời điểm làm giấy tờ chuyển giao nhà ngày tháng
Trang 32Mẫu 02/LPTB áp dụng: ô tô, xe máy, tàu, thuyền, súng săn, súng thể thao
CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập - Tự do - Hạnh phúc
TỜ KHAI LỆ PHÍ TRƯỚC BẠ
(Áp dụng đối với tài sản là ô tô, xe máy, tàu, thuyền, súng săn, súng thể thao)
A PHẦN NGƯỜI NỘP THUẾ TỰ KÊ KHAI:
1 Loại tài sản ( ô tô, xe máy, tàu thuyền ):
2 Tên hiệu tài sản:
4 Tài sản thuộc diện không phải nộp lệ phí trước bạ (lý do):
5 Giấy tờ có liên quan, gồm:
Tôi cam đoan số liệu khai trên là đúng và chịu trách nhiệm trước pháp luật về số liệu
Trang 337 Số chỗ ngồi, kể cả chỗ người lái ( đối với phương tiện chở khách):
1 Tổ chức, cá nhân giao tài sản:
2 Địa chỉ:
3 Thời điểm làm giấy tờ chuyển dịch tài sản:
III TÀI SẢN THUỘC DIỆN KHÔNG PHẢI NỘP LỆ PHÍ TRƯỚC BẠ (lý do):
IV GIẤY TỜ CÓ LIÊN QUAN, GỒM:
Ký tên, đóng dấu (ghi rõ họ tên và chức vụ)
B/ PHẦN KIỂM TRA XÁC ĐỊNH CỦA CƠ QUAN THUẾ:
1 Trị giá tài sản tính lệ phí trước bạ (đồng):
)
2 Số tiền lệ phí trước bạ phải nộp (đồng): Bằng trị giá tài sản tính LPTB nhân (x)
mức thu LPTB (%) Mức thu LPTB được quy định chi tiết cho từng loại tài sản (tàu thuyền, ô tô, xe máy các loại)
(Viết bằng chữ: ) Nộp theo chương loại khoản hạng mục tiểu mục
3 Địa điểm nộp:
4 Thời hạn nộp tiền chậm nhất đến ngày tháng năm 200
Trang 34Quá thời hạn nêu trên mà chủ tài sản chưa nộp thì mỗi ngày chậm nộp bị chịu phạt 0.05% số tiền chậm nộp /ngày
5 Không thu lệ phí trước bạ (nếu có): Chủ tài sản thuộc đối tượng không phải nộp
lệ phí trước bạ theo quy định tại điểm khoản Điều 3 Nghị định số 176/1999/NĐ-CP ngày 21/12/1999 của Chính phủ thuộc trường hợp:
, ngày tháng năm
CÁN BỘ KIỂM TRA TÍNH LỆ PHÍ
TRƯỚC BẠ
THỦ TRƯỞNG CƠ QUAN THUẾ
2.1.4 Hồ sơ kê khai
Khai lệ phí trước bạ nhà đất:
Tờ khai lệ phí trước bạ (Mẫu 01/LPTB)
Giấy tờ chứng minh nhà, đất có nguồn gốc hợp pháp
Giấy tờ chứng minh tài sản (hoặc chủ tài sản) thuộc đối tượng không phải nộp lệ phí trước bạ hoặc được miễn lệ phí trước bạ (nếu có) Khai lệ phí trước bạ tàu thuyền, ôtô, xe máy, súng săn, súng thể thao (trừ tàu thuyền đánh cá, tàu thuyền vận tải thủy nội địa có trọng tải dưới 50 tấn hoặc dưới 20 ghế hành khách thiếu hồ sơ gốc)
Tờ khai lệ phí trước bạ (Mẫu 02/LPTB)
Giấy tờ xác minh tài sản có nguồn gốc hợp pháp
Hoá đơn mua tài sản hợp pháp; hoặc hoá đơn bán hàng tịch thu; hoặc quyết định chuyển giao, chuyển nhượng, thanh lý tài sản; hoặc giấy
tờ chuyển giao tài sản được ký kết giữa bên giao tài sản và bên nhận tài sản có xác nhận của Công chứng nhà nước hoặc cơ quan nhà nước
có thẩm quyền (đối với trường hợp chuyển giao tài sản giữa các cá nhân, thể nhân không hoạt động sản xuất, kinh doanh)