java jdbc 无效的列名_关于java:JDBC PreparedStatement,列名中带有“?”

本文探讨了在使用JDBC从Access数据库获取数据时,遇到带有'?'特殊字符列名的问题。作者发现UCanAccessJDBC驱动能处理此类问题,并提供了使用PreparedStatement的实例。尝试了多种解决方案,如转义字符和引号,但AccessODBC存在兼容性问题。最后,给出了使用UCanAccess的正确代码示例。
摘要由CSDN通过智能技术生成

我正在使用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准备语句的字符串中的圆括号

不,它不起作用。 问题不在于查询,而在于准备好的陈述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值