SQL の実行によって影響を受ける行数を取得する方法がわかりません。
私はこれが好きです:
boolean isResultSet = statement.execute(arbitrarySQLCommand);
getUpdateCount()
メソッドから影響を受ける行の数を取得できます。それはすべて問題ありません。私が抱えている問題は、更新カウントがゼロの場合です。これは次のいずれかを意味します。
これは DML ステートメントでしたが、どの行にも影響しませんでした。影響を受ける 0 行は有効な応答です。ある条件が満たされていないことを意味します。
これは非 DML ステートメント (DDL ステートメントの可能性が最も高い) でした.. 定義上、行を変更しないため、更新カウントは常にゼロです (当たり前!)。別の言い方をすれば、そのようなステートメントでは、更新カウントの概念は無意味です。
私が望むのは、上記の 1 と 2 の状況を区別できるようにすることです。どのように?
出力を生成するステートメントには興味がないので、executeUpdate()も使用できますが、そのメソッドからの戻り値には同じ欠陥があります。
戻り値:
(1) SQL データ操作言語 (DML) ステートメントの行数、または (2) 何も返さない SQL ステートメントの場合は 0
ああ!
だったらいいのに:
戻り値:
(1) SQL データ操作言語 (DML) ステートメントの場合は行数、または (2) 何も返さない SQL ステートメントの場合は -1
arbitrarySQLCommand
(注:内容は事前
にわかりません)
最終的に選択されたソリューション
この問題に対する真の JDBC のような解決策はないようです。私の考えでは、JDBC の設計者はgetUpdateCount
値 0 (ゼロ) を使用して (定義により) 行に影響を与えないステートメントを示すことで重大な間違いを犯しました。 DML ステートメント。
唯一可能な解決策は、SQL ステートメントで何らかのパターン マッチングを実行して、それが DML ステートメント (INSERT、UPDATE、DELETE) であるか、別の種類の SQL ステートメントであるかを判断することです。このようなもの:
- から最初の単語を抽出し
arbitrarySQLCommand
ます。単語は、空白または EOL 行文字で終了します。 - その単語 (大文字と小文字を区別しない) が INSERT、UPDATE、または DELETE のいずれかである場合、それは DML ステートメントであり、からの出力
getUpdateCount()
は関連性があります。それ以外の場合、からの出力は関連性getUpdateCount()
がありません。
醜くてエラーが発生しやすい。しかし、このSOの質問から出てきた唯一の可能な解決策。:-(