2016-04-13 15 views
0

データベース上でmySQLクエリ/文を実行するツールを作成しようとしています。 私が実行している問題は、これらのクエリー/ステートメントがテキストボックスのようなフリーフォームのテキストにあることです。プロフェッショナルなSQLプログラムでも使用しています。あなたは、クエリ/文は、その後、コメント、SET文と実行文またはSELECTクエリのいずれかを含むことが見ることができるようにSET文と通常の文を組み合わせる

#Example of a query statement 
@SET fName = "John" 
SELECT * FROM Person WHERE Person.firstName = fName 

#Example of an execute statement 
@SET fName = "John" 
DELETE FROM Person WHERE Person.firstName = fName 

:それはようなものになるだろう例を与えることを 。また、それらは必ずしも適切にフォーマットされていないかもしれないので、スタッフやタブやスペースの間に空白行があるかもしれません。

私はPreparedStatementsのオプションについて知っていますが、それは動作しますが、それは完全なクエリ/ステートメントの請求書がフリーフォームのテキストとして編集可能ではありません。 私の質問は、これらのステートメント/クエリをJavaで実行する方法です。 executeBatchは2番目の例では動作しますが、最初の例ではResultSetが返されます。

+1

あなたは 'execute()'を使って調べる必要があります。自動コミットを無効にしてください。 –

+0

.setAutoCommit(false)は実行されたステートメントの積み重ねを許可しますか? "@SET xxxx"に対してのみ.execute()が動作する ステートメントを分割して.executeUpdate()または.executeQuery()を.setAutoCommit(false)で実行すると、それらをスタックして後でコミットできるようになります彼らはすべて実行されましたか? – ZeW

+1

私は定期的にMySQLを使用していませんし、 '@SET'を使ったことは一度もありませんが、コミットの境界を越えて永続化されないことを期待しています(間違っているかもしれません)。あなたは['execute'](http://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#execute-java.lang.String-)を使う必要があります。あなたが実行している文のタイプを事前に知っている。そして、自動コミットを無効にすると、接続オブジェクトに対して自分自身で 'commit()'を呼び出す必要があります。 –

答えて

0

ソリューションのStatement.execute()よりもむしろ.executeUpdate()または.executeQuery(のような、より特定の機能のうちの1つ)あるいは.executeBatchを()

関数.execute()は返し使用に出てきます返される結果があるかどうか、または取得する結果がさらにあるかどうかを示すブール値。

public void executeAll(String queryString) throws SQLException { 
    boolean hasMoreResults = statement.execute(queryString); 
    int updateCount = statement.getUpdateCount(); 

    while(hasMoreResults || (!hasMoreResults && updateCount != -1)){ 
     //.execute() can be false if a query is not returned as when using a SET/ UPDATE/ DELETE which is why we check if updateCount is -1 meaning there are no more statements returned 
     if(hasMoreResults){ 
      resultSet = statement.getResultSet(); 
      //Do what you need to do with the ResultSet 
     } else { 
      //Else it's a UPDATE/ DELETE count - int 
      //Do what you need to do with the updateCount 
     } 
     hasMoreResults = statement.getMoreResults(); 
     updateCount = statement.getUpdateCount(); 
     //New values for the next cycle 
    } 
    //Possibly return stuff? 
} 
関連する問題