# JDBC mit MS-SQL



## Zweistein (26. Okt 2004)

Wie stellt man eine JDBC-Verbindung mit der MS-SQL-SERVER-Datenbank her. 
Ich verwende das Beispiel-Programm lt.: http://support.microsoft.com/default.aspx?scid=kb;en-us;313100 
Mein Server ist: SERVER1\SQL_SERVER1 
Ist das wirklich der einzutragende Servername (hostname)? 
Ich erhalte dabei folgende Fehlermeldung: 
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket. 
    at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source) 
    at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source) 
    at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source) 
    at com.microsoft.jdbc.sqlserver.tds.TDSConnection.(Unknown Source) 
    at com.microsoft.jdbc.sqlserver.SQLServerImplConnection.open(Unknown Source) 
    at com.microsoft.jdbc.base.BaseConnection.getNewImplConnection(Unknown Source) 
    at com.microsoft.jdbc.base.BaseConnection.open(Unknown Source) 
    at com.microsoft.jdbc.base.BaseDriver.connect(Unknown Source) 
    at java.sql.DriverManager.getConnection(DriverManager.java:512) 
    at java.sql.DriverManager.getConnection(DriverManager.java:171)


----------



## Bleiglanz (26. Okt 2004)

Error establishing socket

=> Netzwerkverbindung OK?

=> lauscht der Server auf dem Richtigen Port?

=> Benutzername & Kennwort OK?

SERVER1\SQL_SERVER1 

versuchs erstmal mit der IP Adresse 

welche URL nimmst du?


----------



## Zweistein (26. Okt 2004)

Netzwerk-Verbindung ist ok: ping auf Server1 (=192.1.1.254) funktioniert.
Der Port ist der Default-Port (1433) und wurde auch nicht verändert.
Benutzername und Kennwort (Passwort) sind auch Ok.
Ich habs versucht mit 192.1.1.254.
Ich habs versucht mit SERVER1.
Ich habs versucht mit SQL_SERVER1.
und natürlich auch mit SERVER1\\SQL_SERVER1 (=SERVER1\SQL_SERVER1).

Was bedeutet hostname?
a) Die IP-Adresse (oder Name) des PCs, aber welche Instanz des SQL-Servers nimmt er dann?
b) Die Instanz des SQL-Servers (SQL_SERVER1), aber wie findet er dann den Rechner dieser Instance?
c) Die Kombination beider Parameter (SERVER1\SQL_SERVER1)
d) oder irgend ein anderer Name der nicht zu finden ist.

Ich habe erfolgreiche JDBC-Verbindungen mit Sybase Anywhere, Oracle und SAP-Datenbanken hergestellt.
Aber mit Microsoft scheint es trotz richtiger Treiber (2 verschiedene probiert) nicht zu klappen.


----------



## Bleiglanz (27. Okt 2004)

egal welchen treiber du nimmst, als host nimmt man normalerweise

SERVER1 oder die IP

die Instanz (bei dir SQL_SERVER1) spielt dabei erst mal keine Rolle, die wird normalerweise in der URL angegeben

ist das die DefaultInstanz auf dem SERVER1? ist es die einzige Instanz auf dem SERVER1? dann kannst du sie weglassen, wenn nicht musst du in die Doku für deinen Treiber schauen, wie die URL genau aufgebaut werden muss!


----------



## Bleiglanz (27. Okt 2004)

>>Error establishing socket. 

Frage: kannst du mit ACCESS auf dem Client auf die Datenbank zugreifen? Vielleicht sind die Netzwerkeinstellungen des SQL-Servers nicht richtig??


----------



## Guest (27. Okt 2004)

Ich kann mit c# auf die Datenbank (bzw. Parallel-Datenbank auf der gleichen Instance) zugreifen.
Mit dem Enterprise-Manager und Dataarchitekt (über ODBC) kann ich auf diese Datenbank zugreifen.
Ich hab nur eine Instance auf diesem Server.
URL=jdbc:microsoft:sqlserver://192.1.1.254:1433/AU


----------



## Bleiglanz (27. Okt 2004)

welchen treiber nimmst du eigentlich?

ich verwende jdts und es funktioniert genau so, mit folgender jar:

jtds-0.9-rc2.jar


----------



## Zweistein (27. Okt 2004)

Zuerst habe den Treiber net.avenir.jdbc3.Driver probiert.
Danach den von Microsoft: com.microsoft.jdbc.sqlserver.SQLServerDriver
und nun den in jtds-0.9-rc2.jar (net.sourceforge.jtds.jdbc.Driver, URL=jdbc:jtds:sqlserver://192.1.1.254:1433/AU).

Aber mit keinen dieser Treiber schaffe ich eine Verbindung zur MS-SQL-DB.
Ich verwende JDK 1.4.2_06, kann das damit zusammenhängen ?


----------



## Bleiglanz (28. Okt 2004)

Nein, würde mich wundern! Hast du immer noch

>>Error establishing socket

Wenn du mit dem Enterprise-Manager nach Datenbanken suchst, ist dann 

    SERVER1\\SQL_SERVER1

wirklich der einzige Eintrag für den SERVER1

Wie ist das Netzwerk für die DB konfiguriert (NamedPipes und TCP/IP usw???)

ansonsten keine Ahnung!


----------



## Zweistein (28. Okt 2004)

Es ist wirklich der einzige Eintrag (auch im gesamten internen Netzwerk).

Bei Clientkonfiguration ist folgendes Eingestellt:
TCP/IP
Serveralias: SERVER1\SQL_SERVER1
Servername: SERVER1\SQL_SERVER1
Anschluss dynamisch bestimmen ist angeklickt.

Selbst über ODBC schaffe ich keine Verbindung von Java zur MS-Datenbank.
Eine ODBC-Verbindung von Java zur Sybase-Datenbank funktioniert aber
und eine ODBC-Verbindung von DataArchitekt zur MS-Datenbank funktioniert ebenfalls.

Den Fehler "Error establishing socket" erhalte ich nur beim Beispielprogramm mit meinen Parametern.


----------



## Bleiglanz (28. Okt 2004)

neue Idee

ist die Authentifizierung nur über Windows möglich? 

oder ist Windows + SQL-Server eingestellt (das muss sein, weil der JDBC-Treiber ja die Windows-Credentials nicht mitschicken kann)


----------



## Zweistein (29. Okt 2004)

Es ist "Mit SQL Server-Authentifizierung anhand des vom Benutzer eingegebenen Benutzernamens und Kennworts" eingestellt, weil sonst eine freie Name und Passwort-Wahl für die Datenbank nicht möglich ist.
Wo kann man einstellen, welche Authentifizierung für JDBC verwendet wird?

Einen 1. Teilerfolg kann ich verzeichnen:
Eine Verbindung über ODBC zur MS-Datenbank über Java ist nun möglich
 durch die Angabe von Name und Passwort auch in Java, nicht nur im ODBC-Treiber.

Eine JDBC-Verbindung zu MS funktioniert aber nach wie vor nicht.


----------



## Bleiglanz (29. Okt 2004)

schau mal bei freetds nach, irgendwo war da mal eine liste mit den genauen specs für die url


----------



## Dennis (9. Mrz 2005)

Hallo Zweistein,

hast Du die Lösung für Dein Problem denn letztendlich gefunden? Würde mich nämlich auch sehr interessieren, da ich vor dem gleichen Problem stehe.   

Viele Grüße
Dennis


----------



## thE_29 (9. Mrz 2005)

Die Suchfunktion ist schon schwer....


http://www.java-forum.org/de/viewtopic.php?t=14789

letzter Beitrag!

Der String muß so aussehen sonst gehts net!


Natürlich mit benutzer und passwort (aber das ist ja klar..)


----------



## Dennis (9. Mrz 2005)

Ich verstehe den Aufruf leider nicht!?

Wenn ich folgenden Auruf mache:
jdbc:microsoft:sqlserver://127.0.0.1\192.168.88.21:1433;databaseName=Northwind
funktioniert es nicht. Aber wozu muss ich denn einmal localhost aufrufen (=127.0.0.1) und dann nochmal die IP des SQL Servers (=192.168.88.21)? Oder hab ich da jetzt was total mißverstanden?


----------



## Bleiglanz (9. Mrz 2005)

dürfte falsch sein, der zweite teil ist der instanzname der datenbank

also etwa 127.0.0.1 für die Default Instanz

oder 127.0.0.1\MSDE wenn auf dem Rechner auch noch eine MSDE läuft usw. usw.


----------



## thE_29 (10. Mrz 2005)

Du mußt die Adresse eingeben und net Localhost!

Das ist nur wenn der Server auch auf deinem PC läuft (bisi logisch denken ist schon schwer....).

Desweitern hat der SQL Server immer einen Namen, bsp von Bleiglanz wäre MSDE, dann würde es so aussehn

jdbc:microsoft:sqlserver://192.168.88.21\MSDE:1433;databaseName=Northwind


----------



## [RTB]H3r0 (10. Mrz 2005)

*mist


----------



## [RTB]H3r0 (10. Mrz 2005)

das ist doch unnötig....
Die Angabe des Instabzname ist optional.
hast du mehrere Instanzen des SQL-servers laufen??
ich denke nicht.
jdbc:microsoft:sqlserver://passus.dyndns.ws:1433;user=_NAME_;Password=_PASSWORD_;databasename=_startCatalog_

wäre eine gültige url.
getConnection ist überladen.
ich würde immer nur eine Parameter übergeben, nämlich diesen 'ConncetionString';
in der Hilfe stehen noch einige weitere Optionale Parameter für dieses Konstrukt.

gl.


----------



## thE_29 (10. Mrz 2005)

Jo, ich habs immer mit usernamen und passwort extra gemacht, da bei mir der String in der registry steht und wenn da ein pw steht, kommt das net so gut ^^


----------



## [RTB]H3r0 (10. Mrz 2005)

irgenwo MUSS es ja stehen...


----------



## thE_29 (10. Mrz 2005)

Nö, eingabe


----------



## Dennis (10. Mrz 2005)

Sorry, ich krieg das nicht auf die Kette. Wenn ich ein Applet auf meinem PC laufen habe (mit JDK Installation) und ich möchte Daten in einen Stink normalen SQL Server schreiben lassen, dann mache ich doch nach Eurer Aussage folgenden Aufruf:

jdbc:microsoft:sqlserver://192.168.88.21\MEINMSSQLSERVERNAME:1433;databaseName=Northwind

Wenn ich das aber so eingebe, kommt eine Fehlermeldung beim komilieren:

"illegal escape character" beim backslash.
Echt sorry wenn ich das nicht so gepeilt kriege, aber ich verstehs nicht. bin noch java neuling, daher bitte um nachsicht.


----------



## Dennis (10. Mrz 2005)

Das Posting bezog sich noch auf the_29 und Bleiglanz


----------



## Dennis (10. Mrz 2005)

@[RTBH3r0:
Auch nach Aufruf
jdbc:microsoft:sqlserver://passus.dyndns.ws:1433;user=NAME;Password=PASSWORD;databasename=startCatalog 

bleibt die Fehlermeldung bestehen. Leider...


----------



## thE_29 (10. Mrz 2005)

jdbc:microsoft:sqlserver://192.168.88.21\MEINMSSQLSERVERNAME:1433;databaseName=Northwind 

der Fehler ist dass, das du 2 \\ machen mußt, damit der Compiler dir das in 1 \ umwandlet, also so

jdbc:microsoft:sqlserver://192.168.88.21\\MEINMSSQLSERVERNAME:1433;databaseName=Northwind


Dachte das wäre jetzt schön langsam klar, da man immer 2 \ braucht um 1en \ darzustellen!


----------



## Dennis (10. Mrz 2005)

Leider kannte ich das bisher nur von PHP aber noch nicht von Java. Aber Danke jetzt weiß ich es. 

jdbc:microsoft:sqlserver://192.168.88.21\\MEINMSSQLSERVERNAME:1433;databaseName=Northwind 

produziert leider die Fehlermeldung:

The requested instance is either invalid or not running.


----------



## Bleiglanz (11. Mrz 2005)

läuft auf deinem rechner eine instanz mit namen

MEINSQLSERVERNAME

?

wenn du nur einen einzigen sqlserver laufen hast, dann ist die angabe des servernamens i.A. überflüssig

verwechsle nicht

 "host" = IP-Adresse bzw. WINS name des Rechners

"instanz" = ein Prozess auf dem host, der die db darstellt


----------



## [RTB]H3r0 (11. Mrz 2005)

natürlich SOLLTE man nur eine Instanz angeben, wenn auch MEHERE laufen. ansonsten ist diese angabe unnötig.
Instanz ist NICHT DIE DATENBANK, die dann geöffnet widr.
diese wird eben mit dem Parameter databasename
übergeben.
nimm das:

```
url="jdbc:microsoft:sqlserver://192.168.88.21:1433;databaseName=Northwind"
```

wenn der server local bei dir ist, dann nimm auch lieber die Localhost-Ip  127.0.0.1

wenn jetzt die connection aufgebaut wird, dann mit 

```
DriverManager.getConnection(url,"userName","password");
```

good luck.


----------



## Dennis (11. Mrz 2005)

Also wir haben nur einen SQL Server laufen. Das Applet läuft momentan auf einem Client (Win XP) und der SQL Server auf einem Win2k Server. 
Wenn ich das Beispiel von [RTB]H3r0 nehme, bringt er wieder den Fehler: 

Error establishing socket.

Kann das eventuell mit irgendwelchen gesperrten Ports zusammenhängen? Also der SQL läuft definitv auf Port 1433. Irgendwas am Client noch einzustellen?


----------



## [RTB]H3r0 (11. Mrz 2005)

ahhh ha.
das heisst, das keine netzwerk verbindung besteht.

ich weiss auch nicth wie das explizit mit Applets funktioniert.
da muss mann glaube ich auch die java.security mitverwalten.

der client braucht ne physicalischje verbindung.
sollte der Server den zugriff blocken, dann gibts ne andere fehler meldung.


----------



## Dennis (11. Mrz 2005)

Also ne Netzwerkverbindung besteht auch zu 100 %. Der SQL Server hängt an nem Switch und der Client auch! Ich kann ja auch mit anderen Programmen auf den SQL zugreifen. Oder wie meinst Du das mit physikalische Verbindung?


----------



## Bleiglanz (11. Mrz 2005)

ein applet darf nicht sockets zu fremden rechnern aufbauen!


----------



## neznajka (21. Jun 2005)

Bleiglanz hat gesagt.:
			
		

> ein applet darf nicht sockets zu fremden rechnern aufbauen!


unsinn, bei mir geht alles wunderbar.


----------



## Bleiglanz (22. Jun 2005)

glaub ich nicht

(natürlich gehts - wenn signiert)


----------

