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