問題タブ [sqlexception]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - モックと単体テストに必要なときにSqlExceptionをスローする方法は?
プロジェクトでいくつかの例外をテストしようとしていますが、キャッチした例外の1つはですSQlException
。
行くことができないようnew SqlException()
ですので、特にデータベースを呼び出さずに例外をスローする方法がわかりません(これらは単体テストであるため、通常はデータベースを呼び出さないことをお勧めします)。
NUnitとMoqを使用していますが、これを偽造する方法がわかりません。
すべてADO.NETに基づいているように見えるいくつかの回答に対応して、LinqtoSqlを使用していることに注意してください。そのため、舞台裏のようなものです。
@MattHamiltonからの要求に応じた詳細情報:
モックアップしようとすると最初の行に投稿します
c# - データベース アプリケーションでの SqlExceptions の処理に関する推奨アプローチ
私は、バックエンドとして SQL サーバーを使用して C# で記述されたデータベース アプリケーションに取り組んでいます。また、データの整合性のために、データベース レベル (リレーション、チェック制約、トリガー) で可能な限り強化するようにしています。
それらが原因で、データに一貫性がない場合、保存/更新/挿入が失敗し、アプリが SqlException をスローする可能性があります。
UI (入力されたデータが無効な場合に意味のある情報をユーザーに提示するため) と、エラーをユーザーに提示する UI にエラーを報告する BL の両方で、さまざまな検証を行います。
ただし、実際にはアプリでチェックできず、データベースによって処理されるものがあります。つまり、カスケード削除がなく、ユーザーがマスター テーブルからエンティティを削除しようとすると、削除エラーが発生します。
たとえば、従業員テーブルは、従業員のマネージャー、部門のマネージャー、レジ担当者、チームリーダー、チームメンバーなど、多くの関係でマスターとして機能します。関係に関与していない新しい従業員を追加すると、それを削除できますが、ユーザーのそのような関係でマスターになっているものを削除しようとすると、DB レベルで適用される RI ルールが原因で (当然のことながら) 削除が失敗しますが、問題ありません。
try ... catch で削除コードを記述して例外を処理し、その従業員を削除できないことをユーザーに伝えます。しかし、ユーザーにもっと意味のある情報を提供したい - レコードを削除できない理由. おそらくそれは、テストチームにも追加されたテスト従業員の記録だったのでしょう。しかし、ユーザーはそれをどこに追加したかを忘れ、「チーム T1 の一部であるため従業員を削除できません」と伝えることができた場合、ユーザーは最初にチーム T1 に移動し、ユーザーを削除してからもう一度削除を試みることを知っています。これは単純な例です。先ほど述べたように、従業員は多くの関係に関与する可能性があるためです。私のアプリでは、少なくとも 20 の関係があります。
解決策は、SqlException によって報告されたメッセージを表示することですが、それはまったくエレガントではありません。まず、そのメッセージは非常に技術的です。FK、PK、トリガーについて述べていますが、これらはユーザーにとって無意味であり、ユーザーを怖がらせます。次に、私のアプリは多言語 UI を使用しており、すべてのメニューとメッセージはユーザーが選択した言語 (ログイン時またはユーザー プロファイルで選択) で表示されます。また、SqlException からのメッセージは英語 (英語版を使用している場合) であるか、SQL サーバーがその言語である場合、ドイツ語やオランダ語などの最悪のあまり一般的ではない言語です。
ユーザーに意味のあるメッセージを表示できるように、SQL 例外から意味のある情報を抽出するための一般的または推奨されるアプローチはありますか (たとえば、失敗の原因となったリレーションまたは子テーブル、またはトリガーなど)。しかし、言語に依存しない方法でプログラムでテストし、ユーザーフレンドリーな方法で独自のエラーメッセージをフォーマットできるものはありますか?
この状況をどのように処理しますか?
すべての回答に感謝します
(PS:長文すみません)
linq-to-sql - 「トランザクション(プロセスID 56)が別のリソースとのロックリソースでデッドロックしました」
私は(夜間に)linq2sqlクエリの形式で大量のデータを取得し、これをXML(サイトマップ)としてダンプするプロセスを持っています。私の問題は、私が時々得ていることです:
System.Data.SqlClient.SqlException:
トランザクション(プロセスID XX)は、別のプロセスとのロックリソースでデッドロックされ、デッドロックの犠牲者として選択されました。トランザクションを再実行します。
このクエリは読み取り専用であり、「トランザクションセーフ」である必要はありません。例外を回避するために、このようなプロセスを作成できますか?
編集:
基本的にコードは次のとおりです。
asp.net - SQLExceptionエラーからの例外の出力
.asmxページのWebサービスを呼び出す.aspxページがあります。その.netWebサービスで、SQLServer2008へのデータベース接続を開こうとしました。接続が失敗します。理由はわかりません。私はこれをtry/catchで実行していますが、デバッグ時にcatchがヒットします。サーバーのファイルシステムにアクセスしてログファイルを書き込むことができないため、そこに何を出力できるかわかりません。
私はこの投稿を見つけました:
ここでそれは私のためにトリックをするかもしれません、しかし私はこのウェブサービスを呼んだページにmsg文字列を出力させる方法がわかりませんか?呼び出し元のページにも同じ例外ハンドラーを実装させることで、例外チェーンの上位に伝播する方法はありますか?
ありがとう // :)
c# - ユーザー「username」のログインに失敗しました
MSSQL サーバーのテーブルから一連の行を選択するフォームがあります。現在、このフォームはデータの更新に使用されていますが、フォームを使用してデータを更新した後、正しく行われますが、次のページにリダイレクトされます。そのテーブル内のすべての行のデータグリッドであり、別の行を選択して更新することができます。もう一度更新した行を選択すると、「ユーザー 'slehan_ticketadmin' のログインに失敗しました」というメッセージが表示されます。
データを更新するために 1 分前にフォームを使用したため、ユーザー名とパスワードが正しいことがわかりました。ホストが制限しているため、SQL エラー ログを表示できませんが、更新フォームのコード ビハインドを次に示します。
ご覧の Ticket クラスは、SQL Server から更新/選択/削除されたチケットのデータを保持する単なるクラスです。構造化された方法でデータを変更/保持するための簡単な方法です。次の行に注意を向けたいと思います。
データベースからチケットを挿入/選択/更新/削除する一連のメソッドを持つ TicketDatabase という別のクラスがあります。selectTicketFromDatabase() メソッドのスタブを次に示します。
これをローカルホストサーバーでテストして、サーバーまたはコードがエラーの原因であるかどうかを確認しますが、この特定の問題に対する提案/サポートは引き続き受け付けています。
前もって感謝します!
sql - ロード時に列タイプを尊重するために CSV から SQL LOAD DATA を取得するにはどうすればよいですか?
CREATE TABLE
と を使用して CSV ファイルを MySQL (5.1) にロードしていますLOAD DATA
。テキスト型 (カテゴリ) であるが数値を含む列がいくつかあります。テーブルを作成するときにこれらの列を割り当てますVARCHAR(254)
が、JDBC ドライバーは SQLException "行 1 の列 AgeGroup のデータが切り捨てられました" をスローします。
私のデータは次のようになります。
私のテーブル作成ステートメントは次のようになります
私のロードステートメントは次のようになります
AgeGroup はテキスト データベースの列であるため、型変換の問題であると推測していますが、数値のように見えるものを貼り付けています。
LOAD DATA
コマンドに列のデータ型を適用させ、ファイルの内容を変換させるにはどうすればよいですか?
公式の MySQL JDBC ドライバーを使用しています。
optimization - JDBC の SQLException
JDBC を使用して Informix DB でクエリを実行しようとすると、SQLException が発生します。クエリのサイズが非常に大きい:
「in」部分に 5000 を超える値が含まれているため、また長さが原因で、例外が発生します。これを回避する方法はありますか、それとも分割して 2 つのクエリを実行する必要がありますか?
sql - SqlCommand.ExecuteNonQuery によってスローされた SqlException にすべての PRINT がエラーとして含まれるのはなぜですか?
次のスニペットを実行すると
次のメッセージが表示されます。
とex.Errors
4 つのエントリがあります (SqlError
出力に対応する 3 の aSqlError.Class
は 0 です (対、実際のエラーの場合は 18))。
ただし、に置き換えるExecuteNonQuery
とExecuteScalar
、期待される結果が得られます。
メッセージSQL_Error
はex.Errors
...
の奇妙な動作を回避する方法はありますcmd.ExecuteNonQuery
か??
vb.net - SQL例外データ
SQL例外クラスを使用し、それを使用して主キー違反のカスタムメッセージを表示するプログラムを作成しました。また、違反の原因となった主キーの値が必要です。sqlexceptionオブジェクトから例外を生成したすべての主キーを取得するにはどうすればよいですか。
.net - デッドロックによって引き起こされたSqlExceptionをキャッチする方法は?
.NET 3.5 / C#アプリから、SQLServer2008インスタンスのデッドロックが原因である場合にのみSqlException
キャッチしたいと思います。
典型的なエラーメッセージはTransaction (Process ID 58) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
それでも、この例外について文書化されたエラーコードではないようです。
メッセージ内のデッドロックキーワードの存在に対して例外をフィルタリングすることは、この動作を実現するための非常に醜い方法のようです。誰かがこれを行う正しい方法を知っていますか?