it-swarm.com.de

DB2-SQL-Fehler: SQLCODE = -204, SQLSTATE = 42704

Ich habe in DB2 eine lokale Datenbank mit dem Namen "TestDB" erstellt und dann eine Tabelle mit dem Namen "TestTable" erstellt.
Ich habe festgestellt, dass die Tabelle unter dem Schemanamen "yasmin" steht.
Ich versuche, mit JDBC eine Verbindung zur DB2-Datenbank herzustellen, aber ich habe diese Ausnahme erhalten

    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

Ich habe viele Lösungen im Internet ausprobiert. Wie Schema eingestellt, funktioniert aber leider nicht.

Dies ist der von mir verwendete JDBC-Code

 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
          }
        }
8
Yasmin

Wie @ Mark Rotteveel sagte, ist der -204-Fehler von einem fehlenden Objekt, aber es fehlt aus einem anderen Grund als dem, was er gesagt hat.

Es wurde nicht gefunden, weil Sie den Schemanamen nicht vorangestellt haben. Sie haben oben gesagt, dass es sich im Schema yasmin befindet, aber Sie verbinden sich mit db2admin, daher wird nach db2admin.TestTable gesucht.

SELECT * FROM yasmin.TestTable

sollte das sein, wonach Sie suchen. 

Der Suchpfad für Schemas ist standardmäßig der Name des aktuell verbindenden Benutzers. Sie können sehen, was es verwendet

SELECT CURRENT SCHEMA FROM SYSIBM.SYSDUMMY1

Wenn Sie ihn ändern möchten, können Sie den Suchpfad mit dem Befehl SET SCHEMA ändern. In der Regel ist es jedoch einfacher, den Schemanamen in Ihre Abfrage aufzunehmen.

11
bhamby

Der Fehler SQLERROR -204, SQLSTATE 42704 ist ein fehlender/unbekannter Objektname und wird höchstwahrscheinlich durch ein fehlendes Leerzeichen in

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

Welches sollte sein:

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

Das Problem war, dass die in db2 erstellte Tabelle den Schemanamen "yasmin" hat. 
Ich habe Benutzername und Passwort "db2admin/db2admin" in JDBC-Verbindung verwendet
sucht nach der Tabelle in diesem Schema "db2admin"
Ich muss also das Schema auf "yasmin" setzen. 
Ich fügte die folgenden Codezeilen hinzu, nachdem die Verbindung erstellt wurde

            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();

            }

und gewähren Sie db2admin alle Privilegien für diese Tabelle in db2

1 Rechtsklick auf die Tabelle, wählen Sie Privilegien
2-Klicken Sie auf die Schaltfläche "Benutzer hinzufügen"
3 - Dann geben Sie den Benutzernamen "db2admin" ein und klicken Sie auf die Schaltfläche "Übernehmen"
4 Wählen Sie dann den Benutzer aus, den Sie gerade hinzufügen, und klicken Sie auf die Schaltfläche "Alle hinzufügen"

Jetzt kann er die Tabelle sehen.

Vielen Dank @Mark Rotteveel und @bhamby für Ihre Hilfe.

2
Yasmin

Wenn Sie in Spring mit dem Ruhezustand eine Verbindung herstellen, verwenden Sie Folgendes in der Eigenschaftszeile

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

Eine andere Möglichkeit ist, einfach ein ALIAS zu erstellen, wie folgt:

CREATE ALIAS USER1.YOURTABLE FOR TABLE USER2.YOURTABLE;
0
Thang Vinh Tran