PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem bei einer mySQL-Anbindung (mit Code)


BloodyBastard
29.01.2002, 11:59
Moin !
Ich habe ein Problem mit einer Anbindung an eine mySQL-Datenbank :( .
Ich realisiere die Anbindung der Datenbank über ein eigenständiges Programm (Auszugnummer 2), welches zwei "Konstruktoren" enthält.
Dieses Programm wird aus einem zweiten aufgerufen, welches dann mit der Datenbank arbeiten soll (Auszugnummer 3).

---- Auszugnummer 1 ----
Folgendes ist die Fehlermeldung:

--snip--
java test2
Treiber gefunden
Fehler :
java.sql.SQLException: No suitable driver
--snip--

Ich habe schon mal versucht direkt aus der Klasse datenbank.class mir den Inhalt einer Testdatenbank ausgeben zu lassen, aber leider Fehlanzeige.

---- Auszugnummer 2 ----
Hier der jetzige Code der datenbank.class

--snip--

import java.sql.*;
public class datenbank
{
// Attribute
public String datenbankTyp;
public String datenbankName;
public String datenbankHost;
public int datenbankPort;
public String datenbankUser;
public String datenbankPassword;

// Konstruktoren
// nur der Datenbanktyp wird übergeben
public datenbank (String datenbankTyp, String datenbankName)
throws SQLException {
this.datenbankTyp = datenbankTyp;
this.datenbankTyp = datenbankName;
this.datenbankHost = "127.0.0.1";
this.datenbankPort = 3306;
this.datenbankUser = "root";
this.datenbankPassword = "";
datenbankTreiberSuche(datenbankTyp);
Connection connection;
connection = DriverManager.getConnection("jdbc:"+this.datenbankTyp+":/ /"+this.datenbankHost+"/"+this.datenbankName);
Statement statement = connection.createStatement();
}

// Datenbanktyp wird übergeben mit Host und Port
public datenbank (String datenbankTyp, String datenbankName, String datenbankHost, int datenbankPort, String datenbankUser, String datenbankPassword)
throws SQLException {
this.datenbankTyp = datenbankTyp;
this.datenbankTyp = datenbankName;
this.datenbankHost = datenbankHost;
this.datenbankPort = datenbankPort;
this.datenbankUser = datenbankUser;
this.datenbankPassword = datenbankPassword;
datenbankTreiberSuche(datenbankTyp);
Connection connection;
connection = DriverManager.getConnection("jdbc:"+this.datenbankTyp+":/ /"+this.datenbankHost+"/"+this.datenbankName);
Statement statement = connection.createStatement();
}


// Methoden
private static boolean datenbankTreiberSuche (String datenbankTreiber) {
String treiber = "";
String datenbankTyp = datenbankTreiber.toLowerCase();
if (datenbankTyp == "mysql") {treiber = "org.gjt.mm.mysql.Driver";
System.out.println("Treiber gefunden"); }
else { System.out.println("Es liegt kein passender Treiber vor!"); }
try { Class.forName(treiber); }
catch (NoClassDefFoundError e) { System.err.println(e); }
catch (ClassNotFoundException e) { System.err.println(e); }
catch (Exception e) { System.err.println(e); }
return true;
}
}

--snip--

---- Auszugnummer 3 ----
Und hier das Hauptprogramm :

import java.lang.*;
import java.sql.*;

public class test2
{
public static void main (String[] argv) {
try {
datenbank test = new datenbank("mysql","server");
} catch (SQLException e) {
System.out.println("Fehler : \n"+e);

}

}
}

Ich hoffe ihr könnt mir weiterhelfen!

MfG

BB


Fragger
29.01.2002, 13:46
hi,

ein typischer class not found error, weil das java laufzeit
system die klasse für den datenbank treiber nicht finden
konnte. hört sich sehr stark danach an, als ob die jar
datei mit den mysql class files nicht im classpath liegt.
versuche doch mal, wenn c:\mmsql\lib\mmsql.jar
dein verzeichnis mit deinen mysql jar file ist
dein programm so zu starten
java -cp .;c:\mmsql\lib\mmsql.jar myProg

gruesse, fragger

BloodyBastard
29.01.2002, 13:57
Die Treiber liegen direkt in dem Verzeichnis mit der datenbank.class (bzw. in dem Unterverzeichnis mm.mysql-2.0.9-bin).
Ein Programm, das von mir schon auf dieselbe Datenbank zugreift, läuft ohne dieses Problem, allerdings befindet sich die der Datenbankzugriff (mit Verbindgung usw.) direkt in dem Programm.
Beide Programme liegen bei mir in dem selben Verzeichnis.

MfG

BB

Fragger
29.01.2002, 22:56
hi,

das ist doch kein problem.
also nochmal ganz von anfang, in deinem verzeichnis
wo du mysql installiert hast muss eine datei mit der endung .jar liegen, nimm diese und kopiere die ins verzeichnis wo auch deine datenbank.class datei liegt
das ist jetzt natürlich die idiotenlösung, denn man kopiert nicht immer alle jar files ins verzeichnis wo man
ein programm schreibt, sondern setzt den classpath auf das richtige verzeichniss. aber du scheinst noch relativ neu dabei zu sein.
also nachdem du dieses eine jar file kopiert hast, merk dir bitte den namen, am besten copy benutzen
gehst du in die eingabeaufforderung gib jetzt ein
java -cp .;namederjardatei.jar datenbank.class
bei datenbank.class musst du natürlich das .class
weglassen und enter, dürfte keine probleme machen.
wenn das auch nicht geht, dann kopiere bitte mal den inhalt von deinen verzeichnis hier her und ich schreib dir den befehl zum ausführen des programms.
achja vergiss nicht die jar datei für mysql.

gruesse, fragger

p.s. das was du meinst was schon funktioniet, ist das ein beispiel programm von mysql? wenn ja dann hast du das doch mit einem programm .bat gestartet, dort findest du genau wie man den classpath setzt.
aund, hier auf dem board ist auch ein posting bezgl. classpath, dort habe ich doch etwas längeres bezgl. dem classpath gepostet, lies das doch mal durch.

BloodyBastard
30.01.2002, 08:56
Moin!

Also, das Programm, welches funktoniert, ist kein Beispiel-Programm von mySQL. Das Programm, habe ich von jemanden bekommen, weil ich schon die ganze Zeit Probleme mit den Einbinden der mySQL-Treiber habe. Ich habe dann ein Programm, geschrieben, welches mir eine Tabelle in einer Testdatenbank ausliest, und das funktionierte dann auch, ohne das ich den classpath angeben musste. Da ich aber von Haus aus Faul bin (laut Larry Wall ja eine Tugend der Programmierer ;) ), wollte ich eine Klasse schreiben, die mir die Anbindung und alles drum herum vereinfacht (daraus resultierte die datenbank.class). Diese Klasse wollte ich dann in alle meine Programme einbinden. Mit dem Programm test2.class, wollte ich eigentlich nur testen, ob alles so klappt, wie ich es wollte, also stellvertretend für alle anderen Programme in die ich es einbinden wollte.

Ich habe ja die Vermutung das es mit der Routine zusammenhängt, die den Treiber sucht (?), also Class.forName(treiber); - aber nachdem ich das ganze dann mal statt in eine Methode zupacken, direkt in den Konstruktor gesteckt habe, erhielt ich das gleiche Problem.

Was das einbinden der jar-Dateien betrifft, ich hatte vorher auch mal mit dem cp gearbeitet, da das ganze aber nicht sonderlich gut funktionierte, musste ich den Datenbanktreiber direkt in das Verzeichnis mit meinem Programm packen.

Ich hoffe es ist jetzt etwas verständlicher was ich vor habe .

MfG

BB

Fragger
30.01.2002, 09:57
hi,

kannst du bitte ein lsiting von deinem directory mit den files darin machen und hier posten. ich meine so das ich sehen kann wo dein java file liegt, das mysql package usw.
hoffe das ich dir dann genau sagen kann woran es liegt.
im notfall werde ich das bei mir mal ausprobieren.

gruesse, fragger

BloodyBastard
30.01.2002, 10:11
Hi, hier mal eine Auszug:

c:\windows\desktop\server\java\

datenbank.class
datenbank.java
mm.mysql-2.0.9-bin <DIR> // Unterverzeichnis mit den mySQL-Treibern


sonst im Java-Compiler-Verzeichnis unter c:\java\jre\lib\ext\mm.mysql-2.0.9-bin.jar

Ich hoffe damit kannst du was anfangen.

MfG

BB

Fragger
30.01.2002, 12:11
hi,

probiere doch mal folgendes, gehe in dein verzeichnis
c:\windows\desktop\server\java
gib dort bitte folgendes ein
java -cp .;c:\java\jre\lib\ext\mm.mysql-2.0.9-bin.jar datenbank

und dann enter was bekommst du für eine fehlermeldung? du kannst das oben dierkt kopieren und in deine eingabeaufforderung pasten

BloodyBastard
30.01.2002, 12:18
Versuch 1 mit der Klasse die die Konstruktoren enthält:

java -cp .;c:\java\lib\ext\mm.mysql-2.0.9-bin.jar datenbank
Exception in thread &quot;main&quot; java.lang.NoSuchMethodError: main

Das sie ja keine Methode main enthält, bricht er ja ab.

Versuch 2 mit dem eigentlichen Programm (Das ganze oben ist kein einziger Quellcode, sondern 2 verschiedende!!!!):

java -cp .;c:\java\lib\ext\mm.mysql-2.0.9-bin.jar test2
Versuche eine Variabel zu deklarieren ... fehlgeschlagen!
Fehler :
java.sql.SQLException: No suitable driver

Hat also auch nicht funktioniert :(

MfG

BB

Fragger
30.01.2002, 13:28
hi,

könntest du bitte an die Stellen wo du System.err.println(e); hast e.printStackTrace(); schreiben, dmit bekommt man mehr Informationen über den Fehler, z.B. auch in welcher Zeile der Fehler aufgetreten ist, bitte dann die Fehlermeldung posten

gruesse, fragger

BloodyBastard
30.01.2002, 13:48
Ich habe das ganze in die test2.class mit aufgenommen, der wirft mir dei Fehlermeldung aber nur doppelt raus.
Also zweimal No suitable driver.
Was eigentlich komisch ist, denn, wenn er keinen Treiber finden würde, müsste er das ja minesten jetzt 3 mal anzeigen.
Einmal gebe ich ja in der Datenbank.class eine Fehlermeldung raus, wenn er keinen findet, und nun zweimal in der test2.class. Beide Sourcecodes befinden sich oben im Orginal!!!!
Vielleicht kannst du den bei dir auf deinem Rechner compilieren und ausführen, falls du eine mySQL-Datenbank hast???

MfG

BB

Fragger
30.01.2002, 14:55
hi,

du siehst nicht in welcher zeile der fehler auftritt,
bitte benutze e.printStackTrace(); wenn dort steht
das in der zeile 25 Clas.forName einen Fehler
verursacht, dann können wir weiter machen.

gruesse, fragger

BloodyBastard
30.01.2002, 15:03
Hi,
ich bin dem ganzen auch ein Stückchen näher gekommen.
Ich habe herraus gefunden, das er den Datenbanktreiber nicht bei dem DriverManager anmeldet.

Ich habe einen der Konstruktoren wie folgt verändert :
--snip--

datenbankTreiberSuche(datenbankTyp);

Connection connection;
try {
connection = DriverManager.getConnection(&quot;jdbc:&quot;+this.datenbankTyp+&quot;://&quot;+this.datenbankHost+&quot;/&quot;+this.datenbankName);

System.out.println(&quot;Anmeldung an den bermanager war erfolgreich&quot;);
try {
Statement statement = connection.createStatement();
} catch (SQLException e) {
System.out.println(&quot;Versuche die Datenbank zu Connectieren ....&quot;);
System.err.println(e);
}
} catch (SQLException e) {
System.out.println(&quot;Treiber konnte nicht bei dem Treibermanager angemeldet werden!!!&quot;);

System.err.println(e);
}
--snip--

und erhalte folgende fehlermeldung:
java -cp .;c:\jdk1.3.1_02jre\lib\ext\mm.mysql-2.0.9-bin.jar test2
Versuche eine Variabel zu deklarieren ...
/* Das gebe ich aus wenn Class.forName(treiber); funktioniert hat. Dafür verwende ich eine eigene Methode */
(=>Klasse datenbank<=): Treiber wurde gefunden

Treiber konnte nicht bei dem Treibermanager angemeldet werden
java.sql.SQLException: No suitable driver
Ich werde mir gleich mal ausgeben lassen, wie die Anmeldung beim Treibermanager aussieht.


MfG

BB

BloodyBastard
30.01.2002, 15:13
Hallo

Ich habe den Fehler gefunden :)
Ich muss gestehe, das es ein blöder Änfänger bzw. ein blöder Kopierfehler war. Ich habe mir eben gerade mal ausgeben lassen, wie der connect Aussieht, und habe dabei folgendes erhalten :
jdbc:test://127.0.0.1/null
hinter jdbc steht der Datenbankname und nicht der Treibername.
Ich habe beim kopieren der this.variabelnname eine Variabel nicht umbenannt (sie existierte so zweimal), und so wurde die Variabel mit dem Servertyp mit den Datenbanknamen überschrieben. Wie besagt ist ein dummer Anfängerfehler :rolleyes:

Sorry wegen all dem Stress den ich hier verursacht habe. Aber vielen Dank für deine Unterstützung!!!!!!!!!

MfG

BB

Fragger
30.01.2002, 15:32
hi,

naja, hast ja wieder was dazu gelernt.
bei problemen die man selber löst, ist
das erfolgserlebnis grösser. :D

gruesse, fragger

BloodyBastard
30.01.2002, 15:35
Hast recht, ich kann mir für diesen Fehler immer noch in den *duweisstschonwelchen* treten :D

MfG

BB