代码之家  ›  专栏  ›  技术社区  ›  Tomislav Nakic-Alfirevic

为什么使用一个准备好的语句会以null失败,而以GStrings成功?

  •  1
  • Tomislav Nakic-Alfirevic  · 技术社区  · 14 年前

    这是在尝试使用prepared语句和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> 
    

    现在,我了解到在使用准备好的语句插入空值时存在问题(如文档所述)。 here here

    我想了解的是:

    1) 我发现很难相信在准备好的语句中插入null是正确的 不可能的 ,那么为什么有时会引起问题呢?不太完美的JDBC驱动程序、数据库引擎?

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

    2 回复  |  直到 8 年前
        1
  •  1
  •   Bryan Pendleton    14 年前

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

    如果看不到实际的例外情况,很难帮助你,但我敢猜你看到了 https://issues.apache.org/jira/browse/DERBY-1938

        2
  •  0
  •   Aaron Saunders    14 年前

    ${val[0]} 会回来的 null 如果数组元素为空。

    如果在问题中插入的代码是正确的,则某些元素没有 无效的 值。。。这只是猜测