Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java DB2SQL错误:SQLCODE=-204,SQLSTATE=42704_Java_Jdbc_Db2 - Fatal编程技术网

Java DB2SQL错误:SQLCODE=-204,SQLSTATE=42704

Java DB2SQL错误:SQLCODE=-204,SQLSTATE=42704,java,jdbc,db2,Java,Jdbc,Db2,我在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=DB2ADM

我在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
我在互联网上尝试了许多解决方案,比如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
          }
        }
该错误是缺少/未知的objectname,很可能是由以下内容中缺少空格引起的:

rs = stmt.executeQuery("select *from TestTable");
应该是:

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

正如@Mark Rotteveel所说的,
-204
错误来自一个丢失的对象,但它丢失的原因不是他所说的

找不到它,因为您没有使用架构名称作为前缀。您在上面说过它在模式
yasmin
中,但是您正在连接
db2admin
,所以它试图查找
db2admin.TestTable

SELECT * FROM yasmin.TestTable
应该是你要找的

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

SELECT CURRENT SCHEMA FROM SYSIBM.SYSDUMMY1

如果您想更改它,可以使用该命令更改搜索路径,但通常只需在查询中包含模式名就更容易了。

问题是我在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();

            }
并在db2中授予db2admin该表上的所有特权

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

现在他可以看到桌子了。


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

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

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

另一种方法就是创建一个别名,如下所示:

CREATE ALIAS USER1.YOURTABLE FOR TABLE USER2.YOURTABLE;

我需要你的帮助。这个问题被看了10遍,没有答案。如果问题不清楚,请告诉我应该添加哪些其他信息。很抱歉,我不知道您在谈论哪个空间?@Yasmin,那么您很可能没有名为
TestTable
的表,或者需要引用它以区分大小写。不幸的是,我以前使用过此查询,但也不起作用。我尝试使用查询将db2中的表模式设置为“db2admin”,并使用查询检查当前模式。它变了。之后,如果我浏览表模式,它的“yasmin”不变。