ODBC Datenbank text auslesen



  • Hi!

    Erst einmal hallo....Bin neu hier und hoffe auf eine nette Zusammenarbeit 😉

    Wie es ja immer so ist, findet man seinen Weg zu einem Forum mit einem Problem...Da will ich auch mal keine Ausnahme machen ^^
    Ich habe das folgende Programm erfolgreich compiliert. Dieses listet mir die IDs von den ganzen namen auf (ist also ein integer oder long!):

    void main(void) 
    { 
    
    SQLHENV henv;
    SQLHDBC hdbc;
    SQLHSTMT hstmt;
    long lEmpID;
    SQLRETURN retcode;
    
    SQLINTEGER pIndicators[2];
    
    /*Allocate environment handle */
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    /* Set the ODBC version environment attribute */
    retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 
    
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    /* Allocate connection handle */
    retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 
    
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    /* Set login timeout to 5 seconds. */
    SQLSetConnectAttr(hdbc, (void*)SQL_LOGIN_TIMEOUT, 5, 0); 
    
    /* Connect to data source */
    retcode = SQLConnect(hdbc, (SQLCHAR*) "channelnames", SQL_NTS,
    (SQLCHAR*) "", SQL_NTS,
    (SQLCHAR*) "", SQL_NTS); 
    
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    
    if (SQLExecDirect(hstmt,
    (SQLCHAR*) "SELECT ID FROM Channels",
    SQL_NTS) == SQL_ERROR)
    {
    // Handle error and return.
    }
    
    // Retrieve data from row set.
    SQLBindCol(hstmt, 1, SQL_C_LONG, (SQLPOINTER) &lEmpID, sizeof(long),
    &pIndicators[0]);
    
    while (SQLFetch(hstmt) == SQL_SUCCESS)
    {
    printf("Nachname: %d\n", lEmpID);
    } 
    /* Allocate statement handle */
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    printf ("Halihallo");
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    /* Process data */
    
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    }
    SQLDisconnect(hdbc);
    }
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    } 
    }
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
    
    }
    system("PAUSE");
    }
    

    Jetzt moechte ich das ganze so aendern, dass er mir nicht die IDs auflistet, sondern die Namen neben den IDs! (also text/strings)!
    Dazu habe ich folgenden Quelltext probiert, jedoch ohne jeglichen Erfolg!:

    #include <windows.h> 
    #include <stdlib.h> 
    #include <stdio.h> 
    #include <sql.h> 
    #include <sqlext.h> 
    
    void main(void) 
    { 
    
    SQLHENV henv;
    SQLHDBC hdbc;
    SQLHSTMT hstmt;
    char lEmpID[20];
    SQLRETURN retcode;
    
    SQLINTEGER pIndicators[2];
    
    /*Allocate environment handle */
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
    
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    /* Set the ODBC version environment attribute */
    retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0); 
    
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    /* Allocate connection handle */
    retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc); 
    
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    /* Set login timeout to 5 seconds. */
    SQLSetConnectAttr(hdbc, (void*)SQL_LOGIN_TIMEOUT, 5, 0); 
    
    /* Connect to data source */
    retcode = SQLConnect(hdbc, (SQLCHAR*) "channelnames", SQL_NTS,
    (SQLCHAR*) "", SQL_NTS,
    (SQLCHAR*) "", SQL_NTS); 
    
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    
    if (SQLExecDirect(hstmt,
    (SQLCHAR*) "SELECT name1 FROM Channels",
    SQL_NTS) == SQL_ERROR)
    {
    // Handle error and return.
    }
    
    // Retrieve data from row set.
    SQLBindCol(hstmt, 3, SQL_C_CHAR, (SQLPOINTER) &lEmpID, 20,
    &pIndicators[0]);
    
    while (SQLFetch(hstmt) == SQL_SUCCESS)
    {
    printf("Nachname: %s\n", lEmpID);
    } 
    /* Allocate statement handle */
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt); 
    printf ("Halihallo");
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO)
    {
    /* Process data */
    
    SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
    }
    SQLDisconnect(hdbc);
    }
    SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    } 
    }
    SQLFreeHandle(SQL_HANDLE_ENV, henv);
    
    }
    system("PAUSE");
    }
    

    Ich habe leider keine Ahnung, was ich falsch mache...Ich denke jedoch, dass es daran liegt, dass ein string aus mehreren charactern besteht und die funktion nicht einen kompletten string zurueckgeben kann....sicher bin ich mir jedoch ueberhaupt nicht und eine Idee, das ganze anders zu gestalten habe ich auch nicht. Waere nett, wenn mir jemand helfen koennte!!! 🕶

    Mfg funword



  • Das hier ist nicht koscha:

    SQLBindCol(hstmt, 3, SQL_C_CHAR, (SQLPOINTER) &lEmpID, 20,
    &pIndicators[0]);
    

    Warum willst du plötzlich die dritte Spalte auslesen?

    Um mehr zu sagen müsste man die genuae Fehlermeldung wissen, etc. Du rückst ja auch mit nahezu keinen Infos raus 😞

    MfG SideWinder


Anmelden zum Antworten