web-dev-qa-db-fra.com

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

J'ai créé une base de données locale dans DB2 appelée "TestDB", puis une table appelée "TestTable".
J'ai trouvé que la table est placée sous le nom de schéma est "yasmin".
J'essaie de me connecter à la base de données DB2 en utilisant JDBC mais j'ai cette exception

    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

J'ai essayé de nombreuses solutions sur Internet, comme le schéma d'ensemble, mais malheureusement, cela ne fonctionne pas.

C'est le code JDBC que j'ai utilisé

 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

Comme @Mark Rotteveel l'a dit, l'erreur -204 provient d'un objet manquant, mais il manque pour une raison autre que ce qu'il a dit.

Il n'est pas trouvé car vous ne l'avez pas préfixé avec le nom du schéma. Vous avez dit ci-dessus qu'il est dans le schéma yasmin, mais que vous vous connectez avec db2admin, il essaie donc de rechercher db2admin.TestTable.

SELECT * FROM yasmin.TestTable

devrait être ce que vous cherchez. 

Par défaut, le chemin de recherche des schémas est le nom de l'utilisateur en cours de connexion. Vous pouvez voir ce qu'il utilise

SELECT CURRENT SCHEMA FROM SYSIBM.SYSDUMMY1

Si vous souhaitez le modifier, vous pouvez utiliser la commande SET SCHEMA pour modifier le chemin de recherche, mais il est généralement plus simple d'inclure le nom du schéma dans votre requête.

11
bhamby

L'erreur SQLERROR -204, SQLSTATE 42704 est un nom d'objet manquant/inconnu, probablement causé par un espace manquant dans:

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

Ce qui devrait être:

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

Le problème était que la table que j'ai créée dans db2 a le nom de schéma "yasmin" 
J'ai utilisé le nom d'utilisateur et le mot de passe "db2admin/db2admin" Dans une connexion JDBC
il recherche donc la table dans ce schéma "db2admin"
Je dois donc définir le schéma sur "yasmin" 
J'ai donc ajouté les lignes de code suivantes après avoir créé la connexion

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

            }

et accorder à db2admin tous les privilèges sur cette table dans db2

1-clic droit sur la table choisir privilèges
2-Cliquez sur le bouton "Ajouter un utilisateur"
3-puis écrivez le nom d'utilisateur "db2admin" et cliquez sur le bouton "appliquer"
4-Sélectionnez ensuite l’utilisateur que vous venez d’ajouter et cliquez sur le bouton "gagner tout"

Maintenant, il peut voir la table.

Merci beaucoup @ Mark Rotteveel et @bhamby pour votre aide.

2
Yasmin

Si vous vous connectez au printemps en utilisant Hibernate, utilisez la ligne suivante de la propriété.

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

Une autre manière est de créer un ALIAS, aime ceci:

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