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)
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
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)
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)
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)
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)
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)
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
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)
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!! 😀 😀
|