【问题标题】:JDBC PreparedStatement with "?" in the column name带有“?”的 JDBC PreparedStatement在列名中
【发布时间】:2013-05-02 03:59:24
【问题描述】:

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

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

SELECT Open? FROM tblJobList WHERE WeekEnding=?

我也试过用[Open?]这样的方括号,但结果是一样的。

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

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

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

【问题讨论】:

  • 不确定,但您是否尝试将? 本身作为第一个参数并将WeekEnding 值作为第二个参数传递?
  • 不,我没有。让我试试
  • 它又产生了一个错误。早些时候它说它在 1 参数上的短,现在它在 2 参数上说短

标签: java ms-access jdbc prepared-statement


【解决方案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 的更多信息,请参阅

Manipulating an Access database from Java without ODBC

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      使用 " 字符

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

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

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

      【讨论】:

      • 它不给出错误但不返回结果正确返回列名而不是值
      • 我的错误。内引号变成文字。
      • 好建议,但不幸的是它不适用于 Access ODBC(我刚刚在 Eclipse 中对其进行了测试,当我尝试 .execute() 准备好的语句时出现“参数太少”错误)所以它出现了不要帮助@user1614217 解决他们的问题。
      • 问题不在于查询,而在于准备好的语句。
      • 我还没有找到解决方案。还在挣扎。但是以我的编码经验和知识,我可以说问题不在于 SQL 查询,而是替代了 Preparedstatments 机制?在字符串中。
      【解决方案4】:

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

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

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

      【讨论】:

      • 不,它不起作用。问题不在于查询,而在于准备好的语句。
      猜你喜欢
      • 2013-11-14
      • 1970-01-01
      • 2021-05-17
      • 2016-09-25
      • 2018-11-06
      • 2011-02-20
      • 1970-01-01
      • 2019-11-14
      • 2011-05-12
      相关资源
      最近更新 更多