为什么使用预准备语句会因空值而失败并成功使用G字符串?

时间:2010-09-25 09:24:45

标签: sql groovy null derby

问题简而言之:

当尝试使用预准备语句和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> 

我使用destSql.dataSet("my_table").add valueMap获得了类似的结果。

尝试插入与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> 

现在,我了解使用预准备语句插入空值时存在问题(例如herehere)。

我想了解的内容如下:

1)我发现很难相信用准备好的语句插入空值不可能,那为什么它有时会导致问题呢?不完美的JDBC驱动程序,数据库引擎?

2)为什么GString的例子有效?遵循相同的逻辑,即使关于空列,它仍然不会输入信息,那么它是如何工作的呢?

2 个答案:

答案 0 :(得分:1)

如果包含您遇到的实际异常,您将获得更好的回复。您可以在Derby服务器的derby.log文件中找到该异常,或者您也可以修改您的应用程序以打印整个异常链,而不仅仅是客户端最外层的异常:http://wiki.apache.org/db-derby/UnwindExceptionChain

没有看到实际的例外情况,很难帮助你,但我猜想你会看到https://issues.apache.org/jira/browse/DERBY-1938

答案 1 :(得分:0)

gstring示例正在运行,因为如果数组元素为null,代码${val[0]}将返回null

如果你在问题中插入的代码是正确的,那么你们中的一些元素没有null值...这只是一个猜测