我正在使用JDBC连接从Access数据库中获取数据。
数据库设计不是我的控制。 数据库中有带有"?"的列。 包括在其名称中,例如:Open?,Paid?等。
当我尝试使用PreparedStatement获取数据时,它给我一个错误。 查询是:
SELECT Open? FROM tblJobList WHERE WeekEnding=?
我也尝试使用像[Open?]这样的括号,但是结果是相同的。
我收到的错误是"参数太少...",因为我仅将一个参数推入PreparedStatement。
由于WeekEnding=?,我无法使用普通语句,因为此值为时间戳,因此无法使用Statement处理它。 只有准备好的语句在这里起作用。
谁能告诉我如何在PreparedStatement中使用这类列名?
不确定,但是您是否尝试将?本身作为第一个参数,将WeekEnding值作为第二个参数?
不,我没有。 让我尝试
它又产生了一个错误。 之前是说它在1参数上做空,现在说在2参数上做空。
只是为了针对当前技术进行更新:
虽然JDBC-ODBC Bridge和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数据库
使用"字符
"SELECT "Open?" FROM tblJobList WHERE WeekEnding=?"
针对oracle测试了这一点,似乎可以与mssqlserver一起使用
如何在SQL Server中选择列名称中包含特殊字符的列?
它不会给出错误,但是不会正确地返回结果,它返回Column Name而不是value
我的错。 内引号变成文字。
尝试用引号代替"。
很好的建议,但不幸的是,它不适用于Access ODBC(我只是在Eclipse中对其进行了测试,并在尝试.execute()准备好的语句时收到"参数太少"的错误),因此似乎对@ user1614217的问题没有帮助 。
问题不在于查询,而在于准备好的陈述。
我还没有找到解决方案。 仍在挣扎。 但是凭我的编码经验和知识,我可以说出问题是不是SQL查询取代了它的Preparedstatments机制? 在字符串中。
您是否尝试过正常陈述?
MSSQL中的转义引号是通过双引号完成的,因此""或""将分别产生一个转义的""和""。
我不确定,但是您可以尝试//转义special meaning of ?并将其用作普通字符。喜欢:
"SELECT Open//? FROM tblJobList WHERE WeekEnding=?"
您可以在此处获得与您的问题类似的内容:
带有JDBC准备语句的字符串中的圆括号
不,它不起作用。 问题不在于查询,而在于准备好的陈述。