【问题标题】:ActiveJDBC insert without prepared statement没有准备好的语句的 ActiveJDBC 插入
【发布时间】:2016-03-05 05:21:50
【问题描述】:

我正在尝试将 ActiveJDBC 与驱动程序不支持 Connection.prepareStatement(String, String[]) 方法的 DB 一起使用。尝试插入时出现以下异常:

org.javalite.activejdbc.DBException: java.sql.SQLFeatureNotSupportedException: [DataDirect][OpenEdge JDBC Driver]Unsupported method: Connection.prepareStatement(String, String[]), query: INSERT INTO ...
    at com.ddtek.jdbc.openedgebase.ddb9.b(Unknown Source)
    at com.ddtek.jdbc.openedgebase.ddb9.a(Unknown Source)
    at com.ddtek.jdbc.openedgebase.ddb8.b(Unknown Source)
    at com.ddtek.jdbc.openedgebase.ddb8.a(Unknown Source)
    at com.ddtek.jdbc.openedgebase.BaseConnection.prepareStatement(Unknown Source)
    at org.javalite.activejdbc.DB.execInsert(DB.java:597)
    at org.javalite.activejdbc.Model.insert(Model.java:2618)
    at org.javalite.activejdbc.Model.save(Model.java:2552)
    at org.javalite.activejdbc.Model.saveIt(Model.java:2477)
    ...

支持一些其他形式的 prepareStatement,例如prepareStatement (String)prepareStatement (String, int)

我可以做些什么来说服 ActiveJDBC 不要使用不受支持的语句?

【问题讨论】:

  • String[] 用于自动生成的密钥。您需要返回自动生成的键值吗?
  • 不,我不知道。我在代码中所做的只是m = new Model();,填充它,然后m.saveIt();,模型中没有自动生成的列。 ActiveJDBC 内部调用prepareStatement 方法here
  • 您使用的是什么数据库/驱动程序?
  • 我正在使用 OpenEdge RDBMS 及其专有驱动程序 com.ddtek.jdbc.openedge.OpenEdgeDriver,这是我必须与之交互的遗留数据库。

标签: java activejdbc


【解决方案1】:

正如您在 source 中看到的,这几乎是硬编码的。因此,在我看来,您可以请求更改 ActiveJDBC,或者继续将“有缺陷的”连接包装到自定义实现中并覆盖 prepareStatement(String, String[])

public PreparedStatement prepareStatement(String qry, String[] autoIdColumns) {
  return delegate.prepareStatement(qry);
}

Google 回复了一些关于 ConnectionWrapper 实现的想法。

【讨论】:

【解决方案2】:

请查看 ActiveJDBC 支持的数据库:http://javalite.io/activejdbc#supported-databases。每一个都经过彻底的测试。

【讨论】:

    猜你喜欢
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    相关资源
    最近更新 更多