2016-04-13 18 views
0

Bir veritabanında mySQL sorgularını/deyimlerini çalıştıran bir araç oluşturmaya çalışıyorum. Çalıştığım sorun şu ki bu sorgular/ifadeler bir metin kutusu gibi bir serbest form metninde. Profesyonel bir SQL programıyla da kullanıyorum. Eğer sorgu/ifadeleri bir açıklama veya bir seçme sorgusu çalıştırmak ya sonra yorum, SET ifadeleri ve içerebilir görebileceğiniz gibiSET ifadelerini normal ifadelerle birleştirin

#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 

: gibi bir şey olurdu Bir örnek vermek gerekirse. Ayrıca, her zaman düzgün bir şekilde biçimlendirilmeyebilirler, bu nedenle, nesneler veya sekmeler veya boşluklar arasında boş çizgiler olabilir.

PreparedStatements seçeneğiyle ilgili bilgileri biliyorum, ancak bu işe yarayacak olsa da, serbest metin olarak düzenlenebilir tüm sorgu/deyimin faturasına uymuyor. Sorum, Java ile bu ifadeleri/sorguları nasıl yürüteceğim? executeBatch ikinci örnek için çalışır, ancak ResultSet'i döndürürken ilkini değil.

+1

'execute()' işlevine bakmanız gerekiyor, otomatik işlem yapmayı devre dışı bıraktığınızdan emin olun. –

+0

.setAutoCommit (false), yürütülen deyimlerin yığınlanmasını sağlar mı? Sadece .execute() "@SET xxxx" üzerinde çalışır. Açıklamaları ayırırsam ve .executeUpdate() veya .executeQuery() ile .setAutoCommit (false) çalıştırırsam bunları yığmam ve sonra da Hepsi infaz edildi mi? – ZeW

+1

Düzenli olarak MySQL kullanmıyorum ve hiç bir zaman @ SET kullanmıyorum, ancak bunların taahhüt sınırları boyunca kalıcı olmamasını beklerim (yanılıyor olabilirim). ['Execute'] 'ı kullanmanız gerekir (http://docs.oracle.com/javase/8/docs/api/java/sql/Statement.html#execute-java.lang.String-) çünkü önceden ne tür bir ifadeyi çalıştırdığınızı bilmek. Ve evet, otomatik işlemi devre dışı bıraktığınızda, bağlantı nesnesinde 'commit()' i çağırmanız gerekir. –

cevap

0

Çözelti Statement.execute() yerine .executeUpdate() veya .executeQuery (gibi daha spesifik fonksiyonlarının biri) ya da .executeBatch()

fonksiyonu .Execute() bir döner kullanılarak çıkar sonuçların döndürülüp sonuçlanmadığını veya alınacak daha fazla sonuç olup olmadığını söylemek için boolean.

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? 
}