ubuntuusers.de

MySQL/Java: Keine Verbindung zu jdbc:odbc:MeineDb

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Funkfeuer

Avatar von Funkfeuer

Anmeldungsdatum:
17. März 2007

Beiträge: 462

Wohnort: München

Hallo,

ich habe mir eine MySQL-Db installiert.
Auf diese möchte ich mit einer Java-Anwendung zugreifen.

Als Fehlermeldung bekomme ich diese Ausgabe:

Verbindung zu jdbc:odbc:MeineDb konnte nicht hergestellt werden

Ich habe das jdk6 installiert und meines Wissens auch JAVA_HOME gesetzt.

Kann es sein, dass ich noch was nachinstallieren muß (z. B. ConnectorJ, oder ODBC-Treiber...) ?

lohokla

Anmeldungsdatum:
12. Januar 2005

Beiträge: 59

Ola

Ein bisschen mehr Informationen wären nicht schlecht. Meine Glaskugel hat Ferien bis im Januar.
Zb. Stacktrace der Exception, Existiert die DB in MySQL überhaupt? Username, Password korrekt, Wie versuchst Du die Verbindung aufzubauen?
Usw. usf. und ein bisschen Code hier kann auch nicht schaden.. 😉

Gruss

Funkfeuer

(Themenstarter)
Avatar von Funkfeuer

Anmeldungsdatum:
17. März 2007

Beiträge: 462

Wohnort: München

...sorry...

Das ist der Code-Ausschnitt:

import java.sql.*;

public class Mestre_Dump 
  {
	public void setEntries (String p0, 
							String p1, 
							String p2, 
							String p3,
							String p4) 
    {
    String URL          = "jdbc:odbc:MeinDb";
    String Benutzer		= "chris";
    String Passwort		= "abc";

    // Treiber laden 
    try 
       {
       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
       } 
       catch (Exception e) 
       {
       System.out.println("JDBC/ODBC-Treiber konnte nicht geladen werden.");
       return;
       }
  }

Das ist der Fehler:

java.lang.NullPointerException
        at Mestre_Dump.setEntries(Mestre_Dump.java:52)
        at MestreSave.setSave(MestreSave.java:47)
        at Mestre.main(Mestre.java:23)

Was brauchst Du noch an Infos?

lohokla

Anmeldungsdatum:
12. Januar 2005

Beiträge: 59

Hi

Hmmmm..werde aus deinem Code nicht ganz schlau. Fehlt da was?
Du öffnest die Verbinung zur DB ja gar nie (DriverManager).
Deine Meldung im Catch-Block wird ebenfalls nicht ausgegeben.
Es wird ja eine Nullpointer Exception geworfen, das heisst irgendwas ist nicht initialisiert und diese Exception wird ausserhalb deines Try-Catch geworfen.

Guck mal hier : click

cheers

b0LbiT

Avatar von b0LbiT

Anmeldungsdatum:
28. Juni 2005

Beiträge: 173

AFAIK ist ODBC eine Microsft Schneittstelle zu DBs.

Benutzt doch direkt den JDBC Treiber anstatt die JDBC:ODBC:Brücke

http://dev.mysql.com/doc/refman/5.1/de/connector-j-usagenotes-basic.html

PS: Wenn du nicht dazuschreibst, welche Line 52 in Mestre_Dump

at Mestre_Dump.setEntries(Mestre_Dump.java:52)

ist, wird dir keiner wirklich helfen können

Funkfeuer

(Themenstarter)
Avatar von Funkfeuer

Anmeldungsdatum:
17. März 2007

Beiträge: 462

Wohnort: München

Also am Quellcode kann's sicher nicht liegen:
Der Quellcode ist unter 7.04 problemlos gelaufen. Ich habe meinen Rechner neu aufgesetzt mit 7.10 und die Datenbanken zurückkopiert.
Seitdem habe ich keinen Zugriff mehr auf das Programm.

Ich habe im Hinterkopf, dass ich unter der 7.04 ein bestimmtes Paket noch installiert habe, das ich jetzt noch nicht installiert habe. Weiss aber nicht mehr was das war..
Irgendsowas war das..

Im Wiki habe ich auch nix gefunden, was die Kommunikation MySQL ←> JAVA mittels ODBC beschreibt bzw. welche Pakete dafür beötigt werden (habe ich vielleicht auch nur übersehen..?)

lohokla

Anmeldungsdatum:
12. Januar 2005

Beiträge: 59

Hallo

Also dein Quelltext macht genau nix. Da fehlt ganz bestimmt was.

"JDBC/ODBC-Treiber konnte nicht geladen werden."

wird ja nicht ausgegeben.

Sondern die Fehlermeldung lautet:

        java.lang.NullPointerException
        at Mestre_Dump.setEntries(Mestre_Dump.java:52)
        at MestreSave.setSave(MestreSave.java:47)
        at Mestre.main(Mestre.java:23) 

Und wie ja unschwer zu erkennen, tritt ein Fehler auf der Zeile 52 auf. Nur leider fehlt diese Zeile aus dem von die abgedruckten Quelltext, bzw. es hat gar nicht 52 Zeilen.

Gruss

Funkfeuer

(Themenstarter)
Avatar von Funkfeuer

Anmeldungsdatum:
17. März 2007

Beiträge: 462

Wohnort: München

... hmm... also das ist der komplette Quelltext:

import java.sql.*;

public class Mestre_Dump 
  {
	public void setEntries (String para1, 
				String para2, 
				String para3, 
				String para4,
				String para5) 
    {
    String URL          = "jdbc:odbc:Mestre";
    String Benutzer	= "root";
    String Passwort	= "abc";

    // Treiber laden 
    try 
       {
       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
       } 
       catch (Exception e) 
       {
       System.out.println("JDBC/ODBC-Treiber konnte nicht geladen werden.");
       return;
       }
       
    // Verbindung zu Datenbank aufbauen
    Statement  befehl     = null;
    Connection verbindung = null;
        
    try 
       {
       verbindung = DriverManager.getConnection(URL, Benutzer, Passwort);
       befehl = verbindung.createStatement();
       } 
       catch (Exception e) 
          {
          System.err.println("Verbindung zu "+URL+" konnte nicht hergestellt werden");
          }

       // Daten in DB speichern
       try 
        {
    	String sql;
        sql = "INSERT INTO " + para5 +"(spalte1, spalte2, spalte3, spalte4, spalte5)Values(" +
        		"'" + para1 + "', " +
        		"'" + para2 + "', " +
        		"'" + para3 + "', " +
        		"'" + para4 + "', " + 
        		"'" + para1 + " " + para2 + "')";

        befehl.execute(sql);        

        verbindung.close();
        }
        catch (Exception e) {
          e.printStackTrace();
          }
    }    

	public static void main(String args[]) {
		Mestre_Dump md = new Mestre_Dump(); 
		md.setEntries("a", "b","c", "d","e");
	}
  
  }

und das die Fehlermeldung dazu:

Verbindung zu jdbc:odbc:Mestre konnte nicht hergestellt werden
java.lang.NullPointerException
at Mestre_Dump.setEntries(Mestre_Dump.java:52)
at Mestre_Dump.main(Mestre_Dump.java:81)

lohokla

Anmeldungsdatum:
12. Januar 2005

Beiträge: 59

aha..☺

Wird bei :

verbindung = DriverManager.getConnection(URL, Benutzer, Passwort); 


wahrscheinlich eine Exception geworfen.

Gib mal die komplette Exception (e.printStackTrace()) aus, statt nur eine Meldung von Dir.
Müsste eigentlich eine SQLException geben, mit detaillierten Angaben, was nicht hinhaut.

Gruss

Funkfeuer

(Themenstarter)
Avatar von Funkfeuer

Anmeldungsdatum:
17. März 2007

Beiträge: 462

Wohnort: München

habe jetzt den Abschnitt wie folgt geändert:

    try 
       {
       verbindung = DriverManager.getConnection(URL, Benutzer, Passwort);
       befehl = verbindung.createStatement();
       } 
       catch (Exception e) 
          {
    	   e.printStackTrace();
          }

Fehlermeldung ist:

	at Mestre_Dump.main(Mestre_Dump.java:81)
java.lang.NullPointerException
	at Mestre_Dump.setEntries(Mestre_Dump.java:52)
	at Mestre_Dump.main(Mestre_Dump.java:81)

Funkfeuer

(Themenstarter)
Avatar von Funkfeuer

Anmeldungsdatum:
17. März 2007

Beiträge: 462

Wohnort: München

Ich habe einen kleine Klasse geschrieben, um zu testen, wo das Problem genau liegt.

Also - das ist die Klasse:

import java.sql.*;

public class Test2 
  {
	public void setEntries () 
    {
    String URL          = "jdbc:odbc:mestre";
    String Benutzer		= "root@localhost";
    String Passwort		= "abc";

    
    // Treiber laden
    
    try 
       {
       Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
       System.out.println("Treiber konnte geladen werden!");
       } 
       catch (Exception e) 
       {
    	   e.printStackTrace();
       }

       
    // Verbindung zu Datenbank aufbauen
        
    try 
       {
       DriverManager.getConnection(URL, Benutzer, Passwort);
       } 
       catch (Exception e) 
          {
    	   e.printStackTrace();
          }

       // Daten in DB speichern
    }    

  
  
	public static void main(String args[]) {

		Test2 tst = new Test2(); 
		tst.setEntries();
		
	}
  
  
  
  }

... und das die Fehlermeldung:

java.sql.SQLException: [unixODBC][Driver Manager]Data source name not found, and no default driver specified
	at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957)
	at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114)
	at sun.jdbc.odbc.JdbcOdbc.SQLDriverConnect(JdbcOdbc.java:3073)
	at sun.jdbc.odbc.JdbcOdbcConnection.initialize(JdbcOdbcConnection.java:323)
	at sun.jdbc.odbc.JdbcOdbcDriver.connect(JdbcOdbcDriver.java:174)
	at java.sql.DriverManager.getConnection(DriverManager.java:582)
	at java.sql.DriverManager.getConnection(DriverManager.java:185)
	at Test2.setEntries(Test2.java:30)
	at Test2.main(Test2.java:45)

Beim Laden des Treibers ist keine Fehlermeldung gekommen, das hat noch geklappt. Aber beim Verbindungsaufbau ist dann der Fehler geworfen worden.
Muss ich vielleicht noch einstellungen in der odbc.ini vornehmen - die ist bei mir leer...?

Funkfeuer

(Themenstarter)
Avatar von Funkfeuer

Anmeldungsdatum:
17. März 2007

Beiträge: 462

Wohnort: München

Ich habe die Lösung gefunden. Es war ein Problem mit der ODBC-Anbindung.
Falls jemand mal ein ähnliches Problem hat, dass keine Verbindung zur MySQL-Datenbank hergestellt werden kann, hier die Lösung, wie man alles konfigurieren muss:
http://www.mechtilde.de/mysql2ooo20/howtomysql2ooo20.html

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

Wenn ODBC nicht aus besonderen Gründen zwingend nötig ist, würde ich b0LbiTs Empfehlung, das auf JDBC umzustellen nochmal unterstreichen wollen.
Die ODBC-JDBC-Brücke war ein Hilfsmittel aus den Java-Urzeiten, als noch wenige reine JDBC-Treiber verfügbar waren, also vor etwa 10 Jahren.

Ich meine gehört zu haben, daß JDBC performanter, sicherer und leistungsfähiger ist.

In den meisten Fällen sind auch PreparedStatements profanen Statements vorzuziehen - es macht Parameterersetzung übersichtlicher, einfacher (das "name='O'Reilly'"-Problem) und sicherer (SQL-Injection).
Für erste Gehversuche sind Statements aber völlig okay.

    String URL          = "jdbc:odbc:mestre";
    String Benutzer      = "root@localhost";
    String Passwort      = "abc";


Parameter und Attribute, die nicht final sind, immer klein schreiben - auch wenn es nur Konvention ist.

Funkfeuer

(Themenstarter)
Avatar von Funkfeuer

Anmeldungsdatum:
17. März 2007

Beiträge: 462

Wohnort: München

Ja, da stimme ich Dir absolut zu. Die JDBC-ODBC-Bridge ist sicher nicht die geeinete Lösung für die meisten Anwendungsfälle.
In meinem Fall habe ich sie bevorzugt, da es sich um ein kleines Java-Programm handelt, noch aus Windows-Zeiten, und ich schlicht zu faul war es auf JDBC umzustellen 😉

Jetzt bin ich endgültig weg von Win - 100% Ubuntu!! 😀 😀

Antworten |