DB2 SQL 错误:SQLCODE=-204,SQLSTATE=42704

Posted

技术标签:

【中文标题】DB2 SQL 错误:SQLCODE=-204,SQLSTATE=42704【英文标题】:DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704 【发布时间】:2014-01-22 01:07:08 【问题描述】:

我在 DB2 中创建了名为“TestDB”的本地数据库,然后创建了名为“TestTable”的表。 我发现该表放在模式名称下是“yasmin”。 我正在尝试使用JDBC 连接到DB2 数据库,但我遇到了这个异常

    R SQLException information
[1/4/14 11:32:59:289 EST] 0000004d SystemErr     R Error msg: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=DB2ADMIN.TESTTABLE, DRIVER=3.61.86
[1/4/14 11:32:59:290 EST] 0000004d SystemErr     R SQLSTATE: 42704
[1/4/14 11:32:59:290 EST] 0000004d SystemErr     R Error code: -204
[1/4/14 11:32:59:290 EST] 0000004d SystemErr     R com.ibm.db2.jcc.am.SqlSyntaxErrorException: DB2 SQL Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=DB2ADMIN.TESTTABLE, DRIVER=3.61.86

我在互联网上尝试了很多解决方案 Like set schema 但不幸的是不起作用。

这是我使用的 JDBC 代码

 String urlPrefix = "jdbc:db2:";
        String url;
        String user;
        String password;
        String empNo;                                                              
        Connection con;
        Statement stmt;
        ResultSet rs;

        url = urlPrefix + "//127.0.0.1:50000/TestDB";
        user = "db2admin";
        password = "db2admin";
        try 
                                                                                
          // Load the driver
          Class.forName("com.ibm.db2.jcc.DB2Driver");                              
          System.out.println("**** Loaded the JDBC driver");

          // Create the connection using the IBM Data Server Driver for JDBC and SQLJ
          con = DriverManager.getConnection (url, user, password);                 
          // Commit changes manually

          con.setAutoCommit(false);
          System.out.println("**** Created a JDBC connection to the data source");
          stmt = con.createStatement();   con.createStatement();                                         
          System.out.println("**** Created JDBC Statement object");
          // Execute a query and generate a ResultSet instance

          rs = stmt.executeQuery("select *from TestTable");                   
          System.out.println("**** Created JDBC ResultSet object");
        

        catch (ClassNotFoundException e)
        
          System.err.println("Could not load JDBC driver");
          System.out.println("Exception: " + e);
          e.printStackTrace();
        

        catch(SQLException ex)                                                      
        
          System.err.println("SQLException information");
          while(ex!=null) 
            System.err.println ("Error msg: " + ex.getMessage());
            System.err.println ("SQLSTATE: " + ex.getSQLState());
            System.err.println ("Error code: " + ex.getErrorCode());
            ex.printStackTrace();
            ex = ex.getNextException(); // For drivers that support chained exceptions
          
        

【问题讨论】:

请您帮忙。该问题被查看了 10 次,但没有答案。如果问题不明确,请告诉我应该添加哪些附加信息。 【参考方案1】:

错误SQLERROR -204, SQLSTATE 42704 是缺少/未知的对象名,很可能是由于以下位置缺少空格引起的:

rs = stmt.executeQuery("select *from TestTable");

应该是:

rs = stmt.executeQuery("select * from TestTable");

【讨论】:

对不起,不知道你说的是哪个空间? @Yasmin 那么您很可能没有名为TestTable 的表,或者需要将其引用以区分大小写。【参考方案2】:

正如@Mark Rotteveel 所说,-204 错误来自丢失的对象,但由于他所说的其他原因而丢失。

没有找到它,因为您没有在它前面加上架构名称。您在上面说过它在架构yasmin 中,但您正在与db2admin 连接,因此它正在尝试寻找db2admin.TestTable

SELECT * FROM yasmin.TestTable

应该是你要找的。

默认情况下,模式的搜索路径是当前连接用户的名称。你可以看到它在使用什么

SELECT CURRENT SCHEMA FROM SYSIBM.SYSDUMMY1

如果要更改它,可以使用SET SCHEMA 命令更改搜索路径,但通常在查询中包含架构名称会更容易。

【讨论】:

不幸的是,我之前使用过这个查询,但也不起作用。我尝试使用查询将 db2 中的表模式设置为“db2admin”,并使用查询检查当前模式。它改变了。之后,如果我浏览表模式,其相同的“yasmin”不会改变。【参考方案3】:

问题是我在 db2 中创建的表的模式名称为 "yasmin" 我在 JDBC 连接中使用了用户名和密码 "db2admin/db2admin" 因此它在此模式“db2admin”中搜索表 所以我需要将架构设置为"yasmin" 所以我在创建后添加了以下代码行 连接

            String schemaName="yasmin";
            if (schemaName != null && schemaName.length() != 0) 

            try 
                statement = connection.createStatement();
                statement.executeUpdate("set current sqlid = " + schemaName);
                System.out.println("The schema is set successfully.");
             catch (SQLException exception) 
                exception.printStackTrace();

            

并授予 db2admin db2 中此表的所有特权

1-右键点击表格选择权限 2-单击“添加用户”按钮 3-然后输入用户名“db2admin”并单击“应用”按钮 4-然后选择您刚刚添加的用户并单击“gtant all”按钮

现在他可以看到桌子了。

非常感谢@Mark Rotteveel 和@bhamby 的帮助。

【讨论】:

【参考方案4】:

如果您在 Spring 中使用 Hibernate 进行连接,请在属性行中使用以下内容

<property name="url" value="jdbc:db2://<ip>:<port>/<database>:currentSchema=<currentSchema>;" />

【讨论】:

这个对我有用【参考方案5】:

其他方式就是创建一个别名,像这样:

CREATE ALIAS USER1.YOURTABLE FOR TABLE USER2.YOURTABLE;

【讨论】:

以上是关于DB2 SQL 错误:SQLCODE=-204,SQLSTATE=42704的主要内容,如果未能解决你的问题,请参考以下文章

为什么我在执行以下查询时遇到错误SQLCODE = -204,SQLSTATE = 42704,DRIVER = 4.18.60

websphere容器启动jdbc连接异常,db2报Error: SQLCODE=-204, SQLSTATE=42704, SQLERRMC=MARKET.ALL_SEQUENCES, DRIVER

SQL 查询的准备语句,错误 DB2 SQL 错误:SQLCODE=-206,SQLSTATE=42703

db2 错误 sqlcode:-1224

DB2 SQL 错误(SQLCODE:-964,SQLSTATE:57011)处理方法

原因:com.ibm.db2.jcc.am.SqlSyntaxErrorException:DB2 SQL 错误:SQLCODE=-440,SQLSTATE=42884