Le problème en quelques mots:Pourquoi l'utilisation d'une instruction préparée échoue-t-elle avec des valeurs NULL et réussie avec GStrings?
C'est ce qui se passe lorsque vous essayez d'insérer une ligne avec quelques colonnes nulles en utilisant une déclaration préparée et groovy.sql.Sql:
groovy:000> val
===> [123123123, 2, null, 0, 0, , null, , 1213020112511801, 1283425009158952, 1, 2, null, 0, 0, , null, , 1213020112511801, 1283425009158952]
groovy:000> destSql.execute "insert into my_table values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", val
ERROR java.sql.SQLException: Type is not supported.
at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException (Unknown Source)
at org.apache.derby.client.am.SqlException.getSQLException (Unknown Source)
at org.apache.derby.client.am.PreparedStatement.setObject (Unknown Source)
at groovysh_evaluate.run (groovysh_evaluate:3)
...
groovy:000>
-je obtenir un résultat similaire avec destSql.dataSet("my_table").add valueMap
.
C'est ce qui se passe lorsque vous essayez d'insérer la même ligne comme GString
:
groovy:000> destSql.execute "insert into my_table values (${val[0]}, ${val[1]}, ${val[2]}, ${val[3]}, ${val[4]}, ${val[5]}, ${val[6]}, ${val[7]}, ${val[8]}, ${val[9]})"
===> false
groovy:000>
Maintenant, je comprends qu'il ya des problèmes d'insérer des valeurs nulles à l'aide d'une instruction préparée (comme documenté par exemple here et here).
Ce que je voudrais comprendre est la suivante:
1) Je trouve qu'il est difficile de croire que l'insertion des déclarations préparées nulls est impossible, alors pourquoi il ne provoque parfois des problèmes? Pilotes JDBC moins que parfaits, moteurs de base de données?
2) Pourquoi l'exemple avec le GString ne fonctionne? Suivant la même logique, ne tape-t-il pas encore des informations sur les colonnes nulles, alors comment cela fonctionne-t-il?
était un excellent lien Bryan, je crois qu'il explique bien pourquoi le problème est intermittent (certaines combinaisons de pilotes, et SGBDR mode d'utilisation) et pourquoi l'aide d'une déclaration préparée ne fonctionne pas dans mon cas. –
Avez-vous une idée du fonctionnement de l'approche GStrings? J'écrémé sur la source groovy.sql.Sql et a vu qu'il tente également de créer une déclaration préparée ... après avoir passé il « objet » plutôt que des valeurs « String », je ne peux pas imaginer comment il pourrait fonctionner autrement, mais Derby on rejeter une instruction préparée avec une valeur nulle ...? –
Je suis assez sûr que, pour un certain nombre de versions, PreparedStatement.setString (N, null) a bien fonctionné à Derby, mais PreparedStatement.setObject (N, null) a échoué. C'était l'essence du problème que DERBY-1938 a résolu, je crois. Donc, peut-être, en fonction des types de données précis que votre programme Groovy utilisait, la bibliothèque Groovy SQL appelait parfois setString, et d'autres fois appelait setObject? –