# Verbindung zu Datenbank herstellen



## jojo.14 (3. Aug 2012)

Hallo zusammen,

ich bin neu in der Community und habe erste Erfahrungen mit Java.

Ich versuche eine Verbindung von meiner Java-Applikation zu einer Microsoft SQL Server 2008 R2-Datenbank herzustellen.

Meine Entwicklungsumgebung ist Eclipse. Das Betriebssystem auf dem Rechner ist Windows XP.

Habe bisher den "Microsoft SQL Server JDBC Driver 3.0" geladen. 

Ich habe nun schon mehrmals gelesen, dass man in der ".CLASSPATH"-Datei etwas editieren muss. Nur kenn ich mich nicht genügend mit der Kommandozeile aus, um dort den für mich richtigen Befehl einzugeben.

Hoffe mir kann jemand weiterhelfen.

Gruß Joe


----------



## turtle (3. Aug 2012)

Unter Eclipse brauchst Du nicht mit der Kommandozeile rumfrickeln ;-)

Retchsklick auf das Projekt und unter "Configure Buildpath" den JDBC-Treiber (wahrscheinlich bei Dir) als "Add external Jar" hinzufügen.


----------



## jojo.14 (3. Aug 2012)

Ok super danke.

Stehe jetzt allerdings vor dem nächsten Problem. 

Versuche die Verbindung über ein DataSource-Objekt zu gestalten. 


```
package de.javatest.Database;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class DatabaseConnection {

	public static void main(String[] args) throws Exception {
		
	    Connection con = null;	
	    Statement stmt = null;	
	    ResultSet rs = null;
	    Context ctx = new InitialContext();

	    try 
	    {
	    	DataSource ds = (DataSource)ctx.lookup("JOGO-WRK01\\SQLEXPRESS"); //Servername der Datenbank
	    	con = ds.getConnection();
	    	
	    	String sqlabfrage = "SELECT * FROM Log"; //Log = Tabellenname 
	        stmt = con.createStatement();
	        rs = stmt.executeQuery(sqlabfrage);
	        
	        while (rs.next()) 
	            System.out.println(rs.getString("ID") + " " + rs.getString("Status") + " " + rs.getString("Zeit") + " " + rs.getString("Port"));	
	    }
	    finally
	    {
	    	if(con != null)
	    		try {con.close();} catch (SQLException ex) {ex.printStackTrace();}
	        }	
	}
}
```

Bekomme dann diese Fehlermeldung in der Konsole:


Exception in thread "main" javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
	at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
	at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
	at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
	at javax.naming.InitialContext.lookup(Unknown Source)
	at de.javatest.Database.DatabaseConnection.main(DatabaseConnection.java:23)


----------



## we12rt (3. Aug 2012)

Du hast einen - welchen - Applicationserver laufen? Du hast dort die entsprechende Konfiguration vorgenommen?

Hier die Beschreibung für Tomcat

Apache Tomcat 7 (7.0.29) - JNDI Datasource HOW-TO


----------



## we12rt (3. Aug 2012)

Ohne Applicationserver ist 

Java ist auch eine Insel – 20.7 Mit Java an eine Datenbank andocken

das Vorgehen angesagt


----------



## jojo.14 (3. Aug 2012)

Wofür brauche ich den Application-Server jetzt genau? 

Der JDBC-Treiber ist sozusagen die Schnittstelle zwischen meiner Java-Anwendung und der SQL-Server-Datenbank. Diese habe ich geladen. Was macht der Application-Server ?

Dachte ich könnte jetzt schon über DataSource ODER DriverManager die Verbindung herstellen?!


----------



## jojo.14 (3. Aug 2012)

Ok hab jetzt analog zum ersten Java-Code-Beispiel versucht die Verbindung über den DriverManager herzustellen. Dort kommt aber ebenfalls eine Exception, trotzdem ich die .jar-Dateien 2.0 bis 4.0 der JDBC-Treiber zumindest schon mal in die "Build Path" gelegt habe.


```
package de.javatest.Database;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DatabaseConnection2 {

	public static void main(String[] args) throws Exception {
		
	    Connection con = null;	
	    Statement stmt = null;	
	    ResultSet rs = null;
	    
	    String connectionUrl = "jdbc:sqlserver://JOGO-WRK01\\SQLEXPRESS;" + "databaseName=BA;user=JoGo;password=Test1234%"; 
	                                                                           
	    try 
	    {
	        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
	        con = DriverManager.getConnection(connectionUrl);

	    	
	    	String sqlabfrage = "SELECT * FROM Log"; //Log = Tabellenname 
	        stmt = con.createStatement();
	        rs = stmt.executeQuery(sqlabfrage);
	        
	        while (rs.next()) 
	            System.out.println(rs.getString("ID") + " " + rs.getString("Status") + " " + rs.getString("Zeit") + " " + rs.getString("Port"));	
	    }
	    finally
	    {
	    	if(con != null)
	    		try {con.close();} catch (SQLException ex) {ex.printStackTrace();}
	        }	
	}
}
```


Die Ausgabe in der Console:


```
03.08.2012 17:09:11 com.microsoft.sqlserver.jdbc.SQLServerConnection <init>
SCHWERWIEGEND: Die Java-Laufzeitumgebung (Java Runtime Environment, JRE), Version 1.6, wird von diesem Treiber nicht unterstützt. Verwenden Sie die Klassenbibliothek 'sqljdbc4.jar', die Unterstützung für JDBC 4.0 bietet.
Exception in thread "main" java.lang.UnsupportedOperationException: Die Java-Laufzeitumgebung (Java Runtime Environment, JRE), Version 1.6, wird von diesem Treiber nicht unterstützt. Verwenden Sie die Klassenbibliothek 'sqljdbc4.jar', die Unterstützung für JDBC 4.0 bietet.
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.<init>(SQLServerConnection.java:238)
	at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:841)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at de.javatest.Database.DatabaseConnection2.main(DatabaseConnection2.java:22)
```




Hoffe mir kann jemand auf diesem Wege helfen. 

Gruß Joe


----------



## Camino (3. Aug 2012)

jojo.14 hat gesagt.:


> ...trotzdem ich die .jar-Dateien 2.0 bis 4.0 der JDBC-Treiber zumindest schon mal in die "Build Path" gelegt habe.



Liegen alle diese verschiedene Treiberversionen immer noch im Buildpath? Vielleicht solltest du mal alle bis auf die Version 4.0 wieder entfernen, nicht dass da ansonsten die falsche Version eingebunden wird.

Dies in der Fehlermeldung könnte evtl. darauf hinweisen:


> die Unterstützung für JDBC 4.0 bietet



Soweit ich weiss, braucht man das nicht mehr unbedingt:

```
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
```
Der Treiber wird auch dann geladen/eingebunden, wenn er vorhanden ist, also im Buildpath liegt.


----------



## jojo.14 (20. Aug 2012)

Habe jetzt bis auf die Datei sdljdbc4.jar aus JDBC 4.0 alle aus .jar-Dateien aus dem BuildPath genommen. Die Fehlermeldung bleibt die Selbe. 

Hat jemand einen weiteren Rat für mich ?


----------



## Camino (20. Aug 2012)

Hmm, keine Ahnung, müsste ja jetzt eigentlich funtionieren, bzw. die gleiche Fehlermeldung wie oben sollte so ja nicht mehr erscheinen. Vielleicht musst du noch irgendwas aktualisieren, oder die alten JARs liegen doch noch irgendwie im Projekt. Kannst die ja mal (bis auf die benötigte sdljdbc4.jar) ganz aus dem Projekt löschen bzw. temporär an einen anderen Ort verschieben.


----------



## jojo.14 (20. Aug 2012)

Was mich wundert: Wenn ich eine der Dateien herausnehme oder wieder hinzufüge werde ich beim Start des Programms nicht von Eclipse gefragt, ob ich neu abspeichern will. So als hätte ich nichts verändert. 
Wo kann ich denn erkennen, ob wenigstens versucht wird die Dateien aus der BuildPath einzubinden.


----------



## Camino (20. Aug 2012)

jojo.14 hat gesagt.:


> Was mich wundert: Wenn ich eine der Dateien herausnehme oder wieder hinzufüge werde ich beim Start des Programms nicht von Eclipse gefragt, ob ich neu abspeichern will. So als hätte ich nichts verändert.



Wo genau nimmst du die Dateien raus oder fügst sie wieder hinzu? Wenn sie nicht im Build Path eingebunden sind, warum sollte dann Eclipse auch meckern?

Die hinzugefügten JARs siehst du in Eclipse im Package-Explorer bei den Referenced LIbraries, oder im Build Path (Rechtsklick auf Projekt und dann Build Path -> Configure Build Path oder Properties).


----------



## jojo.14 (20. Aug 2012)

Bei beiden Möglichkeiten sehe ich derzeit die sdljdbc4.jar und dahinter der Pfad, wo ich die Datei liegen habe.


----------



## Camino (20. Aug 2012)

'sdljdbc4.jar' oder 'sqljdbc4.jar'? Und was ist mit den anderen Dateien? Wo hast du die rausgenommen oder hinzugefügt? Und funktioniert es, wenn du diese anderen Dateien (SQL-Treiber) mal komplett aus deinem Projektordner raus verschiebst?


----------



## jojo.14 (20. Aug 2012)

Zur ersten Frage: sqljdbc4.jar  

Sorry hatte mich einmal verlesen und das ständig falsch geschrieben.


Hab die Treiber-Dateien 2.0 bis 4.0 aus dem Internet geladen und die entpackten Ordner alle unter "Eigene Dateien" liegen. 

Gehe dann "Rechtsklick aufs Projekt" -> "Build Path" -> "Configure Build Path" -> "Add External JARs" -> "Eigene Dateien" -> "Microsoft JDBC Driver 4.0 for SQL Server" -> "sqljdbc_4.0" -> "deu" -> markiere die "sqljdbc4.jar" und klicke auf "öffnen" 

Anschließend erscheint die sqljdbc4.jar zusammen mit der Datei "JRE System Library [JavaSE-1.6]" im Java Build Path unter Libraries.

Leider erscheint immer noch der gleiche Fehler.


----------



## Camino (20. Aug 2012)

OK, wenn ich die Fehlermeldung


> Verwenden Sie die Klassenbibliothek 'sqljdbc4.jar', die Unterstützung für JDBC 4.0 bietet.


bei Google eingebe, finde ich 2 Seiten mit dem gleichen Problem und wohl auch einer Lösung.

How to make Java work with SQL Server? - Stack Overflow
Portierung Java DB-Zugriffe von MSSQL2000 nach MSSQL2008; - Mikrocontroller.net

Dort wird geraten, einen anderen Treiber zu benutzen:


> Freier JTDS-Treiber von jTDS JDBC Driver



Vielleicht hilft das ja...


----------



## jojo.14 (20. Aug 2012)

So hab jetzt die beiden Dateien jtds-1.2.5.jar und jtds-1.2.6.jar von der empfohlenen Webseite jeweils im Build Path hineingelegt und einzeln getestet. Der Fehler bleibt. 

Hab auch die Ordner, in denen die jar-Dateien liegen mal mit in den Projektordner gelegt und noch einmal alles durchprobiert. Keine Änderung.


----------



## Camino (20. Aug 2012)

Die Fehlermeldung ist komplett identisch wie vorher? Hmm, dann fällt mir auch nicht mehr viel ein. Du bist aber schon sicher, dass du auch das richtige Projekt ausführst und nicht zufällig die Änderungen mit den Treibern und den Build Path in einem ganz anderen Projekt vornimmst? Na ja, vielleicht kann dir ja wer anderes weiterhelfen...


----------



## jojo.14 (20. Aug 2012)

Trotzdem vielen Dank für die Hilfe und die Mühen. Hab auch die Zeile "Class.forName..." auskommentiert und wieder reingenommen. Keine Änderung. 
Mir fehlt auch leider die Erfahrung, da jetzt selber noch etwas zu finden.


----------



## jojo.14 (20. Aug 2012)

Vielleicht ist auch etwas am Java-Code falsch ?


----------



## jojo.14 (20. Aug 2012)

Eine andere Möglichkeit ist vielleicht eine falsche Java/Eclipse-Version. 
Mich wundert, dass die ganzen Hilfestellungen bislang keinen Erfolg haben. Wo doch in einigen Foren die gleichen Tipps offensichtlich zum Erfolg führen.

Hab JavaSE-1.6 (JRE 6)
Eclipse IDE for Java Developers 3.7 (Indigo)
...
und zusätzlich noch Android SDK, die in diesem Projekt allerdings überflüssig und nicht entscheidend sein wird.


Vielleicht fehlen mir irgendwelche Zusätze. 

Hab auch teilweise was von nem SQL-Explorer usw. gelesen... 
oder die Java Enterprise Edition...


Danke 
Gruß Joe


----------



## turtle (21. Aug 2012)

Ich würde versuchen mit einem SQL-Tool wie zum Beispiel Squirrel versuchen eine Verbindung zur DB aufzubauen.


----------



## jojo.14 (21. Aug 2012)

So über den jtds-Treiber schaffe ich es nun einen neuen Fehlercode zu produzieren. 

Denke das liegt an der Verbindungs-URL.

Aktueller Java Code:


```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
public class DatabaseConnection2 {
    
    public static void main(String[] args) throws Exception {
 
        Connection con = null;
        Statement stmt = null;
        ResultSet rs = null;
 
        String connectionUrl = "jdbc:jtds:sqlserver://127.0.0.1;databaseName=BA;user=TestUser;password=Test12345;";
 
        try {
            Class.forName("net.sourceforge.jtds.jdbc.Driver"); //com.microsoft.sqlserver.jdbc.SQLServerDriver
            con = DriverManager.getConnection(connectionUrl);
 
 
            String sqlabfrage = "SELECT * FROM Log"; //Log = Tabellenname
            stmt = con.createStatement();
            rs = stmt.executeQuery(sqlabfrage);
 
            while (rs.next())
                System.out.println(rs.getString("ID") + " " + rs.getString("Status") + " " + rs.getString("Zeit") + " " + rs.getString("Port"));
            }
        catch(Exception e){
            e.printStackTrace();
        }
        finally {
            if(con != null)
            {
                try {
                        con.close();
                    } 
                catch (SQLException ex) {
                ex.printStackTrace();
                }
            }
        }
    }
}
```

Folgender Fehler erscheint nun:

java.sql.SQLException: Network error IOException: Connection refused: connect
	at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:410)
	at net.sourceforge.jtds.jdbc.ConnectionJDBC3.<init>(ConnectionJDBC3.java:50)
	at net.sourceforge.jtds.jdbc.Driver.connect(Driver.java:184)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at java.sql.DriverManager.getConnection(Unknown Source)
	at de.javatest.Database.DatabaseConnection2.main(DatabaseConnection2.java:21)
Caused by: java.net.ConnectException: Connection refused: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(Unknown Source)
	at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
	at java.lang.reflect.Method.invoke(Unknown Source)
	at net.sourceforge.jtds.jdbc.SharedSocket.createSocketForJDBC3(SharedSocket.java:307)
	at net.sourceforge.jtds.jdbc.SharedSocket.<init>(SharedSocket.java:257)
	at net.sourceforge.jtds.jdbc.ConnectionJDBC2.<init>(ConnectionJDBC2.java:311)
	... 5 more


Gruß Joe


----------



## Camino (21. Aug 2012)

Hab das gefunden, wenn ich nach der Fehlermeldung suche:


> The “Connection refused” exception is thrown by jTDS when it is unable to connect to the server. There may be a number of reasons why this could happen:
> 
> 1.) The server name is misspelled or the port number is incorrect.
> 2.) SQL Server is not configured to use TCP/IP. Either enable TCP/IP from SQL Server’s Network  Utility app or have jTDS connect via named pipes (see the URL format for information on how to do this).
> 3.) There is a firewall blocking port 1433 on the server.


----------



## jojo.14 (21. Aug 2012)

Ja auf diesen Seiten war ich auch. 

Also der Servername ist denke ich mal korrekt. Die Portnummer 1433 habe ich im Konfigurationsmanager eingestellt. Es gab da auch ein paar Beschreibungen/Anleitungen, die alle das Gleiche erklärt haben.  

Schaffe es aber nicht über den Befehl in der Kommandozeile -> telnet localhost 1433  eine Verbindung herzustellen

Wenn ich einen Port eingebe der belegt ist laut meinem Port-Scanner-Programm verbindet sich telnet damit.


Aber wenn diese Fehlermeldung jetzt erscheint müsste doch zumindest der Treiber gefunden und geladen werden !?


----------



## crashfinger (21. Aug 2012)

Hi,

versuch mal folgendes:

JDBC 4 Treiber hier herrunterladen: Download: Microsoft JDBC Driver*4.0 für SQL Server - Microsoft Download Center - Download Details
Den Treiber an eine beliebige Stelle entpacken.
Im Eclipse die Properties deines Projektes öffnen.
Im linken Menü der Properties den Eintrag _Java Build Path_ wählen.



Die Datei des zuvor heruntergeladenen und entpackten Treibers _sqljdbc_4.0\deu\sqljdbc4.jar_ über "Add External JARs..." einbinden.

Folgende Klasse erstellen.

```
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
 
public class ConnectionTest {
    public static void main(String[] args) {
        Connection connection=null;
        try{Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); 
            connection = DriverManager.getConnection("jdbc:sqlserver://myDbServer:1433;databaseName=myDB;user=******;password=******;");
            System.out.println("Connection is valid: " + connection.isValid(0));
        }
        catch (ClassNotFoundException e){e.printStackTrace();}
        catch (SQLException e)          {e.printStackTrace();}
        finally{try{connection.close();}catch(SQLException e){e.printStackTrace();}}
    }
}
```

Im String die Angaben für Sql-Server-Namen(_myDbServer_), DB-Name(_myDB_), UserName(_*****_) und Passwort(_*****_) anpassen.
Die Klasse ausführen

Die Ausgabe der Konsole sollte so aussehen:
Connection is valid: true


----------



## jojo.14 (21. Aug 2012)

So mittlerweile funktioniert alles.  

Konnte jetzt Dinge aus meiner Datenbank auslesen, sowie hineinschreiben.

Musste bei der Datenbank im Konfigurations-Manager ein paar Dinge anpassen.

Vielen Dank für die großartige Hilfe und für die Geduld mit mir.


P.S. Den letzten Beitrag werde ich noch testen

Schöne Grüße 
Joe


----------

