繁体   English   中英

JDBC-如果列名是关键字,如何从ResultSet中“ getString”?

[英]JDBC - How do I 'getString' from a ResultSet if the column's name is a keyword?

每当我尝试在Access数据库(.mdb)中检索名为“ Comment”的列的值时,都会出现以下错误。

Offence: copying data
ERROR - Offence TABLE
java.sql.SQLSyntaxErrorException: ORA-00904: "Comment": invalid identifier

这是我的代码:

public static void copyOffenceTable()
    {
        PreparedStatement updateOffenceTypeTable  = null;

        //Set up "insert" string
        String insertString = "INSERT INTO Offence "
                + "(id, OffenceName, status, OffenceSuburb, OffenceDate, FirstName, LastName, \"Comment\", OffenderAddress, OffenderSuburb, OffenderPostcode, OffenderState, OffenderEmail, LicenceNumber, DOB, StaffIssuerID, OffenderPhone) "                                          
                + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

        String MSAccessQuery = "SELECT * FROM Offence";

        try
        {
            //create a query object for MSAccess
            dbmsMSAccess.DBMSStatement = dbmsMSAccess.DBMSConnection.createStatement();
            //Query the MSAccess database for extraction
            dbmsMSAccess.DBMSResultSet = dbmsMSAccess.DBMSStatement.executeQuery(MSAccessQuery);
            //make query object for Oracle
            dbmsOracle.DBMSOracleStatement = dbmsOracle.DBMSOracleConnection.createStatement();

            dbmsOracle.DBMSOracleStatement.execute("TRUNCATE TABLE Offence");

            dbmsOracle.DBMSOracleConnection.setAutoCommit(false);

            updateOffenceTypeTable = dbmsOracle.DBMSOracleConnection.prepareStatement(insertString);

            System.out.println("Offence: copying data");

            while(dbmsMSAccess.DBMSResultSet.next())
            {
                updateOffenceTypeTable.setInt(1, dbmsMSAccess.DBMSResultSet.getInt("id") );
                updateOffenceTypeTable.setString(2, dbmsMSAccess.DBMSResultSet.getString("OffenceName") );
                updateOffenceTypeTable.setString(3, dbmsMSAccess.DBMSResultSet.getString("Status") );
                updateOffenceTypeTable.setString(4, dbmsMSAccess.DBMSResultSet.getString("OffenceSuburb") );
                updateOffenceTypeTable.setDate(5, dbmsMSAccess.DBMSResultSet.getDate("OffenceDate") );
                updateOffenceTypeTable.setString(6, dbmsMSAccess.DBMSResultSet.getString("FirstName") );
                updateOffenceTypeTable.setString(7, dbmsMSAccess.DBMSResultSet.getString("LastName") );
                updateOffenceTypeTable.setString(8, dbmsMSAccess.DBMSResultSet.getString("COMMENT") );
                updateOffenceTypeTable.setString(9, dbmsMSAccess.DBMSResultSet.getString("OffenderAddress") );
                updateOffenceTypeTable.setString(10, dbmsMSAccess.DBMSResultSet.getString("OffenderSuburb") );
                updateOffenceTypeTable.setInt(11, dbmsMSAccess.DBMSResultSet.getInt("OffenderPostcode") );
                updateOffenceTypeTable.setString(12, dbmsMSAccess.DBMSResultSet.getString("OffenderState") );
                updateOffenceTypeTable.setString(13, dbmsMSAccess.DBMSResultSet.getString("OffenderEmail") );
                updateOffenceTypeTable.setInt(14, dbmsMSAccess.DBMSResultSet.getInt("LicenceNumber") );
                updateOffenceTypeTable.setDate(15, dbmsMSAccess.DBMSResultSet.getDate("DOB") );
                updateOffenceTypeTable.setInt(16, dbmsMSAccess.DBMSResultSet.getInt("StaffIssuerID") );
                updateOffenceTypeTable.setInt(17, dbmsMSAccess.DBMSResultSet.getInt("OffenderPhone") );

                updateOffenceTypeTable.executeUpdate();
            }

            System.out.println("Offence: ACCESS DATA COPIED TO ORACLE\n");
        }
        catch(Exception X)
        {
            System.out.println("ERROR - Offence TABLE");
            X.printStackTrace();
        } 
    }

有没有办法通过jdbc引用也是关键字的列?

我尝试过在撇号和引号之间添加“注释”。

有什么建议么?

编辑:值被放置到具有相同表的oracle数据库中。

尝试使用一些括号:

 String insertString = "INSERT INTO Offence "
                + "(id, OffenceName, status, OffenceSuburb, OffenceDate, FirstName, LastName, [Comment], OffenderAddress, OffenderSuburb, OffenderPostcode, OffenderState, OffenderEmail, LicenceNumber, DOB, StaffIssuerID, OffenderPhone) "                                          
                + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

编辑:对于oracle,如果我们信任此主题: https : //stackoverflow.com/a/1162391/291541

解决方案是双引号,但您必须注意这种情况。 请检查您的栏是否为注释而不是示例注释。

请删除查询中的双引号

   String insertString = "INSERT INTO Offence "
                + "(id, OffenceName, status, OffenceSuburb, OffenceDate, FirstName, LastName, Comment, OffenderAddress, OffenderSuburb, OffenderPostcode, OffenderState, OffenderEmail, LicenceNumber, DOB, StaffIssuerID, OffenderPhone) "                                          
                + "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

无法在查询级别重命名列? 就像select comment as my_comment from blabla这样的select comment as my_comment from blabla

您也可以使用其索引到达该字段

使用反引号(或反勾)转义违规列的名称,例如`\\"Comment\\"`

String insertString = "INSERT INTO Offence "
+ "(id, OffenceName, status, OffenceSuburb, OffenceDate, FirstName, LastName, `\"Comment\"`, OffenderAddress, OffenderSuburb, OffenderPostcode, OffenderState, OffenderEmail, LicenceNumber, DOB, StaffIssuerID, OffenderPhone) "                                          
+ "VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";

最后,这些方法都没有建议对我有用,但是值得一试!

我最终不得不进入数据库并获得将注释字段更改为注释的权限。

谢谢所有张贴的人,我真的很感激!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM