Datenbankerstellung



  • Hi Leute,

    ich wollte per Kommandozeile eine Datenbankanwendung per ODBC programmieren, kann aber leider in meinem C++-Buch nur einen Teil über das Auslesen der Informationen finden. Kann mir jemand von euch sagen, wie ich eine Datenbank erstelle, darin eine neue Tabelle anlege und diese dann mit Datensätzen füttere?

    Danke

    René

    Hier mal der Code für die Datenbank (nur das Lesen!)

    Headerdatei db.h
    ----------------

    #include <windows.h>
    #include <sql.h>
    #include <sqlext.h>
    #include <string.h>
    #include <stdio.h>
    #include <conio.h>
    
    #define SQLTRY(x,y)\
        {\
            rc = y;\
            if (rc != SQL_SUCCESS)\
            {\
                unsigned char * szState;\
                unsigned char * szMsg;\
                SDWORD sdwNative;\
                SWORD swMsgLen;\
                SQLError(hEnv, hDBC, hStmt, szState, &sdwNative,\
                    szMsg, sizeof(szMsg), &swMsgLen);\
                printf("Fehler %d waehrend %s\nSQL-Status: = %s\n\
                    SQL-Meldung = %s\n", rc, x, szState, szMsg);\
                goto Terminate;\
            }\
        }
    

    Cpp-File db.cpp
    ---------------

    #include "db.h"
    
    void main(void)
    {
        char * CONNSTR;
        int CONNLEN;
        CONNLEN = (sizeof("DBQ=DATA.MDB;DRIVER={Microsoft Access-Datenbank (*.mdb)}")-1);
        SQLHENV hEnv = 0;
        SQLHDBC hDBC = 0;
        SQLHSTMT hStmt = 0;
        SQLCHAR szConnStr[255];
        SQLCHAR szStmt[255];
        SQLCHAR szFirstName[255];
        SQLCHAR szLastName[255];
        long nAge;
        SWORD cbConnStr;
        RETCODE rc;
        SDWORD sdwLNLen;
        SDWORD sdwFNLen;
        SDWORD sdwALen;
        int i;
        char szResult[1000];
        SQLTRY("SQLAllocEnv", SQLAllocEnv(&hEnv))
        SQLTRY("SQLAllocConnect", SQLAllocConnect(hEnv, &hDBC))
        SQLTRY("SQLDriverConnect", SQLDriverConnect(hDBC, NULL, (unsigned char *)"DBQ=DATA.MDB;DRIVER={Microsoft Access Driver (*.mdb)}", CONNLEN, szConnStr, sizeof(szConnStr), &cbConnStr, SQL_DRIVER_NOPROMPT))
        SQLTRY("SQLAllocStmt", SQLAllocStmt(hDBC, &hStmt))
        sprintf((char *)szStmt, "SELECT * FROM Zeiten");
        if (SQLPrepare(hStmt, szStmt, strlen((char *)szStmt)) != SQL_SUCCESS)
        {
    //        sprintf((char *)szStmt, "CREATE TABLE Zeiten(Nachname CHAR (30), Vorname CHAR(30), Alter LONG INTEGER)");
    //        SQLTRY("SQLPrepare::Create Table...", SQLExecDirect(hStmt, szStmt, strlen((char *)szStmt)))
            sprintf((char *)szStmt, "SELECT * FROM Zeiten");
            SQLTRY("SQLPrepare::Access Table...", SQLPrepare(hStmt, szStmt, strlen((char *)szStmt)))
        }
    //    sprintf((char *)szStmt, "INSERT INTO Zeiten (LastName, FirstName, Age) VALUES (\"Muster\", \"Max\", 34)");
    //    SQLTRY("SQLPrepare::Insert Data...", SQLExecDirect(hStmt, szStmt, strlen((char *)szStmt)))
        SQLTRY("SQLBindCol", SQLBindCol(hStmt, 1, SQL_C_CHAR, (PTR)szLastName, sizeof(szLastName), &sdwLNLen))
        SQLTRY("SQLBindCol", SQLBindCol(hStmt, 2, SQL_C_CHAR, (PTR)szFirstName, sizeof(szFirstName), &sdwFNLen))
        SQLTRY("SQLBindCol", SQLBindCol(hStmt, 3, SQL_C_SLONG, (PTR)&nAge, sizeof(nAge), &sdwALen))
        SQLTRY("SQLExecute", SQLExecute(hStmt))
        for (i = 1; (rc = SQLFetch(hStmt)) == SQL_SUCCESS; i++)
        {
            printf("Datensatz #%d\tNachname: %s\tVorname: %s\tAlter: %d\n", i, szLastName, szFirstName, nAge);
        }
        if (rc != SQL_NO_DATA_FOUND)
        {
            SQLTRY("SQLFetch", rc)
        }
        printf("Operation war erfolgreich.\n");
    Terminate:
        if (hStmt) SQLFreeStmt( hStmt, SQL_CLOSE);
        if (hDBC) SQLDisconnect(hDBC);
        if (hDBC) SQLFreeConnect(hDBC);
        if (hEnv) SQLFreeEnv(hEnv);
        getch();
    }
    

    [ Dieser Beitrag wurde am 29.05.2003 um 21:03 Uhr von rromann editiert. ]



  • Zunächst mal wundert es mich, daß du die C-API für die ODBC-Programmierung nimmst, und nicht die MFC-Klassen, die es dafür gibt. Aber das nur nebenbei.

    Mit den ODBC-Funktionen kannst du lediglich eine Verbindung zur Datenbank herstellen, SQL-Anweisungen an den Server senden und Daten von ihm empfangen.

    Datenbanken und Tabellen anlegen, Datensätze einfügen, löschen, ändern usw. geschieht nicht mit C-Funktionen, sondern durch SQL-Anweisungen, die du mittels einer C-Funktion (etwa SQLExecDirect) an den Server sendest.

    Hier einige SQL-Anweisungen (zwei davon sind in deinem Programmcode bereits auskommentiert enthalten):
    - Datenbank anlegen: CREATE DATABASE ...
    - Tabelle anlegen: CREATE TABLE ...
    - Datensatz hinzufügen: INSERT INTO ...
    - Datensatz löschen: DELETE FROM ...
    - Datensatz ändern: UPDATE ...
    - Tabelle anzeigen: SELECT * FROM ...

    Hilft also nix: du mußt dir SQL-Grundkenntnisse aneignen, sonst nützt dir ODBC nichts.

    Trost: SQL ist im Vergleich zu C kinderleicht und schnell gelernt (eine Sachen von wenigen Stunden). Tuts gibts im Internet haufenweise.



  • Danke erstmal,

    nur leider habe ich die Befehle (CREATE TABLE...) auskommentiert, da sonst sofort eine Access Violation am nächsten SQL-Execute-Befehl auftrat.

    René


Anmelden zum Antworten