Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

}

Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde Dich hier an.

Jetzt anmelden

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...