SQLConnect mit Firebird [gelöst]
-
Hallo,
ich versuche gerade eine Verbindung zu meiner Firebird Datenbank aufzubauen. Aber meine Versuche scheitern an der Funktion SQLConnect(). Als Fehlermeldung bekomme ich folgendes:
"[Microsoft][ODBC Driver Manager] Ungültige Zeichenfolgen- oder Pufferlänge"Also dass es sich um eine ungültige Pufferlänge handelt, glaube ich nicht. Wie ihr im unten stehenden Programmcode sehen könnt, benutze ich als Pufferlänge das Flag "SQL_NTS", was für "null-terminated string" steht.
Also mache ich wohl bei der Zeichenfolge was falsch. An dieser Stelle habe ich schon einiges versucht, und auch mit Google gesucht und in der Hilfe geschaut, die mit dem Treiber installiert wurde (Habe den Win32 Installer ausgeführt (http://www.firebirdsql.org/en/odbc-driver/)).
Aber ich weiß nicht wie ich den Treiber, den Server und die Datenbank der Funktion SQLConnect() korrekt übergebe.
#include <stdio.h> #include <Windows.h> #include <tchar.h> #include <sql.h> #include<sqltypes.h> #include<sqlext.h> int _tmain(int argc, _TCHAR* argv[]) { SQLHANDLE hdlEnv; SQLHANDLE hdlConn; SQLRETURN ergebnis; ergebnis = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hdlEnv); ergebnis = SQLSetEnvAttr(hdlEnv,SQL_ATTR_ODBC_VERSION,(void*)SQL_OV_ODBC2,NULL); ergebnis = SQLAllocHandle(SQL_HANDLE_DBC, hdlEnv, &hdlConn); char* serverName = "DRIVER=Firebird/InterBase(r) driver; UID=SYSDBA; PWD=masterkey; DBNAME=192.168.0.21/3050:D:/Datenbank.fdb;"; char* user = "SYSDBA"; char* pass = "masterkey"; ergebnis = SQLConnectA(hdlConn, (SQLCHAR*)serverName,SQL_NTS,(SQLCHAR*)user,SQL_NTS, (SQLCHAR*)pass, SQL_NTS); if(ergebnis==SQL_SUCCESS) { printf("SQL_SUCCESS\n"); } if(ergebnis==SQL_SUCCESS_WITH_INFO) { printf("SQL_SUCCESS_WITH_INFO\n"); } if(ergebnis==SQL_INVALID_HANDLE) { printf("SQL_INVALID_HANDLE\n"); } if(ergebnis==SQL_ERROR) { printf("SQL_ERROR\n"); SQLWCHAR sqlstate[1024]; SQLWCHAR errMsg[1024]; SQLINTEGER nativeError; SQLSMALLINT errMsgMax = 1024; SQLSMALLINT errMsgLen; SQLGetDiagRec(SQL_HANDLE_DBC,hdlConn,1,sqlstate,&nativeError,errMsg,errMsgMax,&errMsgLen); wprintf(L"%s\n",errMsg); } system("pause"); return 0; }
In Java funktioniert es. Also die Datenbank läuft und ich kann alle SQL-Befehle ausfürhen. In Java schreibe ich:
String db_URL = "jdbc:firebirdsql:192.168.0.21/3050:D:/Datenbank.fdb" String db_User = "SYSDBA"; String db_PW = "masterkey"; DriverManager.getConnection(db_URL,db_User,db_PW); ...
Also IP, Port und Pfad zur Datei sind ja gleich geblieben. Nur kann ich in ODBC nicht einfach "jdbc:firebirdsql:" hinschreiben. Das funktioniert nicht (war ja auch zu erwarten ;)).
Aber wie heißt es denn dann korrekt? Oder mache ich an einer ganz anderen Stelle schon etwas falsch? DIe Aufrufreihenfolge von SQLAllocHandle() SQLSetEnvAttr() SQLAllocHandle() und SQLConnect() habe ich von MSDN (http://msdn.microsoft.com/en-us/library/windows/desktop/ms713529%28v=vs.85%29.aspx). Und bis auf SQLConnectA() liefern die vorausgehenden Funktionsaufrufe auch SQL_SUCCESS zurück...
MfG
P.S.: Ich arbeite mit Visual C++ 2010
EDIT: Ich konnte mittlerweile die installierten DB-Driver per C++ Code auflisten. "Firebird/InterBase(r) driver" befindet sich ebenfalls in der Liste. Soweit, so gut. Das heißt, es sollte schon mal stimmen, "DRIVER=Firebird/InterBase(r) driver;" hinzuschreiben.
Eines wundert mich allerdings ein wenig: In MSDN ist der zweite Parameter, in den ich den Treiber reinschreibe, mit "ServerName" bezeichnet. Das klingt nicht so als ob man da einen Treiber reinschreiben muss/soll. Klingt eher nach IP und Port. Wenn ich da irgendeinen Quatsch reinschreibe, bekomme ich folgende Fehlermeldung:
"[Microsoft][ODBC Driver Manager] Der Datenquellenname wurde nicht gefunden, und
es wurde kein Standardtreiber angegeben"Daraus schließe ich, dass "ServerName" eigentlich der "Connection String" ist und der Treiber, Server und Port reingeschrieben werden soll. Und ich schließe daraus, dass der Treiber auch korrekt erkannt wird. Denn wenn ich dort den Treiber angebe, kommt diese Fehlermeldung ja nicht mehr - dafür aber diese:
"[Microsoft][ODBC Driver Manager] Ungültige Zeichenfolgen- oder Pufferlänge"Für mich klingt das so als ob vielleicht die einzelnen Einträge "DRIVER", "UID", "PWD", "DBNAME" nicht mit ';' getrennt werden müssen sondern mit was anderem, oder als ob irgendwo Anführungszeichen gesetzt werden müssen oder irgendwelche benötigten Einträge noch fehlen. Hab schon viel damit experimentiert aber es klappt nicht. Hab auch nirgends gelesen wie so ein Connection String auszusehen hat.
Hat jemand ne Idee??
EDIT2: Die Meldung
"[Microsoft][ODBC Driver Manager] Ungültige Zeichenfolgen- oder Pufferlänge"
kommt tatsächlich nur wenn ServerName länger als 32 Zeichen ist. War es eine falsche Schlussfolgerung, dass da der Treiber rein muss?Ich weiß allerdings gar nicht was ich als Servername angeben soll bzw. wie ich den angeben soll (also in welchem Format)...
-
Ich habe zufällig die Funktion SQLDriverConnect() entdeckt. Wenn ich da den Beispiel Code nehme, funktioniert's soweit mal.
... SQLDriverConnectA(hdbc, GetDesktopWindow(), (SQLCHAR*)"driver=Firebird/InterBase(r) driver;DBNAME=D:\\Datenbank.fdb;UID=SYSDBA;PWD=masterkey;", _countof("driver=Firebird/InterBase(r) driver;DBNAME=D:\\Datenbank.fdb;UID=SYSDBA;PWD=masterkey;"), OutConnStr, 255, &OutConnStrLen,SQL_DRIVER_NOPROMPT); ...
Also nehme ich diese Funktion und arbeite mich dann mal weiter durch... vielleicht kommen zu anderen Funktionen ja noch Fragen auf
MfG
-
Das ist wahr?