# Verbindung zu Datenbank herstellen



## jojo14 (3. August 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 2.0" bis "4.0" geladen und jeweils die beiden .jar-Dateien (also insgesamt nun 6)  unter "Configure Build Path"  und "Add External Jar2 eingefügt.

Habe nun folgenden Code:


```
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();}
	        }	
	}
}
```

Ich erhalte nun folgende Fehlermeldung auf 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)


Zeile 23 ist die, die mit DataSource beginnt.


Hoffe mir kann jemand helfen

Gruß Joe


----------



## HonniCilest (6. August 2012)

Ein ähnliches Thema gab es schonmal:
http://www.tutorials.de/java/245075-javax-naming-noinitialcontextexception.html

Eventuell hilft dir das weiter?


----------



## jojo14 (20. August 2012)

Hab die Verbindung über DataSource nicht herstellen können. Habe jetzt einen anderen Ansatz gewählt über den DriverManager.

```
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();}
	        }	
	}
}

Ich erhalte aber ebenfalls eine Fehlermeldung in der Konsole:

20.08.2012 10:31:39 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)
```

Danke schonmal 

Grüße Joe

Habe nach wie vor im BuildPath die jar-Dateien liegen. Allerdings nur noch die sdljdbc4.jar aus Microsoft SQL Server JDBC Driver 4.0


----------



## I2oxxi (20. August 2012)

steht da doch klar und deutlich, dein treiber ist nicht mehr kompatibel.

hier hab ich mal was aus nem projekt wo ich was mit datenbanken zu tun hatte ausgeschnitten, vllt kannse damit was anfangen


```
import java.sql.DriverManager;
import java.io.IOException;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCConnector{

	Connection con = null;

	public JDBCConnector() {

		try {
			Class.forName("org.postgresql.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}

	}

	public void insert(/*some inuput data */) {
		open();
		PreparedStatement pstmt = null;
		try {
			//some query on pstmt with input data
		} catch (SQLException e) {
			e.printStackTrace();
		}
		close();
	}

	@Override
	public boolean isOpen() {
		try {
			return !con.isClosed();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}

	@Override
	public void close() {
		if (isOpen())
			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
	}

	@Override
	public void open() {
		try {
			if(!isOpen())
				con = DriverManager.getConnection(/*url, user, password*/ "","","");
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

}
```


----------



## jojo14 (20. August 2012)

Ja das mein Treiber nicht funktioniert oder nicht benutzt wird ist klar. Nur es muss doch einen Weg geben diesen einzubinden. Bin der Fehlermeldung nachgegangen habe den entsprechenden Treiber aus dem Internet geladen und in die Build Path eingefügt. Habe auch über den jtds-Treiber versucht die Verbindung aufzubauen. Leider nach wie vor mit der gleichen Fehlermeldung.


----------



## I2oxxi (20. August 2012)

haste auch wirklich den aktuellen? es sagt ja nicht umsons das es nicht kompatibel ist.
http://msdn.microsoft.com/de-de/library/ms378526.aspx
schau mal da, sqljdbc4.jar brauchs du


----------



## jojo14 (20. August 2012)

Hab jedenfalls alle möglichen jetzt ausprobiert. 
Wenn ich die jar-Dateien unter Build Path und Add External JARs einfüge ändert sich auch immer etwas in dieser CLASSPATH-Datei. 
Scheint so als würde Eclipse das automatisch machen. 

Vielleicht ist auch an meinem Code etwas fehlerhaft ?


----------



## jojo14 (20. August 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 (JDK 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


----------



## I2oxxi (20. August 2012)

gib mal link zu dem aktuellsten treiber zu dem hast (benutzen möchtest) + deinen code, dann kann ich bisl rum probieren


----------



## jojo14 (20. August 2012)

Ok danke 

Der mittlere Download:

http://www.microsoft.com/en-us/download/details.aspx?id=11774

Code:

```
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:1433;" + "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();}
	        }	
	}
}
```


----------



## I2oxxi (20. August 2012)

also ich hab jetz deinen treiber eingebunden (also die exe geladen und sqljdbc4.jar eingebunden) und ich bekomme nen anderen fehler als du, der treiber scheint zu funktionieren denn bis der fehler auftritt dauert es auch einige zeit (also versucht er wohl irgendwas)

und benutz bitte die java tags  also java bzw /java in [] drin.

dein code bisl formatiert:

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

public class DBTest {
	
	public static void main(String[] args) throws Exception {

		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;

		String connectionUrl = "jdbc:sqlserver://JOGO-WRK01\\SQLEXPRESS:1433;" + "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"));
			}
		catch(Exception e){
			e.printStackTrace();
		}
		finally {
			if(con != null)
			{
				try {
						con.close();
					} 
				catch (SQLException ex) {
				ex.printStackTrace();
				}
			}
		}
	}
}
```

fehler:

```
com.microsoft.sqlserver.jdbc.SQLServerException: Fehler beim Herstellen der TCP/IP-Verbindung mit dem Host 'JOGO-WRK01', Port 1433. Fehler: 'null. Überprüfen Sie die Verbindungseigenschaften. Stellen Sie sicher, dass eine SQL Server-Instanz auf dem Host ausgeführt wird und am Port TCP/IP-Verbindungen akzeptiert. Vergewissern Sie sich, dass am Port keine TCP-Verbindungen durch eine Firewall blockiert werden.'.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190)
	at com.microsoft.sqlserver.jdbc.SQLServerException.ConvertConnectExceptionToSQLServerException(SQLServerException.java:241)
	at com.microsoft.sqlserver.jdbc.SocketFinder.findSocket(IOBuffer.java:2243)
	at com.microsoft.sqlserver.jdbc.TDSChannel.open(IOBuffer.java:491)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1309)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:991)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:827)
	at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:1012)
	at java.sql.DriverManager.getConnection(DriverManager.java:579)
	at java.sql.DriverManager.getConnection(DriverManager.java:243)
	at DBTest.main(DBTest.java:20)
```

soviel kenn ich mich jetz auch nicht mit datenbanken aus, aber deine liegt lokal oder? (sehe keinen richtigen pfad) 
das wäre dann die erklärung wieso es bei mir nicht funktioniert 
also liegt deine db lokal?

und dein eclipse kann damit nix zu tun, dein eclipse besitzt sogesehen einfach nur "massig shortcuts" die dir das leben leichter machen, aber du kannst deine java datei auch in einem normalen texteditor scheiben und es kommt aufs gleiche hinaus (nur das du den classpath von hand anpassen musst usw)


----------



## jojo14 (21. August 2012)

Ja die Datenbank liegt hier lokal auf meinem Rechner. Wäre froh, wenn bei mir der gleiche Fehler käme. Wahrscheinlich würde dieser bei mir nicht mal kommen. Aber es hängt ja schon vorher. 

Danke. Gut zu wissen, dass es nicht am Eclipse liegt. 

Leider bleibt es bei mir beim gleichen Fehler.


----------



## jojo14 (21. August 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:


```
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: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


----------



## I2oxxi (21. August 2012)

naja wie gesagt, so gut kenn ich mich mit datenbanken und der treibervielfalt auch nicht aus, aber mit meinem code müsste es funktionieren wenn du den richtigen treiber einbindest. 
wie gesagt, sqljdbc4.jar, nicht sqljdbc.jar.

deine jetzige exception sagt ja "refused", vlllt stimmt was mit deinen connect daten nicht? aber großartig sons fällt mir da nix ein, den treiber kenn ich ncih ^^


----------



## jojo14 (21. August 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.

Schöne Grüße 
Joe


----------



## Jungspund (28. August 2012)

Hilft dir diese DB-Verbindung vllt weiter?


```
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class DBConnection {

	private static String port = "";
	private static String host = "";
	private static String user = "";
	private static String password = "";
	private static String sid = "";
	// 
	private String url;
	protected static Connection con = null;
	private boolean debug = false;

	protected DBConnection() {
		con = null;
	}

	public DBConnection(String Host, String Port, String SID, String user, String password, boolean debug) throws ClassNotFoundException, SQLException  {
		invokeConnection(Host, Port, SID, user, password, debug);

	}

	protected void invokeConnection(String Host, String Port, String SID, String user, String password, boolean debug) throws ClassNotFoundException, SQLException {

		if ((!this.port.equals(Port) || !this.host.equals(Host) || !this.sid.equals(SID) || !this.user.equals(user) || !this.password.equals(password)) || con == null) {
			this.port = Port;
			this.host = Host;
			this.sid = SID;
			this.user = user;
			this.password = password;

			url = "jdbc:oracle:thin:@" + Host.trim() + ":" + port.trim() + ":" + SID.trim();
			if(debug){
				System.out.println("--");
				System.out.println(url);
				System.out.println(this.user +"/"+this.password);
				System.out.println("--");
			}
			Class.forName("oracle.jdbc.driver.OracleDriver");

			// momentan wird hier noch eine Direktverbindung vom Client zur DB
			// hergestellt
			try{
			con = DriverManager.getConnection(url, this.user, this.password);
			}catch(Exception e){
				e.printStackTrace();
				System.exit(0);
			}
		}
	}

	public Connection getCon() {
		return this.con;
	}

	public void setCon(Connection con) {
		this.con = con;
	}

	public void CloseCon() throws SQLException {
		this.con.close();
	}
	

}
```


----------

