3 Stimmen

Wie greift man von Cocoa (Mac OS X) auf SQL Server zu?

Wie die Frage schon sagt:
Wie greift man auf Microsoft SQL Server 2005 von Cocoa unter Mac OS X 10.5 zu?
Der Datenbanktreiber sollte möglichst kostenlos sein, kostenpflichtige Lösungen sind aber auch in Ordnung.

3voto

Paul Lefebvre Punkte 6118

Wenn Sie ODBC verwenden, stellt Actual Technologies einen Microsoft SQL Server Treiber für OS X her:

http://www.actualtechnologies.com/product_sqlserver.php

2voto

Brent Ozar Punkte 13049

Ein wenig Googeln legt diese Frage nahe:

http://lists.apple.com/archives/Cocoa-dev/2004/Jul/msg00077.html

Das deutet auf diese beiden Anwendungen hin:

Entsprechen diese Ihren Bedürfnissen? Wenn nicht, können Sie die Frage näher erläutern? Vielen Dank!

0 Stimmen

Welche Google-Suchbegriffe führten Sie zu dieser Seite? Ich war nach 3 Versuchen erfolglos.

0 Stimmen

Nun, diese Antwort ist mehrere Monate alt, so dass ich meine Suchbegriffe vergessen habe. Normalerweise hänge ich Wörter mit Punkten aneinander, wie sql.server os.x, und das funktioniert ziemlich gut.

0voto

Daniel Punkte 4637

FreeTDS ist ziemlich gut und ziemlich einfach von Objective-C aus zu benutzen, da es eine C-API hat. Ein noch einfacherer Weg ist jedoch die Verwendung des jTDS JDBC-Treibers über die Java-Bridge. Ich weiß, dass Apple die Verwendung der Java-Bridge nicht mehr empfiehlt, aber es ist wahrscheinlich der einfachste Weg, um mit SQL Server zu kommunizieren, und wenn Sie Ihren Code gut strukturieren, mit so ziemlich jeder anderen Datenbank auf dem Planeten.

0 Stimmen

Da Apple die Java-Bridge nicht mehr empfiehlt, werde ich sie nicht verwenden. Was ist, wenn in 10.6 oder später die Brücke verschwindet? Trotzdem vielen Dank für den Kommentar zu FreeTDS.

0 Stimmen

Soviel ich weiß, werden sie es nicht ganz aufgeben. Sie fügen nur keine neuen Funktionen hinzu.

0voto

Nostradamus Punkte 1397

Ich kommentiere dies, weil dies eines der Top-Ergebnisse bei einer Google-Suche für das Hinzufügen von SQL Server-Konnektivität zu einer Cocoa (MacOS) Anwendung ist, aber ich sehe keine aktuellen Lösungen aufgelistet.

FreeTDS - wie Daniel vorgeschlagen hat, ist der schnellste/einfachste Weg, aber es gibt einige Informationen darüber, wie man das ohne die gefürchtete Java-Bridge oder einen Python-Hack hinbekommt. Erstellen Sie FreeTDS mit Homebrew (versuchen Sie um Himmels willen nicht, es selbst auf dem Mac zu erstellen), wählen Sie dann Ihr Projekt im Xcode-Finder aus, wählen Sie die Registerkarte "Build-Phasen", und verknüpfen Sie dann unter "Binärdateien mit Bibliotheken verknüpfen" die FreeTDS-Bibliothek libsybdb (entweder die dynamische oder die statische). Klicken Sie auf das "+"-Zeichen, wählen Sie dann "andere hinzufügen" und navigieren Sie zu dem Verzeichnis, in dem sich die Bibliotheken befinden - bei mir war das Verzeichnis, in dem die Bibliotheken installiert waren

/usr/local/Cellar/freetds/1.00.109/lib

dann wählen Sie (z. B.) libsybdb.a in diesem Verzeichnis

Sie können dann die FreeTDS-API verwenden oder einen Wrapper wie dieses von Martin Rybak was ich auch getan habe (ich verwende eine alte Version dieses "SQLClient"-Codes). Es funktioniert ziemlich einfach für eine SQL Server-Instanz auf AWS und vorhersehbar etwas komplizierter für eine Azure AWS-Instanz - ich musste den Wrapper hacken, da der Wrapper-Code einen "use db"-Befehl an Azure nach der Anmeldung ausgibt, den Azure nicht akzeptiert - für Azure muss die Datenbank während der Verbindung festgelegt werden - stattdessen fügte ich (mit dem neueren Code von GitHub):

DBSETLDBNAME(_login, [host UTF8String]);

in der Datei SQLClient.m, die ich dem Abschnitt hinzugefügt habe:

DBSETLUSER(_login, [username UTF8String]);
DBSETLPWD(_login, _password);
DBSETLHOST(_login, [host UTF8String]);
DBSETLCHARSET(_login, [self.charset UTF8String]);

und ich habe es kommentiert:

    if (database) {
        _returnCode = dbuse(_connection, [database UTF8String]);
        if (_returnCode == FAIL) {
            [self connectionFailure:completion];
            return;
        }
    }

Meine App ist Swift-basiert, also verwende ich einen Bridging Header, der dazugehört:

#import SQLClient.h

Um die Lib zu verwenden, etwas wie (Pseudocode, da ich nicht vor meinem Code gerade jetzt):

let client = SQLClient.sharedInstance()
//I'm using the older code which uses a delegate and not notifications callback 
self.client!.delegate = self
self.client!.connect("database_network_address", username: "username", password: "password", database: "database_name", completion: { (success) -> Void in
         if(success) {
                    print ("connection has succeeded")
// now do something with the connection
                    self.client!.execute("select * from table_name", completion: { (data) -> Void in
    //... do something with the returned array "data" per the wrapper API
    })
        } else {
        print ("connection has NOT been success")
      }
   })

Lassen Sie es mich wissen, wenn Sie irgendwelche Fragen dazu haben. Dies funktioniert absolut für eine Cocoa-App, ich verwende meine App, um Tonnen von Daten in eine Azure SQL Server-Instanz hochzuladen. Viel Glück!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X