# Per JDBC auf Microsoft SQL 2005



## GianaSisters (4. Nov 2011)

Hallo Zusammen,

ich stehe vor einem großen Problem. Ein Kunde hatte zunächst den Wunsch geäußert ein Programm mit einer MySQL Datenbank zu bekommen, allerdings soll nun auf das Microsoft SQL 2005 umgeschwänkt werden. Jetzt sitze ich schon den Ganzen Tag dran eine Verbindung aufzubauen bzw bin ich mir gar nicht sicher, ob ich bei dem ganzen konfigurieren der Datenbank alles richtig gemacht habe. Jedenfalls kann ich im Management Studio in dem Schema "master" das Beispielschema "SELECT * FROM spt_values" aufrufen.

Meine kleine Software liest aus einer Textbox die Connection URL aus die ich fürs Testen immer mal umändere. In der Libary hab ich: msbase.jar, mssqlserver.jar, msutil.zip und sqlijdbc4.jar

Ich habe schon viele URL Statements aufgerufen z.b.: jdbc:sqlserver://TIMO-PC\SQLEXPRESS:1433;databaseName=master;Integrated Security=True;

Als Fehlermeldung kommt in diesem Fall übrigens:
com.microsoft.sqlserver.jdbc.SQLServerException: Fehler beim Herstellen der TCP/IP-Verbindung mit dem Host 'TIMO-PC', Port 1433. Fehler: 'Connection refused: connect. Überprüfen Sie die Verbindungseigenschaften, und stellen Sie sicher, dass eine SQL Server-Instanz auf dem Host ausgeführt wird, die TCP/IP-Verbindungen am Port annimmt. Überprüfen Sie außerdem, dass die TCP-Verbindungen mit dem Port nicht von einer Firewall blockiert werden.'.


Hier das eigentliche Programm (wie gesagt String url kommt aus einem Textfeld):

```
import java.sql.*;

public class connectURL {

	public void starten(String url) {
		// jdbc:sqlserver://localhost:1433;
		// Create a variable for the connection string.
		String connectionUrl = url ;
                String user = "sa";
                String pw = "sa";
                 
		// Declare the JDBC objects.
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		
        	try {
        		// Establish the connection.
       // 		Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
                    Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
       
                    con = DriverManager.getConnection(connectionUrl, user, pw);
            
            		// Create and execute an SQL statement that returns some data.
            		String SQL = "SELECT * FROM spt_values";
            		stmt = con.createStatement();
            		rs = stmt.executeQuery(SQL);
            
            		// Iterate through the data in the result set and display it.
            		while (rs.next()) {
            			System.out.println(rs.getString(4) + " " + rs.getString(6));
            		}
        	}
        
		// Handle any errors that may have occurred.
		catch (Exception e) {
			e.printStackTrace();
		}

		finally {
			if (rs != null) try { rs.close(); } catch(Exception e) {}
	    		if (stmt != null) try { stmt.close(); } catch(Exception e) {}
	    		if (con != null) try { con.close(); } catch(Exception e) {}
		}
	}
}
```
Würde mich freuen wenn mir Jemand helfen kann... Vielleicht liegts ja auch an den Konfigurationen vom Server ?!


----------



## nillehammer (4. Nov 2011)

- Die Jardatei sqljdbc.jar hast Du eingebunden -> OK
- Der Treibername bei Class.forName() stimmt -> OK
- Die connection URL sollte anders aussehen (siehe hier: Verwenden des JDBC-Treibers) -> Korrigiere das
- Die Fehlermeldung ist eindeutig. Die Connection wird vom Zielhost refused. D.h. entweder läuft Dein Server auf einem anderen Port, oder irgendeine Firewall (lokal auf dem Server oder im Netzwerk) blockiert Verbindungsanfragen auf diesem Port. -> Überprüfe das


----------



## GianaSisters (4. Nov 2011)

Hallo Nillehammer,

bis hierher vielen Dank. Leider weiß ich nicht, wo ich den Port mir Anzeigen lassen kann worunter der Server läuft. Per Hand hab ich den allerdings nichts geändert. Die connectionURLs hab ich schon alle getestet, aber solange der Server vielleicht noch gar keinen Zugriff zulässt, kanns ja an beiden Seiten liegen - das ist das blöde daran. 
Gruss, Giana


----------



## nillehammer (4. Nov 2011)

Bei Windows die Dos-Box öffnen und folgenden Befehl eingeben:

```
netstat -anb -p tcp
```
Damit werden Dir alle TCP-Verbindungen und auch alle auf TCP-Ports horchenden Serverdienste inklusive des Programmnamens angezeigt. Du musst nach der Zeile mit dem exe-Namen des SQLServers suchen. Als IP müsste da entweder 0.0.0.0 (horcht auf allen Interfaces) oder eine IP des Servers stehen. Das hinter dem Doppelpunkt ist die Portnummer.


----------



## GianaSisters (4. Nov 2011)

Anzeigt wurde mir:
TCP 0.0.0.0:49167 [sqlservr.exe]
Alle anderen EXEs hatten nichts damit zu tun.

Als connectionURL hab ich: jdbc:sqlserver://TIMO-PC\SQLEXPRESS:49169;databaseName=master;Integrated Security=True;

verwendet.
Eine vermutliche endschlosschleife entsteht mit:

04.11.2011 16:40:57 com.microsoft.sqlserver.jdbc.SQLServerConnection Prelogin
WARNUNG: ConnectionID:1 Prelogin error: host TIMO-PC port 49169 Unexpected end of prelogin response after 0 bytes read
04.11.2011 16:40:57 com.microsoft.sqlserver.jdbc.SQLServerConnection Prelogin
WARNUNG: ConnectionID:1 Prelogin error: host TIMO-PC port 49169 Unexpected end of prelogin response after 0 bytes read
04.11.2011 16:40:57 com.microsoft.sqlserver.jdbc.SQLServerConnection Prelogin
WARNUNG: ConnectionID:1 Prelogin error: host TIMO-PC port 49169 Unexpected end of prelogin response after 0 bytes read
04.11.2011 16:40:57 com.microsoft.sqlserver.jdbc.SQLServerConnection Prelogin
WARNUNG: ConnectionID:1 Prelogin error: host TIMO-PC port 49169 Unexpected end of prelogin response after 0 bytes read
04.11.2011 16:40:58 com.microsoft.sqlserver.jdbc.SQLServerConnection Prelogin
WARNUNG: ConnectionID:1 Prelogin error: host TIMO-PC port 49169 Unexpected end of prelogin response after 0 bytes read
04.11.2011 16:40:58 com.microsoft.sqlserver.jdbc.SQLServerConnection Prelogin

Sieht auf jeden Fall schonmal ein bißchen vielversprechend aus... Hast Du nun noch eine Idee?


----------



## GianaSisters (4. Nov 2011)

AHHHH. Port war 49167 !!!! DANKE DANKE  Jetzt klappt alles... Die URL war dann:
jdbc:sqlserver://TIMO-PC\SQLEXPRESS:49167;databaseName=master;Integrated Security=True;


----------



## nillehammer (4. Nov 2011)

Ich nehme mal an TIMO-PC ist der Hostname des Servers? Ansonsten kommen mir noch zwei Sachen in Deiner Connection-URL spanisch vor:
- \SQLEXPRESS: Was ist das? Und bist Du Dir bei dem Backslash wirklich sicher?
- Integrated Security=True: Das Leerzeichen ist mir suspekt. Bist Du Dir da auch sicher?
Wie gesagt, es kommt mir spanisch vor. Kann sein, dass das sogar gültige Connection-URLs sind (Microsoft macht ja immer gern mal ein bischen Schweinkram). Aber bei Backslashes und Leerzeichen in URLs werde ich immer hellhörig.

// Edit: Antwort kam zu spät. Es passt wohl jetzt alles


----------



## GianaSisters (4. Nov 2011)

Wenn ich den das MS SQL Server Management Studio aufrufe erscheint bei der Anmeldung "TIMO-PC\SQLEXPRESS" als Servername. Als Authentifizierung hab ich SQL Server-Authentifizierung genommen. Beim rumgoogeln hab ich ausgefunden, dass man "Integrated Security=True;" wohl hinten dran setzen muss, damit er das nicht als "Windows-Authentifizierung" sieht. Vielleciht konnte sogar ich Dir damit was helfen...
Ohne "Integrated Security=True;" und "databaseName=master" scheints komischerweise auch zu funktionieren. Dabei ist master doch das Schema, komisch... kann man also bei MS SQL über mehrere Schemen Tabellen aufrufne ?!
Viele Grüße und großer Danke,
Giana / Timo


----------



## bronks (7. Nov 2011)

Nur zur Info, damit es nicht zu späteren Verwirrungen kommt.



GianaSisters hat gesagt.:


> Wenn ich den das MS SQL Server Management Studio aufrufe erscheint bei der Anmeldung "TIMO-PC\SQLEXPRESS" als Servername ... ...


SQLEXPRESS ist der Instanzname.




GianaSisters hat gesagt.:


> ... Dabei ist master doch das Schema, komisch... kann man also bei MS SQL über mehrere Schemen Tabellen aufrufne ...


Master heißt eine Systemdatenbank. Üblicherweise verbindet man sich nicht mit [Master] sondern mit seiner Datenbank, welche man angelegt hat.


----------



## GianaSisters (9. Nov 2011)

Leider hab ich nun an meinem richtigen Desktop Computer das Problem das ich keinen Port angezeigt bekomme und somit nicht auf die Datenbank zugreifen kann... Beim ausführen von Netstats bekomme ich die Ausgabe wie unten. Der Server läuft auf jedenfall und ich habe alle relevanten Ports durchprobiert. Wie finde ich den Richtigen ?

Aktive Verbindungen

  Proto  Lokale Adresse         Remoteadresse          Status
  TCP    0.0.0.0:135            0.0.0.0:0              ABH™REN
  RpcSs
 [svchost.exe]
  TCP    0.0.0.0:445            0.0.0.0:0              ABH™REN
 Es konnten keine Besitzerinformationen abgerufen werden.
  TCP    0.0.0.0:5357           0.0.0.0:0              ABH™REN
 Es konnten keine Besitzerinformationen abgerufen werden.
  TCP    0.0.0.0:49152          0.0.0.0:0              ABH™REN
 [wininit.exe]
  TCP    0.0.0.0:49153          0.0.0.0:0              ABH™REN
  eventlog
 [svchost.exe]
  TCP    0.0.0.0:49154          0.0.0.0:0              ABH™REN
  Schedule
 [svchost.exe]
  TCP    0.0.0.0:49155          0.0.0.0:0              ABH™REN
 [services.exe]
  TCP    0.0.0.0:49156          0.0.0.0:0              ABH™REN
 [lsass.exe]
  TCP    127.0.0.1:50331        0.0.0.0:0              ABH™REN
 [netbeans.exe]
  TCP    192.168.2.103:139      0.0.0.0:0              ABH™REN
 Es konnten keine Besitzerinformationen abgerufen werden.
  TCP    192.168.2.103:49152    192.168.2.103:51072    WARTEND
  TCP    192.168.2.103:49152    192.168.2.103:51073    WARTEND
  TCP    192.168.2.103:49155    192.168.2.103:51074    WARTEND
  TCP    192.168.2.103:49155    192.168.2.103:51075    WARTEND
  TCP    192.168.2.103:49155    192.168.2.103:51076    WARTEND
  TCP    192.168.2.103:49155    192.168.2.103:51077    WARTEND
  TCP    192.168.2.103:49155    192.168.2.103:51078    WARTEND
  TCP    192.168.2.103:49155    192.168.2.103:51079    WARTEND
  TCP    192.168.2.103:49155    192.168.2.103:51080    WARTEND
  TCP    192.168.2.103:49155    192.168.2.103:51081    WARTEND
  TCP    192.168.2.103:49155    192.168.2.103:51082    WARTEND
  TCP    192.168.2.103:49155    192.168.2.103:51083    WARTEND
  TCP    192.168.2.103:51087    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51091    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51092    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51093    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51096    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51097    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51099    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51100    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51101    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51102    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51103    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51104    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51105    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51106    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51108    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51109    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51110    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51111    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51112    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51114    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51115    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51117    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51118    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51119    85.158.183.169:80      WARTEND
  TCP    192.168.2.103:51120    85.158.183.169:80      WARTEND


----------



## bronks (9. Nov 2011)

GianaSisters hat gesagt.:


> Leider hab ich nun an meinem richtigen Desktop Computer das Problem das ich keinen Port angezeigt bekomme und somit nicht auf die Datenbank zugreifen kann...


Kommst Du mit dem Management Studio drauf?


----------



## GianaSisters (9. Nov 2011)

Ja damit komm ich drauf und kann alles machen... Sorry für die späte Antwort - mußte eine Frustradtour machen


----------



## bronks (9. Nov 2011)

GianaSisters hat gesagt.:


> .... mußte eine Frustradtour machen


Was für ein Zufall. Das gleiche habe ich auch gerade gemacht. 

Zum Problem: Dann mußt Du wohl erst im SQL Server Configuration Manager TCP/IP auf Enabled setzten.


----------



## GianaSisters (9. Nov 2011)

Danke es funktioniert !!!


----------



## bronks (9. Nov 2011)

GianaSisters hat gesagt.:


> Danke es funktioniert !!!


Wunderbar! Dann viel Erfolg damit!


----------



## tomier (9. Jan 2013)

Hey Leute,

Ich habe das gleiche Problem aber verwende Microsoft SQL Server 2012 Express:

Meine Fehlermeldung

```
com.microsoft.sqlserver.jdbc.SQLServerException: Fehler beim Herstellen der TCP/
IP-Verbindung mit dem Host 'localhost', Port 1433. Fehler: 'Connection refused:
connect. ü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.
java.lang.NullPointerException
```

Ich verwende SQL-Server-Authentifizierung - Über das Management Studio komme ich mit "sa" und "12345678" hinein.
Meine Datenbank heißt "etikettenaustausch".

Mein Hostname: "LIEFERSCHEIN" und die Instanz "SQLEXPRESS" (Somit LIEFERSCHEIN\SQLEXPRESS".




```
/**
   * Connection to SQLServer Database
   */
  private static Connection getSQLServer2012Connection() {
    Connection con = null;
 
    try {
        Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
      String URL = "jdbc:sqlserver://localhost;database=etikettenaustausch;integratedSecurity=true;";
	  String login = "sa";
	  String mdp = "12345678";
  	con = DriverManager.getConnection(URL,login,mdp);
    } catch (Exception e) {
      System.out.println(e);
    }
    return con;
  }
```

Habt ihr eine Idee was das sein könnte?


----------



## maki (9. Jan 2013)

Lauscht der Server denn am Port 1433?
Lässt sich zB. mit telnet prüfen.
Falls nicht -> öffnen


----------



## tomier (9. Jan 2013)

Also Telnet localhost 1433 (Weil es lokal läuft der SQL Server 2012)?

Da sagt er keine Verbindung kann hergestellt werden ..mmhh

ich habe aber in der Windows-Firewall erweitert, sowohl ein- und ausgehende Regel den Port 1433 zugelassen für alle??


----------



## maki (9. Jan 2013)

Sehe da kein Firewall Problem.
Bei aktuelleren SQL Servern wird von Haus aus nicht mehr am Port 1433 gelauscht, musst du konfigurieren.


----------



## tomier (9. Jan 2013)

wie würdest du das machen? fix in Programm und im Server konfigurieren oder wie?


----------



## maki (9. Jan 2013)

Ich würde den Server konfigurieren...


----------



## bronks (9. Jan 2013)

tomier hat gesagt.:


> wie würdest du das machen? fix in Programm und im Server konfigurieren oder wie?


Wie in Post #13 ... Configuration Manager ... da steht dann auch die Portnummer


----------



## tomier (10. Jan 2013)

Das Problem habe ich erst mit dem Sql Server 2012 der 2005 ging einwandfrei.

Ich habe Alle IPs im Konfigur. Manager so eingestellt also fixer Port.

Beim 2005 habe ich diesen tdjs Treiber verwendet beim 2012 deen offiziellen microsoft und davon die jar Datei jdbc4.

Es geht trotzdem nicht.


----------



## tomier (10. Jan 2013)

Lösung:

Man muss unten bei der Option "AllIp" den dynamischen Port auf 0 stellen und beim Port dann den fixen z.b.: 1433 eingeben und beim der IP-Option, wo localhost bzw. 127.0.0.1 steht dann auch 1433 hineinschreiben.

Danach sich wie ich jetzt grad mit irgendeiner auth.dll rumschlagen...


----------



## bronks (11. Jan 2013)

tomier hat gesagt.:


> Danach sich wie ich jetzt grad mit irgendeiner auth.dll rumschlagen...


Wenn Du keine WinAuth brauchst, dann schreib in den Connectionstring integratedSecurity=false, denn dann brauchst Du auch die auth.dll nicht.


----------

