6

Chúng tôi là một nhóm các nhà phát triển cơ sở dữ liệu SQL Server. Khách hàng của chúng tôi là một túi hỗn hợp của C#/ASP.NET, C# và dịch vụ web Java, dịch vụ Java/Unix và một số Excel.Xử lý lỗi SQL Server: ngoại lệ và hợp đồng cơ sở dữ liệu-khách hàng

Các nhà phát triển ứng dụng khách của chúng tôi chỉ sử dụng các thủ tục được lưu trữ mà chúng tôi cung cấp và chúng tôi hy vọng rằng (ở những nơi hợp lý) họ coi chúng như các phương pháp dịch vụ web.

Một số nhà phát triển ứng dụng khách của chúng tôi không thích ngoại lệ SQL. Họ hiểu họ bằng ngôn ngữ của họ nhưng họ không đánh giá cao rằng SQL bị hạn chế trong cách chúng ta có thể giao tiếp các vấn đề.

Tôi không chỉ có nghĩa là các lỗi SQL, chẳng hạn như cố chèn "bob" vào cột int. Tôi cũng có nghĩa là trường hợp ngoại lệ như nói với họ rằng giá trị tham chiếu sai hoặc dữ liệu đó đã thay đổi hoặc họ không thể làm điều này vì tổng hợp của ông không bằng 0.

Họ không thực sự có bất kỳ giải pháp thay thế cụ thể nào: họ đã đề cập rằng chúng ta nên xuất các thông số, nhưng chúng tôi giả định một ngoại lệ có nghĩa là "quá trình xử lý bị ngừng/quay lại.

Mọi người ở đây xử lý hợp đồng cơ sở dữ liệu-khách hàng như thế nào? Nói chung hoặc nơi có sự tách biệt giữa các mã DB và các mã con khách.

Chỉnh sửa:

  • chúng tôi sử dụng SQL Server 2005 try/catch độc quyền
  • chúng ta đăng nhập tất cả các lỗi sau khi rollback đến một bảng ngoại lệ đã
  • chúng tôi lo ngại rằng một số khách hàng của chúng tôi giành chiến thắng' t kiểm tra đầu ra paramaters và giả định tất cả mọi thứ là OK. Chúng tôi cần lỗi được gắn cờ để được hỗ trợ xem xét.
  • mọi thứ đều là ngoại lệ ... khách hàng được mong đợi thực hiện phân tích cú pháp thư để tách thông tin và lỗi. Để tách biệt các ngoại lệ của chúng tôi khỏi công cụ DB và các lỗi gọi, chúng phải sử dụng số lỗi (tất cả chúng tôi là 50.000)
+0

"chúng tôi lo ngại rằng một số khách hàng của chúng tôi sẽ không kiểm tra thông số đầu ra và giả định mọi thứ đều ổn. Chúng tôi cần lỗi được gắn cờ để được hỗ trợ xem xét". Tôi không thể nghĩ ra một cách để làm điều này trong T-SQL ngoài việc gửi một e-mail! –

+0

Các thói quen khách hàng gửi email cho bất kỳ ngoại lệ (chúng tôi hoặc họ) ... xây dựng doanh nghiệp của chúng tôi không cho phép email từ máy chủ SQL bằng bất kỳ phương tiện ... – gbn

Trả lời

3

Vâng tôi là một con khỉ mã khách hàng đề cập đến cơ sở dữ liệu rất nhiều. Đây là cách tôi xử lý nó.

Ngoại lệ (nâng cao) xảy ra trong SQL được truyền lại cho người gọi. Điều này sẽ bao gồm các ràng buộc về ref, các vi phạm chỉ mục duy nhất, các vấn đề nghiêm trọng hơn, vv Về cơ bản, bất cứ điều gì không làm cho hoạt động dữ liệu xảy ra bình thường sẽ được truyền lại.

Người gọi C# nên có điều này:

catch (SQLException sqlEx) 

Và sau đó xử lý các ngoại lệ khi cần thiết. Họ nên có một trình xử lý SQLException cụ thể. Cái này quan trọng.

Tôi thường tránh xa các tham số đầu ra vì tôi xem xét các thông số đó liên quan đến dữ liệu đang được truyền và không phải bất kỳ thông báo lỗi nào, ngoài ra tôi có thể kiểm tra ngoại lệ cho mã lỗi SQL Server. ngoại lệ đó.

Ngoài ra, trong một số trường hợp với SQL Server, chúng tôi đã lưu trữ các thủ tục có thể tăng "loại hình doanh nghiệp của ngoại lệ". Trong những trường hợp đó, chúng tôi thêm số lỗi tùy chỉnh (trên 50000) và tăng lỗi đó trong quy trình được lưu trữ khi cần. Nói chung, chúng tôi cố gắng giữ những điều này ở mức tối thiểu bởi vì nó làm tăng thêm sự phức tạp, nhưng trong một số trường hợp, chúng tôi thấy chúng cần thiết. Bây giờ, vì khách hàng đang bắt gặp SQLException, họ có thể xem mã lỗi được SQL Server trả về trong trường hợp ngoại lệ và sau đó thực hiện bất kỳ hành động đặc biệt nào (nếu cần) khi ngoại lệ bị bắt và số lỗi là một số giá trị. Điều này cho phép mức xử lý lỗi thứ cấp dựa trên mã lỗi nếu cần thiết cho các lỗi tùy chỉnh (> 50000).

Điều này cũng cho phép DBA tăng lỗi tùy chỉnh và yêu cầu mã khách hàng có cách nhất quán để xử lý chúng. Các DBA sau đó sẽ phải thông báo cho khách hàng mã khỉ những gì các lỗi tùy chỉnh để họ có thể chuẩn bị cho họ. Tôi thường không sử dụng mã trả lại cho mục đích xử lý lỗi, mặc dù tôi có thể thấy chúng có thể được sử dụng như thế nào, nhưng điều đó có nghĩa là nhiều logic hơn trong lớp mã khỉ để xem xét và xử lý mã trả về. Nếu họ là một vấn đề, tôi muốn một ngoại lệ trở lại, bởi vì sau đó tôi có thể đối phó với họ một cách nhất quán. Nếu tôi cũng phải xem xét mã trả lại, thì hiện tại có nhiều cách xử lý lỗi.

+0

Tương tự như những gì chúng tôi phát triển anyway. Cảm ơn bạn. Chúng tôi cũng bắt đầu sử dụng trạng thái trong RAISERROR để bắt chước các mã lỗi http cho các công cụ REST mới của chúng tôi, ví dụ: 100 trong SQL để ánh xạ tới 409 cho một lỗi duy nhất không thành công. – gbn

2

Tôi thường sử dụng thông số đầu ra - và xác định các giá trị có thể.

0 = thành công
postive Integer (trên một chèn giả sử) = New Row Id (@@ identity)

Negative Integer = Known Điều kiện Lỗi có thể xảy ra
-1 = Thiếu @LastName (hoặc không có chiều dài)
-2 = Thiếu @FirstName (hoặc không có chiều dài)
... vv ...

này trở nên một chút tẻ nhạt để xác định - nhưng nó có thể được mở rộng - và đó là một cách để có được ý nghĩa kết quả trở lại khách hàng của bạn nd cho một lớp truy cập dữ liệu để quay trở lại một lớp đối tượng kinh doanh một lý do chính xác cho sự thất bại (tôi sử dụng enums trong lớp đối tượng kinh doanh cho điều kiện trạng thái khác nhau). Nó cũng có thể cho một lớp truy cập dữ liệu để ném ngoại lệ nếu muốn - nhưng tôi tin rằng chi phí-khôn ngoan từ một quan điểm hiệu suất bạn tốt hơn off không ném lỗi khi bạn chỉ có thể kiểm tra một enum hoặc giá trị số nguyên.

Có các kỹ thuật khác - đây chỉ là một kỹ thuật mà tôi đã sử dụng với một số biện pháp thành công trong quá khứ.

+0

Cảm ơn. Chúng tôi đã xem xét điều này nhưng chúng tôi có thể cần phải ném văn bản và giá trị cũng như các giá trị mới nhất từ ​​tổng hợp. – gbn

2

đây là đề nghị của tôi:

return 0 khi tất cả mọi thứ là ok
trở lại tiêu cực x khi một lỗi logic hapens, thiếu hoặc không hợp lệ dữ liệu
trở lại tích cực x khi một lỗi nghiêm trọng xảy ra, chèn thất bại vv

thêm thông số đầu ra ErrorMsg và ErrorLog vào các thủ tục được lưu trữ. ErrorMessage sẽ chứa thông báo có thể đọc được của con người, ErrorLog sẽ chứa thông tin gỡ lỗi.
Đây sẽ là NULL nếu trả lại 0
Bạn có thể sử dụng ErrorLog để ghi lại bất kỳ sự cố nào, đảm bảo rằng nếu bạn chèn chúng vào bảng, bạn thực hiện sau khi khôi phục.

sử dụng TRY - Bắt giữ các sự cố chụp và xây dựng thư của riêng bạn và trả lại thông tin bằng các quy ước trên.

+0

Chúng tôi sử dụng TRY/CATCH và đăng nhập ngoại lệ (sau khi quay trở lại) luôn luôn – gbn

2

Tại công việc hiện tại của mình, chúng tôi bảo lưu các ngoại lệ cho điều kiện đặc biệt. Đối với những thứ như thông số xấu hoặc tương tự, chúng tôi có mã trả lại chuẩn - giá trị tham số không hợp lệ luôn trả về 98, ví dụ. (tại sao 98 bị mất lịch sử ...)

Điều này không nhất thiết phải lý tưởng cho cả khách hàng và SP phải hiểu mã trở lại cụ thể có ý nghĩa gì; đó là một sự phân tách mối quan tâm xấu.

Trong trường hợp đặc biệt, chúng tôi sử dụng tham số OUT để trả lại thư và dịch vụ lô của chúng tôi sử dụng thiết lập bảng #scratch được chuẩn hóa.

Tại một nhà tuyển dụng trước, chúng tôi đã sử dụng các lỗi SQL tùy chỉnh cho cùng một mục đích. Vì vậy, sử dụng những gì có ý nghĩa. Cá nhân, tôi thích một cơ chế duy nhất nhưng điều đó có thể không thực hiện được tùy thuộc vào môi trường của bạn.

Có thể tất cả các bạn nên tập hợp lại để phát triển các cách tiêu chuẩn hóa cho mã máy khách để xử lý nó. VBA được sử dụng trong Excel có những hạn chế riêng biệt mà mã C# và Java không, và tương tự như Java & C# là với nhau, chúng không giống nhau. Nếu bạn muốn kết hợp với ngoại lệ trở về, thì nếu bạn có thể đồng ý a) một phạm vi # thông báo cho biết "lỗi" ngoại lệ và b) bố cục thư được chuẩn hóa để phân tích chuẩn hóa có thể xảy ra, nhà phát triển sẽ 90% đã hoàn thành.

Các vấn đề liên quan