Есть ли способ запросить файлы .accdb / .mdb с помощью C ++? - PullRequest
0 голосов
/ 05 мая 2019

У меня есть школьный проект, в котором мне нужно разработать приложение, которое запрашивает и записывает в файлы базы данных Access, но использует C ++.

После некоторых исследований я обнаружил, что ODBC может помочь, но мне не повезло. Я пробовал разные строки подключения, но, похоже, ничего не работает.

Что я сделал до сих пор:


    #include "pch.h"
    #include <windows.h>
    #include <sqlext.h>
    #include <stdio.h>
    #include <stdlib.h>



    int main()
    {
    char szDSN[256] = "Driver={Microsoft Access Driver (*.mdb, 
    *.accdb)};DBQ=C:\\EntrySystem.mdb";
    /* Data Access Method used in this sample */
    const char* DAM = "Direct ODBC";

    HENV    hEnv;
    HDBC    hDbc;

    /* ODBC API return status */
    RETCODE rc;

    int     iConnStrLength2Ptr;
    char    szConnStrOut[256];

    unsigned char query[] = "SELECT * from Condomino;";

    SQLCHAR         chval1[128], chval2[128], colName[128];
    int             ret1;
    int             ret2;

    /* Number of rows and columns in result set */
    SQLINTEGER      rowCount = 0;
    SQLSMALLINT     fieldCount = 0, currentField = 0;
    HSTMT           hStmt;

    /* Allocate an environment handle */
    rc = SQLAllocEnv(&hEnv);
    /* Allocate a connection handle */
    rc = SQLAllocConnect(hEnv, &hDbc);

    /* Connect to the 'Northwind 2007.accdb' database */
    rc = SQLDriverConnect(hDbc, NULL, (SQLWCHAR*)szDSN,
        SQL_NTS, (SQLWCHAR*)szConnStrOut,
        255, (SQLSMALLINT*)&iConnStrLength2Ptr, SQL_DRIVER_NOPROMPT);
    if (SQL_SUCCEEDED(rc))
    {
        printf("%s: Successfully connected to database. Data source name: \n  %s\n",
            DAM, szConnStrOut);

        /* Prepare SQL query */
        printf("%s: SQL query:\n  %s\n", DAM, query);

        rc = SQLAllocStmt(hDbc, &hStmt);
        rc = SQLPrepare(hStmt, (SQLWCHAR*)query, SQL_NTS);

        /* Bind result set columns to the local buffers */
        rc = SQLBindCol(hStmt, 1, SQL_C_CHAR, chval1, 128, (SQLINTEGER*)&ret1);
        rc = SQLBindCol(hStmt, 2, SQL_C_CHAR, chval2, 128, (SQLINTEGER*)&ret2);

        /* Excecute the query and create a record set */
        rc = SQLExecute(hStmt);
        if (SQL_SUCCEEDED(rc))
        {
            printf("%s: Retrieve schema info for the given result set:\n", DAM);
            SQLNumResultCols(hStmt, &fieldCount);
            if (fieldCount > 0)
            {
                for (currentField = 1; currentField <= fieldCount; currentField++)
                {
                    SQLDescribeCol(hStmt, currentField,
                        (SQLWCHAR*)colName, sizeof(colName), 0, 0, 0, 0, 0);
                    printf(" | %s", colName);
                }
                printf("\n");
            }
            else
            {
                printf("%s: Error: Number of fields in the result set is 0.\n", DAM);
            }

            printf("%s: Fetch the actual data:\n", DAM);
            /* Loop through the rows in the result set */
            rc = SQLFetch(hStmt);
            while (SQL_SUCCEEDED(rc))
            {
                printf(" | %s | %s\n", chval1, chval2);
                rc = SQLFetch(hStmt);
                rowCount++;
            };

            printf("%s: Total Row Count: %d\n", DAM, rowCount);
            rc = SQLFreeStmt(hStmt, SQL_DROP);
        }
    }
    else
    {
        printf("%s: Couldn't connect to %s.\nLastError: %d\n", DAM, szDSN, GetLastError());
    }

    /* Disconnect and free up allocated handles */
      SQLDisconnect(hDbc);
      SQLFreeHandle(SQL_HANDLE_DBC, hDbc);
      SQLFreeHandle(SQL_HANDLE_ENV, hEnv);

      printf("%s: Cleanup. Done.\n", DAM);

      return 0;
    }

Я ожидаю, что он запросит все строки из моей таблицы "condomino", но библиотека (sqlext) продолжает выдавать мне ошибку "0". Любая помощь будет приветствоваться, если у вас есть другие решения, дайте мне знать.

1 Ответ

0 голосов
/ 05 мая 2019

Да.

Похоже, у вас проблема со строками подключения Access. Альтернативой является создание DNS пользователя; перейдите в панель управления / инструменты администрирования / источник данных ODBC / выберите базу данных Microsoft Access - настройте и укажите свой путь к * .mdb (рекомендуется использовать * .accdb)

Теперь ваша строка подключения будет упрощена как (имя драйвера чувствительно к регистру):

SQLWCHAR outstr[1024];
SQLSMALLINT outstrlen;
SQLReturnCode = SQLDriverConnect(hDatabase, NULL, L"DSN=Microsoft Access Driver;", SQL_NTS,
            outstr, sizeof(outstr), &outstrlen, SQL_DRIVER_COMPLETE);

enter image description here

...