# Mac OS X und JDBC - Irgendwas ist hier faul!



## Bibo1987 (9. Dez 2009)

Hallo Entwicklerkollegen.

Ich entwickel noch nicht lange mit Java und habe täglich meine kleinen Probleme und bin hier immer auf sehr gute Antworten gestoßen.

Deshalb denke ich, das mir jemand mit meinen Problem weiterhelfen kann...

Folgendes:
Ich schreibe zur Zeit ein kleines Tool mit NetBeans unter Windows XP.
Diese Applikation soll später auch auf MAC laufen.

Bislang habe ich alles so Programmiert, das es unter Windows 100%ig läuft, und eigentlich AUCH auf MAC laufen sollte... Sprich mit OS unterscheidung...
So, jetzt lass ich das Programm auf dem MAC laufen.

Es kommt folgender Fehler:

```
MacBook-Pro:CumulusCheckInTool MatthiasThien$ java -jar Cumulus_Checkin_Tool.jar
09.12.2009 12:47:09 com.microsoft.sqlserver.jdbc.AuthenticationJNI <clinit>
WARNUNG: Failed to load the sqljdbc_auth.dll
com.microsoft.sqlserver.jdbc.SQLServerException: Dieser Treiber ist nicht f?r integrierte Authentifizierung konfiguriert.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:170)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.sendLogon(SQLServerConnection.java:2338)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.logon(SQLServerConnection.java:1929)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.access$000(SQLServerConnection.java:41)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection$LogonCommand.doExecute(SQLServerConnection.java:1917)
	at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:4026)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:1416)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connectHelper(SQLServerConnection.java:1061)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.login(SQLServerConnection.java:833)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.connect(SQLServerConnection.java:716)
	at com.microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.java:841)
	at java.sql.DriverManager.getConnection(DriverManager.java:582)
	at java.sql.DriverManager.getConnection(DriverManager.java:207)
	at X.DataBaseInteraction.AlleProfile(DataBaseInteraction.java:235)
	at X.Form_Einchecken.ListeFuellen(Form_Einchecken.java:195)
	at X.Form_Einchecken.formWindowOpened(Form_Einchecken.java:149)
	at X.Form_Einchecken.access$000(Form_Einchecken.java:15)
	at X.Form_Einchecken$1.windowOpened(Form_Einchecken.java:57)
	at java.awt.AWTEventMulticaster.windowOpened(AWTEventMulticaster.java:322)
	at java.awt.Window.processWindowEvent(Window.java:1859)
	at javax.swing.JFrame.processWindowEvent(JFrame.java:279)
	at java.awt.Window.processEvent(Window.java:1820)
	at java.awt.Component.dispatchEventImpl(Component.java:4714)
	at java.awt.Container.dispatchEventImpl(Container.java:2143)
	at java.awt.Window.dispatchEventImpl(Window.java:2475)
	at java.awt.Component.dispatchEvent(Component.java:4544)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:635)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
```
X steht natürlich für mein Package, Datenschutz, sry.

Unter Windows musste ich ja die genannte sqljdbc_auth.dll in das System integrieren.

Doch unter MAC, da denke ich das dieses so nicht möglich ist.

Seh ich das Richtig, das es an dem Treiber liegt, das die Authentifizierung fehl schlägt, und ich deswegen keine Verbindung zum SQL Server bekomme???

Wenn Code oder ähnliches benötigt wird, bin ich gerne Bereit alles zu Posten, was gebraucht wird.

Ich weiß ihr könnt mir helfen!
Dafür danke ich euch im Vorraus

Viele liebe Grüße
Der Bibo


----------



## maki (9. Dez 2009)

Ich nutzte nie den MS JDBC Treiber für den MS SQL Server, da jTDS viel besser funzt und da auch nicht istalliert werden muss, funzt sogar von Linux aus


----------



## Bibo1987 (9. Dez 2009)

Hey maki!

Danke für die schnelle Antwort.

Wie schon gesagt, ich programmiere noch nicht so lange mit Java, und wir nutzen halt nur den MS SQL Server 2008.

Und der JDBC Treiber ist das erste was ich gefunden habe, was auch funktioniert hat.

Aber der JTDS Treiber lockt mich persönlich ja schon. Nicht nur wegen "OpenSource" sondern auch wegen



> Being a type 4 driver, jTDS does not need any special installation. Just drop the jar file into your application's classpath and you're done.



Gut, ich werde mich mir mal den JTDS angucken...

Vielen Dank

Grüße
Bibo1987


----------



## bronks (13. Dez 2009)

> ... Being a type 4 driver, jTDS does not need any special installation. Just drop the jar file into your application's classpath and you're done ...


Gerne würde ich Erfahren:
- Was für eine special installation beim MS Treiber nötig ist?
- Warum ich das Jar des MS Treibers nicht einfach into my application's classpath droppen kann?
- Was im Detail am jTDS besser ist?


----------



## Bibo1987 (15. Dez 2009)

> - Was für eine special installation beim MS Treiber nötig ist?



Man muss eine DLL Datei (irgendwie auth_jdbc.dll oder so ähnlich) in den system32 Ordner kopieren (installieren).



> - Warum ich das Jar des MS Treibers nicht einfach into my application's classpath droppen kann?



Weil das muss man sowieso machen, aber dann fehlt halt noch die auth bla .dll und ohne diese DLL funktioniert der vorgang nicht.



> - Was im Detail am jTDS besser ist?


[/QUOTE]

- Open Source
- Genau so einfach zu implementieren wie der JDBC (ich meine sogar etwas einfacher)

Und als Fazit:

Ich find den jTDS gut!


----------



## maki (15. Dez 2009)

Ich muss ehrlich sagen dass ich jTDS schon seit 2004 nutze, die damalie Alpha/Beta Version des Original MS Treibers hatte ganz schöne Probleme, k.A. ob es jetzt mit der 1.0 Version besser ist, aber wozu wechseln wenn jTDS funzt & erprobt ist?


----------



## Bibo1987 (15. Dez 2009)

maki hat gesagt.:


> Ich muss ehrlich sagen dass ich jTDS schon seit 2004 nutze, die damalie Alpha/Beta Version des Original MS Treibers hatte ganz schöne Probleme, k.A. ob es jetzt mit der 1.0 Version besser ist, aber wozu wechseln wenn jTDS funzt & erprobt ist?



Ich bin ja jetzt von JDBC auf jTDS gewechselt und finde des gut...

Also JDBC hat bei mir keinerlei probleme verursacht, und hat auch alles funktioniert... Nur halt soll die App ja unter MAC laufen und da ist der JDBC Treiber sehr ungeeignet 

MFG


----------



## bronks (15. Dez 2009)

Ne, ne das stimmt so nicht. Je nach JRE braucht man bei der V2.0 nur die sqljdbc.jar bzw. sqljdbc4.jar. Die .dll ist nur nötig, wenn man die WinAuth verwenden möchte. Sollte es so sein, daß ein MAC keine WinAuth unterstützt, dann darfst Du diese entsprechend nicht parametrieren.


----------



## Bibo1987 (16. Dez 2009)

bronks hat gesagt.:


> Ne, ne das stimmt so nicht. Je nach JRE braucht man bei der V2.0 nur die sqljdbc.jar bzw. sqljdbc4.jar. Die .dll ist nur nötig, wenn man die WinAuth verwenden möchte. Sollte es so sein, daß ein MAC keine WinAuth unterstützt, dann darfst Du diese entsprechend nicht parametrieren.



Naja, ich hab einiges versucht, und erst nachdem die dll datei im system32 Ordner war, hat das funktioniert... also unter windows

und unter mac Funktioniert das mit den jTDS halt von erster sekunde an...

mfg


----------



## bronks (16. Dez 2009)

Bibo1987 hat gesagt.:


> Naja, ich hab einiges versucht, und erst nachdem die dll datei im system32 Ordner war, hat das funktioniert... also unter windows ...


Könntest Du mir bitte zeigen, wie Deine Datenbankverbindung parametriert ist bzw. wie der ConnectionString aussieht.


----------



## Bibo1987 (16. Dez 2009)

Ja, natürlich 

Also mit dem jTDS ist das so:


```
private final String db_connect_string = "jdbc:jtds:sqlserver://meindbserver:1433/meineDatenbank";
    private final String db_userid = "user";
    private final String db_password = "spassword";

    dbCon = DriverManager.getConnection(db_connect_string, db_userid, db_password);
```

Und mit dem JDBC sieht das ganze so aus


```
//Datenbankinformationen
    private final String dbDriverURL = "jdbc:sqlserver://";
    private final String dbPort ="1433";
    private final String dbServer = "meindbserver";
    private final String dbDataBase = "meineDatenbank";
    private final String dbAuthUser = "ususer";
    private final String dbAuthPass= "spassword";

    //Initialisierung der Connection
    private Connection dbCon = null;

    public final String getConnection()
    {
        return (this.dbDriverURL+this.dbServer+":"+this.dbPort+";"+
                "databaseName="+this.dbDataBase+";" +
                "user="+this.dbAuthUser+";" +
                "password="+this.dbAuthPass+";"+
                "integratedSecurity=true;");
    }

[/Java]

und dann halt immer dbCon = DriverManager.getConnection(getConnection());

Wie gesagt, ich bin kein Profi :P
```


----------



## bronks (16. Dez 2009)

Sorry wenn ich es geahnt bzw. gewußt hätte, dann hätte ich es Dir schon früher geschrieben ... ...

Das Problem liegt in der Zeile 19 und 20 in o.g. Code. Sobald Du ";integratedSecurity=true" in der URL stehen hast, dann erzwingst Du WinAuth, welche wie ich jetzt weiß auf einem MAC nicht exisitiert. Sonst funktioniert MS-Treiber auch auf Linux, aber auch nur ohne integratedSecurity.


----------



## Bibo1987 (16. Dez 2009)

Vielen Dank!



Ich habs gerade ausprobiert, und das funktioniert tatsächlich auch mit dem JDBC Treiber und mit integratetSecurity = false...

MfG


----------

