PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ODBC in Visual C++?


BodyLove
2007-11-19, 17:03:36
hi,

ich habe jetzt mal ein kleines Problem. Ich habe ein ODPC Code,

// ODBC-Cursor bei Relationen Kunde und Kopie in Videothek-DB
// H.E. Erbs 16.11.96

#include <iostream.h>

#include <windows.h> // Header-File für ODBC
#include <sql.h> // Header-File für ODBC
#include <sqlext.h> // Header-File für ODBC

void select(); // Prototyp
void ErrorMsg(); // Prototyp

HENV henv; // Environment Handle
HDBC hdbc = SQL_NULL_HDBC; // Connection Handle
HSTMT hstmt = SQL_NULL_HSTMT; // Statement Handle

RETCODE rc; // Return Code

void main()
{
SQLAllocEnv(&henv); /* Reservierung des Environnment Handles */
SQLAllocConnect(henv,&hdbc);/* Reservierung des Connection Handles */
cout << "Verbindung zur Data Source wird hergestellt..." << endl;

rc = SQLConnect(hdbc, // Connection Handle
(unsigned char *) "Vthek", // Data Source
SQL_NTS, // Länge des Strings von Parameter 2;
// Konstante SQL_NTS: ODBC stellt Länge selber fest
NULL, // UserId des Benutzers
0, // Länge des Strings von vorigem Parameter
NULL, // Passwort
0); // Länge des Strings von vorigem Parameter

if(rc == SQL_SUCCESS)
{
cout << ".......................... ist hergestellt" << endl;
select ();
SQLDisconnect(hdbc); // Schließt die Verbindung zur Data Source
}
else
ErrorMsg();

SQLFreeConnect(hdbc); // Befreit den Connection Handle
SQLFreeEnv(henv); // Befreit den Environment Handle
cout << "Ende des ODBC-Beispiellaufs" << endl;
}

/*****************************************************************************
FUNKTION : select
******************************************************************************/

typedef
struct
{
double Nr;
char Name[50];
double VideoNr;
} CursorStruktur;

void select()
{
CursorStruktur Cursor;
SQLAllocStmt(hdbc,&hstmt); // Reservierung des Statement Handles

cout << "SQL-Befehl wird übertragen." << endl;
rc = SQLExecDirect(hstmt, // Statement Handle
(unsigned char *) "SELECT Kunde.Nr, Kunde.Name, Kopie.Nr\
FROM Kunde, Kopie \
WHERE Kunde.Nr = Kopie.KundeNr",
SQL_NTS); // Länge des Strings von Parameter 2;
// Konstante SQL_NTS: ODBC stellt Länge selber fest

if(rc != SQL_SUCCESS)
{
ErrorMsg();
if(rc == SQL_ERROR)
{
SQLFreeStmt(hstmt,SQL_DROP);
return;
}
}

cout << "Attribute an Cursorstruktur binden" << endl;

SQLBindCol(hstmt, // Statement Handle
1, // Nummer der Spalte der Ergebnistabelle
// des SQL-Select-Befehls von SQLExecDirect
SQL_C_DOUBLE, // Datentyp der Programmvariablen
&Cursor.Nr, // Adresse der zuzuordnenden Variablen
0, // Länge der Variablen in Bytes;
// nur nötig bei Strings
NULL); // Adresse einer Variablen, die die Anzahl der
// tatsächlich kopierten Bytes enthält

SQLBindCol(hstmt,2,SQL_C_CHAR,Cursor.Name,50,NULL);
SQLBindCol(hstmt,3,SQL_C_DOUBLE,&Cursor.VideoNr,0,NULL);

cout << "Daten holen mit Cursor" << endl << endl;
rc = SQLFetch(hstmt); /* Ruft das erste Tupel der Resultat-Tabelle ab */

while(rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{
cout << Cursor.Nr << " " << Cursor.Name << " " << Cursor.VideoNr << endl;
rc = SQLFetch(hstmt);
}

cout << endl << "Ende der Cursor-Schleife" << endl;
SQLFreeStmt(hstmt,SQL_CLOSE); /* Schließt den Cursor */
SQLFreeStmt(hstmt,SQL_UNBIND); /* Befreit die verknüpften Variablen */
SQLFreeStmt(hstmt,SQL_DROP); /* Befreit den Statement Handle */
}


/*****************************************************************************
FUNKTION : ErrorMsg
******************************************************************************/

void ErrorMsg()
{
/* Buffer für die ODBC-Fehlernachricht */
unsigned char * ErrorBuffer= new unsigned char [SQL_MAX_MESSAGE_LENGTH];

SQLError(henv, // Environment Handle
hdbc, // Connection Handle
hstmt, // Statement Handle
NULL, // SQLSTATE (= ODBC ErrorCode)
NULL, // Native Error Code (Data Source spez.)
ErrorBuffer, // Adresse eines Strings für den Fehlertext
SQL_MAX_MESSAGE_LENGTH, // max. Länge des Strings von vorigem Parameter
NULL); // Reserve für Fehlertextrückgabe

cout << "Error Message : " << ErrorBuffer << endl;
}


mit dessen Hilfe ich meine durch Access erstellte DB anzapfen soll. Die Funktionsweise habe ich verstanden. Nur erkennt mein Compiler die Includes nicht. Ich nutze Visual Express Edition 2005. Java darf ich nicht nutzen. Oracle habe ich nicht, bzw. nutzlos, weil ich die Aufgabe in C realisieren soll.;( Jemand eine Idee? Unter google heißt es, es würde funktionieren. Tut es aber leider nicht.

Danke. Lg Body

transstilben
2007-11-20, 20:51:01
Der Compiler findet die Includes nicht ?
Microsoft Plattform SDK 2003 ist installiert und die Includepfade entsprechend
gesetzt ?

BodyLove
2007-11-20, 21:07:35
Ja, offensichtlich unterstützt Visual c++ Express Edition kein ODPC. Weiß nur Gott warum. Bei Visual C++ 6.0 ist der Code allerdings kein Problem. Für 10€ war ich dabei.:biggrin: