我正在使用JDBC连接从Access数据库中获取数据。
数据库设计不是我的控制。在数据库中有列“?”包含在他们的名字中,例如:Open?
,Paid?
等等。
当我尝试使用PreparedStatement获取数据时,它会给我一个错误。查询是:
SELECT Open? FROM tblJobList WHERE WeekEnding=?
我也尝试使用像[Open?]
这样的括号,但结果是一样的。
我收到的错误是“参数太少......”因为我只将一个参数推入PreparedStatement。
由于WeekEnding=?
,我无法使用普通语句,因为此值是时间戳,我无法使用Statement来处理它。只有准备好的声明在这里工作。
有人能告诉我如何在PreparedStatement中使用这些列名吗?
答案 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的更多信息,请参阅
答案 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;分别。