【发布时间】:2010-09-23 00:18:19
【问题描述】:
有没有办法使用 PreparedStatement 执行查询(包含内置的 DB 函数)?
示例: 插入 foo (location) 值 (pointfromtext('12.56666 13.67777',4130)) 这里的 pointfromtext 是一个内置函数。
【问题讨论】:
有没有办法使用 PreparedStatement 执行查询(包含内置的 DB 函数)?
示例: 插入 foo (location) 值 (pointfromtext('12.56666 13.67777',4130)) 这里的 pointfromtext 是一个内置函数。
【问题讨论】:
据我所见,pointfromtext 函数的第一个参数是一个字符串,第二个参数是一个数字。因此,请尝试以下操作:
PreparedStatement preparedStatement = getConnection().prepareStatement("insert into map_address (location) values(pointfromtext('POINT(' || ? || ' ' || ? || ')',4130))");
preparedStatement.setString(1, "12.56565665");
preparedStatement.setString(2, "12.57565757");
preparedStatement.executeUpdate();
【讨论】:
也许您发现了 Postgresql JDBC 驱动程序的问题,而不是 JDBC 本身的问题。通常,您想要实现的目标与 JDBC 一起使用。
【讨论】:
问号没有被正确评估,因为它们位于单引号之间。删除它们,它应该可以工作,
【讨论】:
您是否尝试不在preparedStatement 中设置双精度数?只是为了测试,你应该尝试直接在字符串中插入这个参数,比如:
String sql = "insert into map_address (location) values(pointfromtext('POINT(" + "12.56565665" + " " + "12.57565757" + ")',4130))"
PreparedStatement preparedStatement = getConnection().prepareStatement(sql);
然后尝试执行更新。
【讨论】:
您是否在此代码之后添加了 connection.commit()?
代码应该是:
PreparedStatement bar = connection.prepareStatement("insert into foo (location) values (pointfromtext('? ?',4130)))");
bar.setDouble(1, 13.67777);
bar.setDouble(2, 13.67777);
bar.executeUpdate();
connection.commit();
【讨论】:
PreparedStatement 对象的范围恰好是执行查询。如果查询包含内置的 DB 函数是可以的,如果相同的查询在 PreparedStatement 之外工作,一切都应该工作。
正如 Thilo 所说,通过 SQL 命令行或您通常使用的 SQL 图形工具测试您的查询。
【讨论】:
当然,应该可以。
如果不是,您的数据库系统是什么,您可以从 SQL 命令行运行完全相同的命令吗?
【讨论】: