SirTom Geschrieben 24. April 2003 Geschrieben 24. April 2003 Ich bin ziemlicher Newbie was C++ angeht. Daher versuch ich mal hier ein Lösung für mein Problem zu finden. Ich möchte einfach mal über eine Konsolenanwendung eine Datenbankverbindung aufbauen und mit Datensätze ausgeben. Folgender Code bleibt beim assert-Befehl hinter dem SQLConnect hängen. Die Datenquelle Fahrzeuge.dsn ist vorhanden und kann aus der Verwaltung erfolgreich verbunden werden. Wenn euch Informationen fehlen, fragt einfach. Schnelle Hilfe wäre Spitze!!! :-) CODE: #include <windows.h> // wird von sql.h und sqlext.h benötigt #include <sql.h> // Haupt-Bibliothek für ODBC-Funktionen #include <sqlext.h> // Bibliothek zur Verwendung der SQL-Erweiterungen, // z.B. Konstanten #include <iostream.h> #include <assert.h> class DBanfrage { public: DBanfrage ( ); // liest die Eingabe in die Attribute "fields" und "table" ein void uebernehmenEingabe ( ); // baut DB-Anfrage in "sqlAnfrage" zusammen void aufbauenDbAnfrage ( ); // baut Dabenbankverbindung auf; // setzt "sqlAnfrage" an Datenbank ab; // erzeugt Ausgabe; // baut Datenbankverbindung ab; void anfragenDatenbank ( ); private: // zur Abspeicherung der Eingaben char table [256]; char fields [256]; // die Datenbankanfrage wird als Zeichenkette zusammengesetzt char sqlAnfrage [1024]; // Das Ergebnis einer DB-Anfrage sind Datensätze mit jeweils höchstens // 10 Attributen (Spalten) je 128 Zeichen; reicht i.a. aus. char ergebnisDatensatz [10] [128]; }; // ENDE Klasse DBanfrage::DBanfrage( ) { // In diesem Beispiel gibts nichts zu tun } void DBanfrage::uebernehmenEingabe ( ) { // Übernahme der Eingaben strcpy ( table , "fahrzeuge" ); strcpy ( fields , "*" ); } void DBanfrage::aufbauenDbAnfrage ( ) { strcpy(sqlAnfrage,"") ; // Vorbelegung strcat(sqlAnfrage, "SELECT ") ; strcat(sqlAnfrage, fields ) ; strcat(sqlAnfrage, " FROM ") ; strcat(sqlAnfrage, table ) ; } void DBanfrage::anfragenDatenbank ( ) { HENV hEnv; // Festlegung von 'handles' -> siehe sqltypes.h HDBC hDBC; // -> sqltypes.h wird über sql.h eingebunden (include) HSTMT hStmt; RETCODE retCode; // Returncode (Typ: signed short, siehe sqltypes.h) SQLINTEGER len; // Variable zur Aufnahme von "Längen". Wird z.Z. // nicht ausgewertet. (Typ long, siehe sqltypes.h) short numResultCols = 0; // Anzahl der Spalten im Ergebnis der DB-Anfrage // Im nachfolgendem Code wird mittels API-Aufrufen auf Basis von ODBC // auf eine Datenbank zugegriffen. Die verwendeten Konstanten, // wie z.B. SQL_HANDLE_ENV, entstammen der Bibliothek sql.h. // // Die Datenbank muss im ODBC-Datenquellen-Administrator (s. NT System- // steuerung) mit einem Zugriffsnamen eingetragen werden. //-- Zuweisen des 'environment handle' retCode = SQLAllocHandle ( SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv ); assert ( retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ); //-- Setzen des "ODBC version environment"-Attributs retCode = SQLSetEnvAttr ( hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER) SQL_OV_ODBC3, SQL_IS_INTEGER ); assert ( retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ); //-- Zuweisen des 'connection handle' retCode = SQLAllocHandle ( SQL_HANDLE_DBC, hEnv, &hDBC ); assert ( retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ); // Verbindung zur Datenquelle wird hergestellt; retCode = SQLConnect( hDBC, (SQLTCHAR *) "Fahrzeuge", // Name der Datenquelle SQL_NTS, (SQLTCHAR *) "", // keine Benutzerkennung SQL_NTS, (SQLTCHAR *) "", // kein Passwort SQL_NTS ); assert ( retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ); //-- Zuweisen des 'statement handle' retCode = SQLAllocHandle ( SQL_HANDLE_STMT, hDBC, &hStmt ); assert ( retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ); // Absetzen des SQL-Befehls retCode = SQLExecDirect ( hStmt, (unsigned char *) sqlAnfrage, SQL_NTS ); assert ( retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ); // Anzahl Tabellenspalten berechnen SQLNumResultCols ( hStmt , &numResultCols ); // Tabellenspalten auswählen for ( int i=0 ; i < numResultCols ; i++ ) { SQLBindCol (hStmt, i+1, SQL_C_CHAR, ergebnisDatensatz, 128, &len); } cout << "Ergebnis der Anfrage: " << sqlAnfrage << "" << endl; retCode = SQLFetch ( hStmt ); while ( retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO) { for ( int i=0 ; i < numResultCols ; i++ ) { cout << ergebnisDatensatz << " "; } cout << "<br>" << endl ; retCode = SQLFetch ( hStmt ); } //-- statement handle freigeben SQLFreeHandle(SQL_HANDLE_STMT, hStmt); //-- Verbindung zur Datenquelle auflösen SQLDisconnect(hDBC); //-- connection handle freigeben SQLFreeHandle(SQL_HANDLE_DBC, hDBC); //-- environment handle freigeben SQLFreeHandle(SQL_HANDLE_ENV, hEnv); } Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.