Mit C++ Datenbank ansprechen



  • Einen wunderschönen guten Tag alle miteinander,
    ich programmiere nun schon eine ganze Weile in C++ mit dem Visual Studio. Überwiegend sind das Konsolenanwendungen, ich hoffe daher dass ich im richtigen Bereich des Forums bin. Wobei ich meine Fühler auch schon Richtung Win32 Anwendungen und MFC austrecke.
    Durch die Beschäftigung mit Datenbanken und SQLite in der Uni habe ich mir in den Kopf gesetzt mich mit Microsoft Datenbanken vertraut zu machen und diese auch dann in meinen Anwendungen zu nutzen. Dazu gibt es auch ein Tutorial auf Youtube, welches ich durchgegangen bin und so implementiert habe wie es da steht. Allerdings funktioniert es bei mir nicht. Folgende Fehlermeldung spuckt mir das Programm aus:
    SQL driver message: [Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server existiert nicht oder Zugriff verweigert.
    SQL state: 08001.

    Das Programm sieht folgendermaßen aus:

    #include <iostream>
    #include <windows.h>
    #include <sqlext.h>
    #include <sqltypes.h>
    #include <sql.h>
    
    using namespace std;
    
    void showSQLError(unsigned int handleType, const SQLHANDLE& handle)
    {
    	SQLCHAR SQLState[1024];
    	SQLCHAR message[1024];
    	if (SQL_SUCCESS == SQLGetDiagRecA(handleType, handle, 1, SQLState, NULL, message, 1024, NULL))
    		cout << "SQL driver message: " << message << endl << "SQL state: " << SQLState << "." << endl;
    }
    
    int main()
    {
    	SQLHANDLE SQLEnvHandle = NULL;
    	SQLHANDLE SQLConnectionHandle = NULL;
    	SQLHANDLE SQLStatementHandle = NULL;
    	SQLRETURN retCode = 0;
    	char SQLQuery[] = "SELECT * FROM people";
    
    	do 
    	{
    		if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &SQLEnvHandle))
    			break;
    
    		if (SQL_SUCCESS != SQLSetEnvAttr(SQLEnvHandle, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0))
    			break;
    
    		if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_DBC, SQLEnvHandle, &SQLConnectionHandle))
    			break;
    
    		if (SQL_SUCCESS != SQLSetConnectAttr(SQLConnectionHandle, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0))
    			break;
    
    		SQLCHAR retConString[1024];
    		switch (SQLDriverConnectA(SQLConnectionHandle, NULL, (SQLCHAR*)"DRIVER={SQL Server}; SERVER=localhost, 1433; DATABASE=TestDB; UID=Jan; PWD=;", SQL_NTS, retConString, 1024, NULL, SQL_DRIVER_NOPROMPT)) 
    		{
    		case SQL_SUCCESS:
    			break;
    		case SQL_SUCCESS_WITH_INFO:
    			break;
    		case SQL_NO_DATA_FOUND:
    			showSQLError(SQL_HANDLE_DBC, SQLConnectionHandle);
    			retCode = -1;
    			break;
    		case SQL_INVALID_HANDLE:
    			showSQLError(SQL_HANDLE_DBC, SQLConnectionHandle);
    			retCode = -1;
    			break;
    		case SQL_ERROR:
    			showSQLError(SQL_HANDLE_DBC, SQLConnectionHandle);
    			retCode = -1;
    			break;
    		default:
    			break;
    		}
    
    		if (retCode == -1)
    			break;
    
    		if (SQL_SUCCESS != SQLAllocHandle(SQL_HANDLE_STMT, SQLConnectionHandle, &SQLStatementHandle))
    			break;
    
    		if (SQL_SUCCESS != SQLExecDirectA(SQLStatementHandle, (SQLCHAR*)SQLQuery, SQL_NTS)) 
    		{
    			showSQLError(SQL_HANDLE_STMT, SQLStatementHandle);
    			break;
    		}
    		else {
    			char name[256];
    			int age;
    			while (SQLFetch(SQLStatementHandle) == SQL_SUCCESS) 
    			{
    				// Fetches the next rowset of data from the result
    				SQLGetData(SQLStatementHandle, 1, SQL_C_DEFAULT, &name, sizeof(name), NULL);
    				SQLGetData(SQLStatementHandle, 2, SQL_C_DEFAULT, &age, sizeof(age), NULL);
    				// Retrieves data for a single column in the result set
    				cout << name << " " << age << endl;
    			}
    		}
    	} 
    	while (false);
    
    	SQLFreeHandle(SQL_HANDLE_STMT, SQLStatementHandle);
    	SQLDisconnect(SQLConnectionHandle);
    	SQLFreeHandle(SQL_HANDLE_DBC, SQLConnectionHandle);
    	SQLFreeHandle(SQL_HANDLE_ENV, SQLEnvHandle);
    }
    

    Ich würde mich echt riesig freuen, wenn jemand weiß was ich falsch mache und mich auf den richtigen Weg, sodass das Programm funktioniert bringt. Erst hatte ich noch den Datentyp SQLWCHAR sodass diese Fehlermeldungen ganz kryptisch waren, bis ich herausgefunden habe dass man für SQLCHAR entsprechend andere Funktionen aufrufen muss. So habe ich die halbe Nacht damit verbracht die Zeile mit SQLDriverConnect(…) anzustarren und mit der Zeichenkette zu experimentieren.

    Allerdings jetzt wo da eine weniger kryptische Fehlermeldung kommt, weiß ich auch nicht was das zu bedeuten hat.

    Gruß,

    Jan



  • Existiert die ODBC-Datenquelle?



  • Also die ODBC Datenquelle habe ich gerade erstellt und der Datenquellentest verlief erfolgreich.

    Ah perfekt es geht jetzt^^ Dankesehr für den Denkanstoß mit der Datenquelle 🙂


Log in to reply