带有“?”的JDBC PreparedStatement在列名称中

时间:2013-05-08 02:52:18

标签: java ms-access jdbc prepared-statement

我正在使用JDBC连接从Access数据库中获取数据。 数据库设计不是我的控制。在数据库中有列“?”包含在他们的名字中,例如:Open?Paid?等等。

当我尝试使用PreparedStatement获取数据时,它会给我一个错误。查询是:

SELECT Open? FROM tblJobList WHERE WeekEnding=?

我也尝试使用像[Open?]这样的括号,但结果是一样的。

我收到的错误是“参数太少......”因为我只将一个参数推入PreparedStatement。

由于WeekEnding=?,我无法使用普通语句,因为此值是时间戳,我无法使用Statement来处理它。只有准备好的声明在这里工作。

有人能告诉我如何在PreparedStatement中使用这些列名吗?

4 个答案:

答案 0 :(得分:1)

使用“字符

"SELECT \"Open?\" FROM tblJobList WHERE WeekEnding=?"

针对oracle进行了测试,似乎与mssqlserver一起使用

How to select a column in SQL Server with a special character in the column name?

答案 1 :(得分:1)

只是为当前技术更新此内容:

虽然JDBC-ODBC Bridge和Access ODBC无法处理包含问号的列名的PreparedStatement,但UCanAccess JDBC驱动程序处理它很好,可以通过以下代码确认:< / p>

String connectionUrl = "jdbc:ucanaccess://C:/Users/Public/UCanAccessTest.accdb";
Connection conn = DriverManager.getConnection(connectionUrl);
String sql = "SELECT ID, [Open?] FROM tblJobList WHERE WeekEnding=?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setDate(1, java.sql.Date.valueOf("2016-01-01"));
ResultSet rs = ps.executeQuery();
while (rs.next()) {
    System.out.printf("%d: %s%n", rs.getInt("ID"), rs.getBoolean("Open?"));
}
conn.close();

有关UCanAccess的更多信息,请参阅

Manipulating an Access database from Java without ODBC

答案 2 :(得分:0)

我不确定,但您可以尝试//来逃避special meaning of ?并将其用作普通角色。喜欢:

"SELECT Open//? FROM tblJobList WHERE WeekEnding=?"

您可以在此处获得与您的问题类似的内容: Round bracket in string with JDBC prepared statement

答案 3 :(得分:0)

MSSQL中的转义引用是通过双引号完成的,所以&#39;&#39;或者&#34;&#34;会产生一个逃脱的&#39;和&#34;分别。