c++ zu MSSQL mit ODBC?



  • Hallo,
    Ich versuche gerade mittels ODBC auf eine MS SQL DB zu connecten aber leider funktioniert das nicht. Hier mal ein Code-Ausschnitt, ist aber so wie in der MSDN.

    /*Allocate environment handle */
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
    
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    	Edit_AddText(GetDlgItem(hdlg, IDC_EDIT_STATUS), "Allocate environment handle succees ...\r\n");
    	/* Set the ODBC version environment attribute */
    	retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 
    	if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    	{
    		Edit_AddText(GetDlgItem(hdlg, IDC_EDIT_STATUS), "Set the ODBC version environment attribute succees ...\r\n");
    		/* Allocate connection handle */
    		retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 
    		if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    		{
    			Edit_AddText(GetDlgItem(hdlg, IDC_EDIT_STATUS), "Allocate connection handle succees ...\r\n");
    			/* Set login timeout to 5 seconds. */
    
    			SQLSetConnectAttr(hdbc, (SQLINTEGER)SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);
    			/* Connect to data source */
    			retcode = SQLConnect(hdbc, (SQLCHAR*) "Server", SQL_NTS,
    				(SQLCHAR*) "User", (SQLSMALLINT) SQL_NTS, (SQLCHAR*) "Password", SQL_NTS);
    
    			if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    			{
    				Edit_AddText(GetDlgItem(hdlg, IDC_EDIT_STATUS), "Connect succees ...\r\n");
    				/* Allocate statement handle */
    				retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    				if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    				{
    					Edit_AddText(GetDlgItem(hdlg, IDC_EDIT_STATUS), "Allocate statement handle succees ...\r\n");
    					/* Process data */
    				}
    				else
    					Edit_AddText(GetDlgItem(hdlg, IDC_EDIT_STATUS), "Allocate statement handle NOT succees!\r\n");
    			}
    			else
    			{
    				retcode = SQLGetDiagRec(SQL_HANDLE_DBC, hdbc, 1, (SQLCHAR*)sqlState, 0, (SQLCHAR*)ErrorMsg, 500, NULL);
    				sprintf(Buffer, "Connect NOT succees!\r\n%s\r\n",ErrorMsg);
    				Edit_AddText(GetDlgItem(hdlg, IDC_EDIT_STATUS), Buffer);
    			}
    		}
    		else
    			Edit_AddText(GetDlgItem(hdlg, IDC_EDIT_STATUS), "Allocate connection handle NOT succees!\r\n");
    	}
    	else
    		Edit_AddText(GetDlgItem(hdlg, IDC_EDIT_STATUS), "Set the ODBC version environment attribute NOT succees!\r\n");
    }
    else
    Edit_AddText(GetDlgItem(hdlg, IDC_EDIT_STATUS), "Allocate environment handle NOT succees!\r\n");
    

    Wie ihr seht hab ich mir noch ein paar Ausgaben und eine direkte Fehlerbehandlung beim connect eingebaut. In meiner Listbox erhalte ich folgendes nach dem Starten.

    Allocate environment handle succees ...
    Set the ODBC version environment attribute succees ...
    Allocate connection handle succees ...
    Connect NOT succees!
    [Microsoft][ODBC Driver Manager] Der Datenquellenname wurde nicht gefunden, und es wurde kein Standardtreiber angegeben

    Also er soll ja den "Datenquellenname" sprich Server nicht finden. Was ich mir nicht erklären kann. Hab es mit mehreren Server probiert immer das gleiche!
    Aber den zweiten Teil versteh ich nicht? Wo muss ich ein Treiber angeben? Auf den Server oder bei mir?
    Und gibt es vielleicht einfachere API's außer jetzt hier ODBC 🙂 ?

    MfG schirrmie



  • Ich habe mir deinen Code nicht durchgelesen, aber die Meldung
    "Der Datenquellenname wurde nicht gefunden, und es wurde kein Standardtreiber angegeben"
    kommt, wenn du keine entsprechende ODBC-Datenquelle eingerichtet hast.

    Bei Windows XP:
    Start -> Einstellungen -> Systemsteuerung -> Verwaltung -> Datenquellen (ODBC)
    (Kann man auch aus dem Code heraus einrichten.)

    Der Datenquellenname entspricht, wenn ich das richtig sehe, dem zweiten Parameter von SQLConnect(...). Den hast du "Server" genannt. Könnte sein, dass du erst eine System-DSN mit dem Namen Server einrichten musst, damit das klappt...



  • Hallo und vielen Dank für deine Antwort. Durch Zufall hab ich es eben selbst mitbekommen. Was ne DSN ist und so weiter weis aber trotzdem danke für die Hilfe.
    Aber wieso kann man dann nicht einfach per <Servername; User; Password> connecten?
    Oder kann man evtl. ne "temporäre dsn" für den Betrieb erstellen die dann nur für die Applikation gültig ist?

    MfG schirrmie


Anmelden zum Antworten