Visualizzazione dei risultati da 1 a 10 su 10

Discussione: Errore Odbc ResultSet

  1. #1

    Errore Odbc ResultSet

    Buongiorno,

    tramite driver ODBC effettuo alcune select su un database Sql Server.

    Effettuo la select einizio a fare la get dei campi. In probleam si presenta qua, ogni tre campi sono contrestto ad effettuare una nuova select altrimenti mi restituisce errore.

    Codice Funzionante:
    codice:
     
    String query = "SELECT * FROM tabella WHERE numero_ordine = '" + numeroOrdine + "'";
    ResultSet res = cmd.executeQuery(query);
    
    
    res.next();
    
        codice.setText(res.getString("codice"));
        numero.setText(res.getString("numero"));
        desc1.setText(res.getString("desc1"));
                    
    res.close(); 
    res = cmd.executeQuery(query);
    res.next();
        riferimento.setText(res.getString("riferimento"));
        email.setText(res.getString("email"));
    res.close();
    Quello che invece volevo fare io era il seguente
    codice:
     
    String query = "SELECT * FROM tabella WHERE numero_ordine = '" + numeroOrdine + "'";
    ResultSet res = cmd.executeQuery(query);
    
    
    res.next();
         codice.setText(res.getString("codice"));
         numero.setText(res.getString("numero"));
         desc1.setText(res.getString("desc1"));
          riferimento.setText(res.getString("riferimento"));
          email.setText(res.getString("email"));
    res.close();
    SE però uso la seconda parte mi resituisce il seguente errore:

    [Microsoft][ODBC SQL Server Driver]Indice del descrittore non valido.
    at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc .java:6964)
    at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java :7121)
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.j ava:3914)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Jdbc OdbcResultSet.java:5697)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbc ResultSet.java:353)
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbc ResultSet.java:410)


    Ho provato anche a utilizzare la libreria sqljdbc41.jar pe rpoter effettuare il collegamento, ma il problema rimane sempre.

    Mi sapreste dare qualche indicazione?

    Ringrazio Anticipatamente!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Non conosco il SQL Server Microsoft ma con una veloce ricerca, ad esempio qui parlano della necessità di fare le get dei campi in un ordine abbastanza ben preciso, che non può essere arbitrario, per motivi del driver JDBC.

    Di più non saprei dirti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Come dice andbin devi scrivere così la tua query:
    codice:
    String query = "SELECT codice, numero, desc1, riferimento, email FROM tabella WHERE numero_ordine = '" + numeroOrdine + "'";
    ResultSet res = cmd.executeQuery(query);
    
    
    
    
    while(res.next()){
         codice.setText(res.getString("codice"));
         numero.setText(res.getString("numero"));
         desc1.setText(res.getString("desc1"));
          riferimento.setText(res.getString("riferimento"));
          email.setText(res.getString("email"));
    }
    res.close();
    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  4. #4
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    Come dice andbin devi scrivere così la tua query:
    codice:
    String query = "SELECT codice, numero, desc1, riferimento, email FROM tabella WHERE numero_ordine = '" + numeroOrdine + "'";
    ResultSet res = cmd.executeQuery(query);
    
    
    
    
    while(res.next()){
         codice.setText(res.getString("codice"));
         numero.setText(res.getString("numero"));
         desc1.setText(res.getString("desc1"));
          riferimento.setText(res.getString("riferimento"));
          email.setText(res.getString("email"));
    }
    res.close();
    Ciao.
    Ho provato anche cosi, ma non cambia il problema è identico.
    L'unica cosa che non ho provato è l'ordine dei campi effettivamente.
    Provo subito!

  5. #5
    l'ordine non c'entra se usi questa stringa di interrogazione.
    codice:
    String query = "SELECT codice, numero, desc1, riferimento, email FROM tabella WHERE numero_ordine = '" + numeroOrdine + "'";
    Sei sicuro che tutti questi campi esistano nella tua tabella?

    Inoltre ti consiglio di salvare i campi in variabili temporanee e poi a posteriori aggiornare i JTextField.

    ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  6. #6
    Si i campi esistono tutti.

    Sembra essere proprio l'ordine dei campi....
    Bah non ci avevo pensato... non me lo sarei aspettato.

    Quando faccio res.getString() li ho ordinati come nella vista e non mi da più problemi, se inverto un campo si blocca.

    Mi rimane comunque il dubbio però sembra funzionare!

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    La domanda sorge spontanea: perchè stai passando per ODBC e non usi, invece, l'apposito driver JDBC che puoi scaricare direttamente dal sito di Microsoft? Ti risolveresti tantissimi problemi, uno fra tutti quello relativo al fatto che il bridge ODBC-JDBC dalla versione 8 di Java è stato rimosso (e quel bridge, effettivamente, di problemi ne ha diversi, non solo con SQL Server, ma anche con DB2, almeno).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Quote Originariamente inviata da LeleFT Visualizza il messaggio
    La domanda sorge spontanea: perchè stai passando per ODBC e non usi, invece, l'apposito driver JDBC che puoi scaricare direttamente dal sito di Microsoft? Ti risolveresti tantissimi problemi, uno fra tutti quello relativo al fatto che il bridge ODBC-JDBC dalla versione 8 di Java è stato rimosso (e quel bridge, effettivamente, di problemi ne ha diversi, non solo con SQL Server, ma anche con DB2, almeno).


    Ciao.
    Ciao!

    Sto utilizzando quello adesso, ma il problema rimaneva sempre.
    Non so se sbagliavo io qualche cosa, però stesso codice ma con i campi ordinati funziona.

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Piuttosto strano.
    Io SQL Server lo uso dalla mattina alla sera, sia tramite JDBC diretto, che tramite JPA, da applicazioni desktop e da WebApplications e problemi di questo tipo non ne ho mai avuti nessuno.

    Giusto per curiosità ho scritto al volo una piccola stupida applicazione inutile che pesca i primi 20 record da una tabella con 27 campi e per ciascun record letto stampa a video 10 campi estratti assolutamente in modo casuale.
    L'ho eseguito senza nessun problema:


    codice:
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.util.Random;
    
    public class TestDBCampi {
    
        public static void main(String[] args) {
            String[] campi = {"Agente", "IDP", "Codice", "RagioneSociale", "Indirizzo",
                              "CAP", "Città", "Prov", "Stato", "PartitaIVA", "CodiceFiscale",
                              "Telefono", "FAX", "Email", "CodSC", "CodPG", "CodCat", "CodPor",
                              "FlEnte", "IPA", "IvaS", "IBAN", "OraAM", "OraCM", "OraAP", "OraCP", "CodPot"
            };
            
            Random rand = new Random();
            
            Database db = new Database("sqlServer.xml");
            if ( db.connetti() ) {
                
                PreparedStatement pstmt = null;
                ResultSet rs = null;
                try {
                    pstmt = db.getPreparedStatement("SELECT TOP 20 * FROM PA_ClientePotenziale");
                    
                    rs = pstmt.executeQuery();
                    
                    if (rs != null) {
                        while ( rs.next() ) {
                            // Stampo 10 campi a caso del record
                            for(int i=0; i<10; i++) {
                                int numCampo = rand.nextInt( 27 );
                                System.out.println(campi[numCampo] + ": " + rs.getString(numCampo + 1));
                            }
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (rs != null) {
                        try { rs.close(); } catch (Exception e) { }
                    }
                    if (pstmt != null) {
                        try { pstmt.close(); } catch (Exception e) { }
                    }
                }
                
                db.disconnetti();
            }
        }
    }

    La classe "Database" è una mia classe che si occupa di fare la connessione a partire da un file di configurazione in XML e fornire quei pochi metodi per gestirla (getPreparedStatement(), connetti(), disconnetti() ).


    Ciao.
    Ultima modifica di LeleFT; 14-05-2015 a 14:20
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2010
    Messaggi
    20
    ciao a tutti,
    non sò dove sia il problema, cmq giusto test:

    codice:
    private void db()
        {
            try
            {
                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                Connection con =
                DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;;user=xxx;password=xxx");
                //con.createStatement();
                //ResultSet q1=con.createStatement().executeQuery("sp_databases");
                ResultSet rs=con.createStatement().executeQuery("sp_databases");
                while(rs.next())
                {
                    System.out.println(rs.getString("DATABASE_SIZE"));
                }
                System.out.println("ok! ");
            }
            catch(Exception e)
            {
                System.out.println(e.getMessage());
            }
        }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.