SQLFetch 返回数据 用链表方式存储
时间: 2024-04-16 13:28:31 浏览: 9
要使用链表方式存储从数据库中检索到的数据,你可以创建一个自定义的链表结构,并在每次调用`SQLFetch`函数时,将检索到的数据存储到链表节点中。
以下是一个示例代码,展示了如何使用链表方式存储从数据库中检索到的数据:
```cpp
#include <iostream>
#include <sql.h>
#include <sqlext.h>
struct Employee {
SQLINTEGER id;
SQLCHAR name[256];
SQLINTEGER age;
Employee* next; // 链表指针,指向下一个节点
};
void FetchData(SQLHSTMT stmt, Employee** head) {
SQLRETURN ret;
Employee* current = nullptr;
while ((ret = SQLFetch(stmt)) == SQL_SUCCESS) {
Employee* employee = new Employee();
employee->next = nullptr;
SQLGetData(stmt, 1, SQL_C_SLONG, &employee->id, sizeof(employee->id), NULL);
SQLGetData(stmt, 2, SQL_C_CHAR, employee->name, sizeof(employee->name), NULL);
SQLGetData(stmt, 3, SQL_C_SLONG, &employee->age, sizeof(employee->age), NULL);
if (*head == nullptr) {
*head = employee;
current = *head;
} else {
current->next = employee;
current = current->next;
}
}
if (ret == SQL_ERROR) {
// 获取数据出错,可以调用 SQLGetDiagRec 获取错误信息
}
}
void PrintData(Employee* head) {
Employee* current = head;
while (current != nullptr) {
std::cout << "ID: " << current->id << std::endl;
std::cout << "Name: " << current->name << std::endl;
std::cout << "Age: " << current->age << std::endl;
std::cout << std::endl;
current = current->next;
}
}
void FreeList(Employee* head) {
Employee* current = head;
while (current != nullptr) {
Employee* next = current->next;
delete current;
current = next;
}
}
int main() {
SQLHENV env;
SQLHDBC conn;
SQLHSTMT stmt;
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &env);
SQLSetEnvAttr(env, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, 0);
SQLAllocHandle(SQL_HANDLE_DBC, env, &conn);
SQLCHAR connStrOutput[256];
SQLSMALLINT connStrOutputSize;
SQLDriverConnect(conn, NULL, (SQLCHAR*)"DRIVER={SQL Server};SERVER=localhost;DATABASE=mydatabase;UID=myusername;PWD=mypassword", SQL_NTS,
connStrOutput, sizeof(connStrOutput), &connStrOutputSize, SQL_DRIVER_COMPLETE);
SQLAllocHandle(SQL_HANDLE_STMT, conn, &stmt);
SQLExecDirect(stmt, (SQLCHAR*)"SELECT id, name, age FROM employees", SQL_NTS);
Employee* head = nullptr;
FetchData(stmt, &head);
PrintData(head);
FreeList(head);
SQLFreeHandle(SQL_HANDLE_STMT, stmt);
SQLDisconnect(conn);
SQLFreeHandle(SQL_HANDLE_DBC, conn);
SQLFreeHandle(SQL_HANDLE_ENV, env);
return 0;
}
```
在这个示例代码中,定义了一个名为`Employee`的结构体,其中包含了员工的相关信息,并添加了一个`next`指针,用于构建链表。在`FetchData`函数中,每次调用`SQLFetch`函数时,创建一个新的`Employee`节点,并将检索到的数据存储到该节点中。通过判断链表的头指针是否为空,可以确定链表是否为空,以及是否需要更新链表的头和当前节点的指针。
在`PrintData`函数中,遍历链表并打印每个节点的数据。在`FreeList`函数中,释放链表的内存,确保没有内存泄漏。
你可以根据自己的需求修改代码,并根据数据库中的数据结构定义适合自己的链表节点结构。