Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++数据库从SQL获取ODBC表中的行数组_C++_Sql_Database_Ms Access_Odbc - Fatal编程技术网

C++数据库从SQL获取ODBC表中的行数组

C++数据库从SQL获取ODBC表中的行数组,c++,sql,database,ms-access,odbc,C++,Sql,Database,Ms Access,Odbc,参考此链接 我不理解这些文档,并且尝试了许多变体来实现一些功能,但它只是输出了完整的jibberish。基本上,我怎样才能从我的微软Access数据库中获取数据到我的C++程序中。我最终希望将整个表存储为数组或向量,也就是说,假设我的表中有5个字段,我希望将所有内容存储在5个不同的数组或向量中,以对应的字段。但就目前而言,我怎么能有一个名为Example table的表,其中有一个名为Names的字段,类型是Access调用的字符串或短文本。然后如何将其加载到字符串或字符数组中,以用于GUI或程

参考此链接 我不理解这些文档,并且尝试了许多变体来实现一些功能,但它只是输出了完整的jibberish。基本上,我怎样才能从我的微软Access数据库中获取数据到我的C++程序中。我最终希望将整个表存储为数组或向量,也就是说,假设我的表中有5个字段,我希望将所有内容存储在5个不同的数组或向量中,以对应的字段。但就目前而言,我怎么能有一个名为Example table的表,其中有一个名为Names的字段,类型是Access调用的字符串或短文本。然后如何将其加载到字符串或字符数组中,以用于GUI或程序的其他部分?这是我目前的代码:

#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <sqlext.h>
#include <iostream>

WCHAR szDSN[] = L"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=C:\\Users\\Name\\Desktop\\databaseExample\\databaseExample\\Data.accdb";

int _tmain(int argc, _TCHAR* argv[])
{

    HENV    hEnv;
    HDBC    hDbc;

    /* ODBC API return status */
    RETCODE rc;

    int     iConnStrLength2Ptr;
    WCHAR    szConnStrOut[256];

    const WCHAR* query = L"select Names from Example_Table";

    HSTMT           hStmt;

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

    /* Connect to the database */
    rc = SQLDriverConnect(hDbc, NULL, (WCHAR*)szDSN,
        SQL_NTS, (WCHAR*)szConnStrOut,
        255, (SQLSMALLINT*)&iConnStrLength2Ptr, SQL_DRIVER_NOPROMPT);
    if (SQL_SUCCEEDED(rc))
    {

        wprintf(L"Successfully connected to database. Data source name: \n  %s\n",
            szConnStrOut);

        /* Prepare SQL query */
        wprintf(L"SQL query:\n  %s\n", query);

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

        /* Excecute the query */
        rc = SQLExecute(hStmt);
        if (SQL_SUCCEEDED(rc))
        {
            wprintf(L"SQL Success\n");
        }
        else {
            wprintf(L"SQL Failed\n");
        }
        
    }
    else
    {
        wprintf(L"Couldn't connect to %s.\n", szDSN);
    }

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

    getchar();
    printf("hi\n");
    return 0;
}
例如,如果列是文本,则需要使用传递SQL_C_WCHAR类型。下面是如何获取单个文本列的值并将其放入向量的示例:

#include <iostream>
#include <string>
#include <vector>
#include <Windows.h>
#include <sqlext.h>

WCHAR szDSN[] = L"Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=C:\\Test\\users.accdb";

void DisplayError(SQLSMALLINT t, SQLHSTMT h) {
    SQLWCHAR       SqlState[6], Msg[SQL_MAX_MESSAGE_LENGTH];
    SQLINTEGER    NativeError;
    SQLSMALLINT   i, MsgLen;
    SQLRETURN     rc;

    SQLLEN numRecs = 0;
    SQLGetDiagField(t, h, 0, SQL_DIAG_NUMBER, &numRecs, 0, 0);

    // Get the status records.
    i = 1;
    while (i <= numRecs && (rc = SQLGetDiagRec(t, h, i, SqlState, &NativeError,
        Msg, sizeof(Msg), &MsgLen)) != SQL_NO_DATA) {
        wprintf(L"Error %d: %s\n", NativeError, Msg);
        i++;
    }

}

std::vector<std::wstring> ExecuteSql(const WCHAR* sql) {

    std::vector<std::wstring> results = {};
    HENV    hEnv = NULL;
    HDBC    hDbc = NULL;
    HSTMT hStmt = NULL;
    int iConnStrLength2Ptr;
    WCHAR szConnStrOut[256];
    SQLINTEGER rowCount = 0;
    SQLSMALLINT fieldCount = 0;
    SQLWCHAR buf[128];
    SQLINTEGER ret;

    /* ODBC API return status */
    RETCODE rc;

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

    /* Connect to the database */
    rc = SQLDriverConnect(hDbc, NULL, (WCHAR*)szDSN,
        SQL_NTS, (WCHAR*)szConnStrOut,
        255, (SQLSMALLINT*)&iConnStrLength2Ptr, SQL_DRIVER_NOPROMPT);

    if (SQL_SUCCEEDED(rc))
    {
        /* Prepare SQL query */
        rc = SQLAllocStmt(hDbc, &hStmt);
        rc = SQLPrepare(hStmt, (SQLWCHAR*)sql, SQL_NTS);

        /* Excecute the query */
        rc = SQLExecute(hStmt);
        if (SQL_SUCCEEDED(rc))
        {
            SQLNumResultCols(hStmt, &fieldCount);

            if (fieldCount > 0)
            {
                /* Loop through the rows in the result set */

                rc = SQLFetch(hStmt);

                while (SQL_SUCCEEDED(rc))
                {                   
                    //get data
                    rc = SQLGetData(hStmt, 1, SQL_C_WCHAR, buf, sizeof(buf), &ret);
                    
                    if (SQL_SUCCEEDED(rc) == FALSE) {
                        wprintf(L"SQLGetData failed\n");
                        continue;
                    }

                    //convert data to string
                    std::wstring str;
                    if (ret <= 0) {
                        str = std::wstring(L"(null");
                    }
                    else {
                        str = std::wstring(buf);
                    }
                    
                    results.push_back(str);
                    rc = SQLFetch(hStmt);
                    rowCount++;
                };

                rc = SQLFreeStmt(hStmt, SQL_DROP);

            }
            else
            {
                wprintf(L"Error: Number of fields in the result set is 0.\n");
            }

        }
        else {
            wprintf(L"SQL Failed\n");
            DisplayError(SQL_HANDLE_STMT, hStmt);
        }
    }
    else
    {
        wprintf(L"Couldn't connect to %s\n", szDSN);
        DisplayError(SQL_HANDLE_DBC, hDbc);
    }

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

int main()
{
    auto results = ExecuteSql(L"SELECT name FROM Users");

    for (auto x : results) {
        std::wcout << x << std::endl;
    }

    getchar();
    return 0;
}

哇,我真是太感谢你了!这节省了我很大的时间,我在深入深入与C++ + CLI作为解决方案,但它限制我的具体包括不可用,是在本机C++,非常感谢!