有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带“”的java JDBC PreparedStatement在列名中

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

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

SELECT Open? FROM tblJobList WHERE WeekEnding=?

我还尝试使用[Open?]之类的括号,但结果是一样的

我收到的错误是“参数太少…”因为我只在PreparedStatement中输入一个参数

我不能使用普通语句,因为WeekEnding=?这个值是一个时间戳,我无法处理它。只有事先准备好的声明在这里有效

有人能告诉我如何在PreparedStatement中使用这种列名吗


共 (4) 个答案

  1. # 1 楼答案

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

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

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

  2. # 2 楼答案

    MSSQL中的转义引号是由双引号完成的,因此一个“”或一个“”将分别产生一个转义的“”和“”

  3. # 3 楼答案

    为了更新当前的技术:

    虽然JDBC-ODBC网桥和Access ODBC无法处理列名中包含问号的PreparedStatement,但UCanAccessJDBC驱动程序可以很好地处理它,如下代码所示:

    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