11

SQL の実行によって影響を受ける行数を取得する方法がわかりません。

私はこれが好きです:

boolean isResultSet = statement.execute(arbitrarySQLCommand);

getUpdateCount()メソッドから影響を受ける行の数を取得できます。それはすべて問題ありません。私が抱えている問題は、更新カウントがゼロの場合です。これは次のいずれかを意味します。

  1. これは DML ステートメントでしたが、どの行にも影響しませんでした。影響を受ける 0 行は有効な応答です。ある条件が満たされていないことを意味します。

  2. これは非 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 ステートメントであるかを判断することです。このようなもの:

  1. から最初の単語を抽出しarbitrarySQLCommandます。単語は、空白または EOL 行文字で終了します。
  2. その単語 (大文字と小文字を区別しない) が INSERT、UPDATE、または DELETE のいずれかである場合、それは DML ステートメントであり、からの出力getUpdateCount()は関連性があります。それ以外の場合、からの出力は関連性getUpdateCount()がありません。

醜くてエラーが発生しやすい。しかし、このSOの質問から出てきた唯一の可能な解決策。:-(

4

2 に答える 2

6

たぶん私の答えはあなたが尋ねたものには役立たないかもしれませんが、DMLを実行した後に影響を受ける行数を取得する方法を検索したときにここにたどり着きました.MySQLで行数が見つかりません. そして、他の人を助けるために見つけたものをここに書きます。

私の問題は、テーブルに変更を加えないステートメントを実行すると、たとえば

UPDATE table SET field=1 WHERE field=1

メソッドStatement.executeUpdate(...)は、変更/影響を受けた行の数ではなく、見つかった行の数を返しました。そのため、クエリがテーブル内の何かを変更したかどうかはわかりませんでした。

これを変更するには、次のように、接続の作成時に URL にオプションを指定する必要があります ( with DriverManager.getConnection())。

jdbc:mysql://${jdbc.host}/${jdbc.db}?useAffectedRows=true

ここで見つけました:

http://mybatis-user.963551.n3.nabble.com/Return-number-of-changed-rows-tp3888464p3903155.html

そしてMySQLのドキュメント:

https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-configuration-properties.html

于 2014-01-11T21:19:33.070 に答える