2016-08-17 4 views
1

私は、次の更新コードを持っている:私はそれを実行したときにGroovy withBatch(または多分JDBCドライバ)のバグ?

String updateSqlText = "update myTable set id=1006, floatParam=? where sud_id=10067237"; 

def updateCounts = sql.withBatch(1, updateSqlText) { ps -> 
    def args = [null] 
    ps.addBatch(args) 
} 

それは私に語った: はキャッチ:java.sql.BatchUpdateException:FLOAT 『「を』データ型VARCHARからの暗黙的な変換が許可されていません。この問合せを実行するには、CONVERTファンクションを使用します。

私がやるただし場合は、この:それは問題なく動作します

String updateSqlText = "update myTable set id=1006, floatParam=? where sud_id=10067237"; 
def args = [null] 
imagineSql.executeUpdate(updateSqlText, args) 

パラメータはfloat型であり、それは私がwithBatchを呼び出すときに文字列にnullを変換しようとしますが、定期的に正常に動作ように見えます更新。

SybaseとjTDS jdbcドライバを使用しています。

編集:私はそれが動作することを

def args = [Types.NULL] 

def args = [null] 

を変更した場合のように見えます。私はGroovyをwithBatchでそれを行うために修正する必要があると思います。

EDIT2:今、私はVARCHARにヌル追加する問題に直面しています - それは私に巻き込ま

を与える:java.sql.BatchUpdateException:「VARCHAR」へ データ型から暗黙の変換「INTは」許可されていません。このクエリを実行するには、CONVERT関数 を使用します。

+0

あなたは、Javaからこれをやってみましたがありますか?このGroovy APIはJDBCのAPIをたくさん隠しているので、破損する可能性のあるバックグラウンドでいくつかのトリックを行う可能性が高いです。 Javaから直接破ることができる(または知っている)方がいれば、それがJDBCドライバのバグかGroovyの問題かを判断する方が簡単です。 –

+0

私は簡単なルートを最初に進めようとしています:)これは、私が特定の問題を表示するために行う単純な例です。私は、私が更新に入れた動的パラメータの束を持っています、そして、彼らは私が別のデータベースから行う選択から更新されているので、私はそれが十分な複雑さがあるので簡単に保つことを試みています。可能であれば、パラメータタイプを指定する必要がない場合は、私は好むでしょう。 –

+0

私が推測しなければならないのは、Groovyが 'PreparedStatement.setObject(int、Object)'を使用し、jTDSドライバが 'null'に対して' Types.VARCHAR'にデフォルト設定されているか、Groovyが 'setString(int、String) ) ''ヌル 'の場合)。 –

答えて

2

NullObjectとしてbind varを指定できますか?

sql.withBatch(1, updateSqlText) { 
    def args = [org.codehaus.groovy.runtime.NullObject.getNullObject()] 
} 

または多分

Float myFloatArg = null; // or = 23.4f; 
sql.withBatch(1, updateSqlText) { 
    def args = [myFloatArg] 
} 
+0

withBatchの最初のパラメータはバッチ処理された文の数です。この例を単純化するために1にしました。私が追加するパラメータはdef args = [null]にあるので、floatフィールドに入るnullを追加しています。 –

+0

申し訳ありませんが、私は十分に注意深くこれを読まなかった。更新された答え。 – Nicholas

+0

これを取得しました:java.sql.SQLException:org.codehaus.groovy.runtime.NullObjectとJAVA_OBJECTの間で変換できません。 –

関連する問題