私は、バックエンドとして SQL サーバーを使用して C# で記述されたデータベース アプリケーションに取り組んでいます。また、データの整合性のために、データベース レベル (リレーション、チェック制約、トリガー) で可能な限り強化するようにしています。
それらが原因で、データに一貫性がない場合、保存/更新/挿入が失敗し、アプリが SqlException をスローする可能性があります。
UI (入力されたデータが無効な場合に意味のある情報をユーザーに提示するため) と、エラーをユーザーに提示する UI にエラーを報告する BL の両方で、さまざまな検証を行います。
ただし、実際にはアプリでチェックできず、データベースによって処理されるものがあります。つまり、カスケード削除がなく、ユーザーがマスター テーブルからエンティティを削除しようとすると、削除エラーが発生します。
たとえば、従業員テーブルは、従業員のマネージャー、部門のマネージャー、レジ担当者、チームリーダー、チームメンバーなど、多くの関係でマスターとして機能します。関係に関与していない新しい従業員を追加すると、それを削除できますが、ユーザーのそのような関係でマスターになっているものを削除しようとすると、DB レベルで適用される RI ルールが原因で (当然のことながら) 削除が失敗しますが、問題ありません。
try ... catch で削除コードを記述して例外を処理し、その従業員を削除できないことをユーザーに伝えます。しかし、ユーザーにもっと意味のある情報を提供したい - レコードを削除できない理由. おそらくそれは、テストチームにも追加されたテスト従業員の記録だったのでしょう。しかし、ユーザーはそれをどこに追加したかを忘れ、「チーム T1 の一部であるため従業員を削除できません」と伝えることができた場合、ユーザーは最初にチーム T1 に移動し、ユーザーを削除してからもう一度削除を試みることを知っています。これは単純な例です。先ほど述べたように、従業員は多くの関係に関与する可能性があるためです。私のアプリでは、少なくとも 20 の関係があります。
解決策は、SqlException によって報告されたメッセージを表示することですが、それはまったくエレガントではありません。まず、そのメッセージは非常に技術的です。FK、PK、トリガーについて述べていますが、これらはユーザーにとって無意味であり、ユーザーを怖がらせます。次に、私のアプリは多言語 UI を使用しており、すべてのメニューとメッセージはユーザーが選択した言語 (ログイン時またはユーザー プロファイルで選択) で表示されます。また、SqlException からのメッセージは英語 (英語版を使用している場合) であるか、SQL サーバーがその言語である場合、ドイツ語やオランダ語などの最悪のあまり一般的ではない言語です。
ユーザーに意味のあるメッセージを表示できるように、SQL 例外から意味のある情報を抽出するための一般的または推奨されるアプローチはありますか (たとえば、失敗の原因となったリレーションまたは子テーブル、またはトリガーなど)。しかし、言語に依存しない方法でプログラムでテストし、ユーザーフレンドリーな方法で独自のエラーメッセージをフォーマットできるものはありますか?
この状況をどのように処理しますか?
すべての回答に感謝します
(PS:長文すみません)