2013-05-08 89 views
1

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

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

SELECT Open? FROM tblJobList WHERE WeekEnding=? 

我还试图用括号像[Open?],但结果是一样的。

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

由于WeekEnding=?的原因,我无法使用正常语句,因为此值是Timestamp,我无法使用Statement处理它。只有准备好的声明才适用

任何人都可以告诉我如何在PreparedStatement中使用这些列名称?

+0

不确定,但是您是否尝试将'?'本身作为第一个参数,将'WeekEnding'作为第二个参数? – SudoRahul 2013-05-08 03:01:54

+0

不,我没有。让我试试 – 2013-05-08 03:22:58

+0

它创建了一个更多的错误。早些时候它是说它的短暂的1参数现在它说2短参数 – 2013-05-08 03:27:17

回答

1

使用“字符

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

测试这对甲骨文,似乎与MSSQLSERVER工作

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

+0

它不会给出错误,但不返回结果正确返回列名称,而不是值 – 2013-05-08 03:24:09

+0

我的错误。里面的引号变成了文字。 – BevynQ 2013-05-08 04:05:38

+0

尝试引用代替“。编辑响应。 – BevynQ 2013-05-08 21:21:28

0

我不知道,但你可以尝试//逃脱special meaning of ?和使用它作为正常字符。如:

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

你可以得到类似的东西在这里你的问题: Round bracket in string with JDBC prepared statement

+0

不,它不工作。问题不在于查询,而在于准备好陈述。 – 2013-05-08 12:38:24

0

在MSSQL转义引号用双引号完成,所以“”或“”会产生一个逃脱“分别”。

1

只是为了更新这个电流技术:

虽然JDBC-ODBC桥和访问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的更多信息,请参阅

Manipulating an Access database from Java without ODBC