Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

SQL Datenbank via ODBC

Empfohlene Antworten

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

}

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Konto

Navigation

Suchen

Suchen

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.