- [SQLSERVER] Loại bỏ Restricted User trên database MSSQL
- [C#] Hướng dẫn tạo mã QRcode Style trên winform
- [C#] Hướng dẫn sử dụng temp mail service api trên winform
- [C#] Hướng dẫn tạo mã thanh toán VietQR Pay không sử dụng API trên winform
- [C#] Hướng Dẫn Tạo Windows Service Đơn Giản Bằng Topshelf
- [C#] Chia sẻ source code đọc dữ liệu từ Google Sheet trên winform
- [C#] Chia sẻ source code tạo mã QR MOMO đa năng Winform
- [C#] Chia sẻ source code phần mềm lên lịch tự động chạy ứng dụng Scheduler Task Winform
- [Phần mềm] Tải và cài đặt phần mềm Sublime Text 4180 full version
- [C#] Hướng dẫn download file từ Minio Server Winform
- [C#] Hướng dẫn đăng nhập zalo login sử dụng API v4 trên winform
- [SOFTWARE] Phần mềm gởi tin nhắn Zalo Marketing Pro giá rẻ mềm nhất thị trường
- [C#] Việt hóa Text Button trên MessageBox Dialog Winform
- [DEVEXPRESS] Chia sẻ code các tạo report in nhiều hóa đơn trên XtraReport C#
- [POWER AUTOMATE] Hướng dẫn gởi tin nhắn zalo từ file Excel - No code
- [C#] Chia sẻ code lock và unlock user trong domain Window
- [DEVEXPRESS] Vẽ Biểu Đồ Stock Chứng Khoán - Công Cụ Thiết Yếu Cho Nhà Đầu Tư trên Winform
- [C#] Hướng dẫn bảo mật ứng dụng 2FA (Multi-factor Authentication) trên Winform
- [C#] Hướng dẫn convert HTML code sang PDF File trên NetCore 7 Winform
- [C#] Hướng dẫn viết ứng dụng chat với Gemini AI Google Winform
[SQLSERVER] Xử lý ngoại lệ sử dụng TRY...CATCH và RAISEERROR
SQLServer Transact-SQL cung cấp cơ chế kiểm soát lỗi bằng TRY … CATCH như trong các ngôn ngữ lập trình phổ dụng hiện nay (Java, C, PHP).
Bài viết này giới thiệu những vấn đề chung trong việc sử dụng TRY … CATCH cùng với hàm RAISEERROR để quản lý lỗi khi lập trình SQL trên SQL Server.
Ví dụ đơn giản về TRY … CATCH SQLSERVER
Đầu tiên, ta xét một ví dụ phát sinh lỗi đơn giản sau:
Sau khi thực thi câu lệnh, ta thu được kết quả:
Các hàm đọc thông tin lỗi
Dưới đây là một số hàm cung cấp thông tin về lỗi vừa phát sinh:
Sử dụng TRY … CATCH với TRANSACTION
Ta có thể sử dụng kết hợp TRY … CATCH với khối TRANSACTION. Bên trong khối TRANSACTION, các lệnh thao tác với dữ liệu được đặt trong một khối TRY để khi có bất cứ lỗi nào xảy ra, chương trình có thể bắt được và xử lý.
Trước tiên, ta chuyển vào làm việc trong CSDL tempdb:
Sau khi thực hiện các lệnh trên, ta có bảng dữ liệu kết quả như sau:
Sử dụng TRANSACTION để cập nhật một loạt dữ liệu:
Sau khi thực hiện xong, ta thử truy vấn lại bảng T1, kết quả truy vấn vẫn giống như trước khi thực hiện TRANSACTION (do TRANSACTION bị lỗi nên đã ROLLBACK toàn bộ):
Sử dụng TRY … CATCH với PROCEDURE
Trong ví dụ này, ta xây dựng Stored Procedure có sử dụng khối lệnh TRY … CATCH để bắt và xử lý lỗi. Xét 2 bảng A và B được tạo như sau:
Kết quả thực thi lệnh tạo bảng A:
Lệnh tạo bảng B:
Kết quả thực thi lệnh tạo bảng B:
Tạo STORED PROCEDURE xóa bản ghi trong A như sau:
Sử dụng STORED PROCEDURE này để xóa một bản ghi của A:
Thông báo lỗi như sau:
Để có thể bắt và xử lý lỗi này ngay bên trong STORED PROCEDURE, ta cần sử dụng khối lệnh TRY … CATCH … Chỉnh sửa STORED PROCEDURE hiện tại để bổ sung TRY … CATCH:
Gọi Procedure và bắt lỗi nếu có:
Kết quả thực thi lệnh gọi thủ tục trên:
Muốn hiểu rõ giá trị các thông số Msg: 547, Level: 16, State: 0,… hãy đọc tiếp phần bài viết RAISEERROR ở bên dưới.
Sử dụng lệnh RAISEERROR để phát sinh lỗi
Xét bảng dữ liệu lưu danh sách sinh viên với dữ liệu mẫu như sau:
Và một STORED PROCEDURE có tên insertStudent dùng để chèn thêm Student mới vào bảng:
Khi chèn dữ liệu, ta nhận thấy rằng mã sinh viên (trường rollno) phải có đúng 7 ký tự, ngoài ra tên của sinh viên (trường fullname) không được để rỗng. Trong trường hợp người dùng nhập sai dữ liệu, ta cần phát sinh thông báo lỗi để người dùng biết và nhập lại dữ liệu đúng. Khi đó, ta sử dụng câu lệnh RAISE ERROR như sau:
Lưu ý là giá trị SEVERITY phải lớn hơn 10 thì lệnh TRY … CATCH bên dưới đây mới bắt được lỗi:
Khi đó, ta nhận được thông báo lỗi:
Thông tin và cách sử dụng các thông số trong lời gọi RAISERROR tham khảo trong tài liệu MS SQLServer.