Zum Inhalt springen

SQL Datenbank via ODBC


SirTom

Empfohlene Beiträge

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);

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...