2

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

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

SELECT Open? FROM tblJobList WHERE WeekEnding=?

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

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

我不能使用普通语句,因为WeekEnding=?这个值是一个时间戳,我无法使用 Statement 来处理它。只有准备好的语句在这里有效。

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

4

4 回答 4

2

使用 " 字符

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

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

如何在 SQL Server 中选择列名中带有特殊字符的列?

于 2013-05-08T03:05:58.807 回答
1

只是为了更新当前技术:

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

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 的更多信息,请参阅

在没有 ODBC 的情况下从 Java 操作 Access 数据库

于 2016-06-09T20:46:27.067 回答
0

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

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

您可以在此处获得与您的问题类似的内容: 带有 JDBC 准备语句的字符串中的圆括号

于 2013-05-08T04:43:38.253 回答
0

MSSQL 中的转义引号是通过双引号完成的,因此 '' 或 "" 将分别产生一个转义的 ' 和 "。

于 2016-06-09T19:22:20.653 回答