Announcement

Collapse
No announcement yet.

warum geht das nur bei mySQL ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • warum geht das nur bei mySQL ?

    Es ist zum K.
    brauche zum Testen von Verbindungen einen universellen DataReader,
    zunächst einmal nur mit JDBCODBC (unter Win werden aus ODBC.ini
    die Einträge gelesen und zur Auswahl angeboten.

    Dann wird die Verbindung hergestellt : globale Variable myconn wird an Funktion connex
    übergeben.
    folgender Code funktioniert nur mit mySQL (???) :
    <pre>
    public static void make_connex(String myconn, String kennwt, String passwt) {
    try {
    //jEditorPane1.setText("Versuche, Verbindung zu öffnen : " + myconn);
    int wahl = JOptionPane.showConfirmDialog(null,
    "Connex","Weiter ?",JOptionPane.YES_NO_OPTION);
    if (wahl == JOptionPane.NO_OPTION)
    return;

    Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    status = 1;

    con = DriverManager.getConnection("jdbcdbc:"+myconn,kennwt,passwt);
    jEditorPane1.setText(status + " Conn : "+ myconn.trim());
    status = 2;
    DatabaseMetaData dbmd = con.getMetaData();
    status = 3;
    ResultSet meta_rs = dbmd.getTables("","","",null);
    status = 4;
    int i = 0;
    String buff = "";
    while (meta_rs.next()) {
    buff = meta_rs.getString(3);
    TabModel.add(0,buff);
    }
    jListTables.setModel(TabModel);
    jListTables.setSelectionMode(ListSelectionModel.SI NGLE_SELECTION);
    } catch (Exception e) {
    jEditorPane1.setText(status + " Connex : Fehler bei Lesen der Metadaten (Tables) von : " + myconn);
    //e.printStackTrace();
    }
    //- Ende Funktion make_connex
    }

    public static void get_data(String sqlText) {
    String colStream = "";
    int i;
    String dataStream = "";
    try {
    Statement stmt = con.createStatement();
    status = 1;
    stmt.execute(sqlText);
    status = 2;
    ResultSetMetaData rsmd = stmt.getResultSet().getMetaData();
    status = 3;
    int cnum = rsmd.getColumnCount();
    for (i = 1;i <= cnum;i++) {
    colStream += rsmd.getColumnName(i);
    colStream += " ";
    }
    status = 4;
    TextModel.add(TextModel.size(),colStream);
    status = 5;
    TextModel.add(TextModel.size(),"--------------------------");
    stmt.close();
    } catch (Exception e) {
    jEditorPane1.setText(status + " get_data : Fehler bei Lesen der Meta-Daten (Columns) für : " + sqlText);
    e.printStackTrace();
    }

    try {
    //- vor dem Datenlesen mußte der Cursor geschlossen werden
    Statement stmt = con.createStatement();
    stmt.execute(sqlText);
    ResultSet rdata = stmt.getResultSet();
    status = 6;
    while( rdata.next() ) {
    dataStream = rdata.getInt(1) + " " + rdata.getString(2);
    TextModel.add(TextModel.size(),dataStream);
    }
    status = 7;
    jListData.setModel(TextModel);
    status = 8;
    jListData.setSelectionMode(ListSelectionModel.SING LE_SELECTION);
    status = 9;
    } catch (Exception e) {
    jEditorPane1.setText(status + " Fehler bei Lesen der Daten für : " + sqlText);
    e.printStackTrace();
    }
    //- Ende Funktion get_data
    }
    </pre>

    Komisch, obwohl ich mit einem anderen Programm sämtliche Verbindungen
    soweit nutzen konnte, das Funktionsangebot auszugeben, scheitert alles
    (außer bei mySQL) schon an :
    ResultSet meta_rs = dbmd.getTables("","","",null);

    HIIILLLFFEEE !!!!

    MfG
    Wolf

  • #2
    hi wolf,
    <p>wenn du die kommentarzeichen vor dem erste "e.printStackTrace()" entfernst, bekommst du z.B. beim Zugriff auf access folgendes auf die konsole:
    <pre>
    java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]Optionales Feature wurde nicht implementiert.
    at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc .java:6031)
    at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java :6188)
    at sun.jdbc.odbc.JdbcOdbc.SQLTables(JdbcOdbc.java:484 7)
    at sun.jdbc.odbc.JdbcOdbcDatabaseMetaData.getTables(J dbcOdbcDatabaseMetaData.java:2398)
    at Rrsmeta.make_connex(Rrsmeta.java:34)
    at Rrsmeta.main(Rrsmeta.java:16)

    </pre>
    weitere fragen bezüglich access-jdbc-treiber bitte an billy!
    <p>was lernen wir daraus? orginal fehlermeldungen nie ganz wegschmeissen sondern immer erstmal auswerten.
    <p>
    gruss gerhar

    Comment


    • #3
      danke,gerhard, für Antwort !
      so sehr lange mache ich noch nicht JAVA;somit sagt mir o.g. Meldung
      nur , daß - wieder mal - irgendwas nicht vollständig installiert
      ist - ! :-( typisch Billy !

      kann ich die Ausgabe von e.printStackTrace irgendwie in ein
      Textarea oder sowas umleiten ? die Ausgabe in die DOS-Box wollte ich
      eigentlich vermeiden..

      MfG
      Wolf Fiet

      Comment


      • #4
        hallo wolf,
        <p>die db-schnittstelle jdbc ist von sun überwiegend in interfaces definiert und wird vom db hersteller als eine menge von klassen (der db-treiber) zur verfügung gestellt. die obige fehlermeldung besag also nicht, dass etwas nicht richtig installiert wurde, sondern das der db hersteller (in dem fall m$ für access) bestimmte methoden nicht realisiert hat. dieses fehlen einer bestimmten methode wird durch eine exception gemeldet. siehe auch Interface DatabaseMetaData:
        <p>
        An SQLException will be thrown if a driver does not support a meta data method. In the case of methods that return a ResultSet, either a ResultSet (which may be empty) is returned or a SQLException is thrown.
        <p>
        die fehlerinformation bekommst du als string mittels e.getMessage() vom exception-objekt.
        <p>
        den kompletten stacktrace kann man als string bekommen über:
        <pre>
        catch(Exception e) {
        e.printStackTrace(); //auf die konsole
        ByteArrayOutputStream b = new ByteArrayOutputStream();
        PrintWriter w = new PrintWriter(b, true);
        e.printStackTrace(w);
        <anyTextArea>.setText(b.toString()); //in einen textbereich
        }
        </pre>
        gerhar

        Comment


        • #5
          danke, gerhard, hat insoweit geklappt,benutze es wie folgt :
          <pre>
          ByteArrayOutputStream b = new ByteArrayOutputStream();
          PrintWriter w = new PrintWriter(b, true);
          e.printStackTrace(w);
          //<anyTextArea>.setText(b.toString()); //in einen
          textbereich
          TextModel.add(TextModel.size(),b.toString());
          jListData.setModel(TextModel);
          </pre>
          jetzt muß ich nur noch nen Zeilenumbruch hinkriegen, wäre einfach
          schöner,wenn man nicht durch die lllllaaaaaannnnnngggeeeee Zeile rollen muß und ich will ja üben,üben,üben :-))
          (macht aber Spaß) :

          da kommen nämlich in der anzeige der JList immer drei Kästchen (Nullbytes ?) : daraus müßte ich wohl CR/LF machen oder so oder wie.. ? vielleicht sinniger mit Tokens und Zeilen anfügen ?

          MfG
          Wolf Fiet

          Comment


          • #6
            Hallo Wolf

            um die Ausgabe von Log Informationen und die flexieble Einstellung von Loggin, benutzt Du am besten Log4j(http://jakarta.apache.org/log4j/docs/index.html).

            MfG Rolf Widme

            Comment

            Working...
            X