gpt4 book ai didi

c++ - 我们是否需要在每次调用 SQLExecdirect 之前调用 SQLAllocHandle 来分配一个 SQLHSTMT

转载 作者:行者123 更新时间:2023-11-30 03:15:04 30 4
gpt4 key购买 nike

我需要执行一系列 T-sql 语句作为事务的一部分,在每次调用 SQLExecDirect 执行每个 t-sql 语句之前,我调用 SQLAllocHandle 分配一个 SQLHSTMT 类型的句柄。如果我将代码更改为在第一个 SQLExecDirect 之前对 SQLAllocHandle 进行一次调用,则对 SQLExecDirect 的后续调用将失败。

// This works
rc = SQLAllocHandle(SQL_HANDLE_STMT, *connection, &sqlStmtHandle);
rc = SQLExecDirect(sqlStmtHandle, (SQLCHAR *)statement1, SQL_NTS);
rc = SQLAllocHandle(SQL_HANDLE_STMT, *connection, &sqlStmtHandle);
rc = SQLExecDirect(sqlStmtHandle, (SQLCHAR *)statement2, SQL_NTS);


// This doesnt work.
rc = SQLAllocHandle(SQL_HANDLE_STMT, *connection, &sqlStmtHandle);
rc = SQLExecDirect(sqlStmtHandle, (SQLCHAR *)statement1, SQL_NTS);
rc = SQLExecDirect(sqlStmtHandle, (SQLCHAR *)statement2, SQL_NTS);

这是预期的吗?如果是,为什么?是否有可以清楚解释语义的资源。在此处查看在线文档 https://learn.microsoft.com/en-us/sql/odbc/reference/syntax/sqlallochandle-function?view=sql-server-2017

"To request a statement handle, an application connects to a data source and then calls SQLAllocHandle before it submits SQL statements. "

这似乎表明我不应该重复调用 SQLAllocHandle,但我对此并不完全确定。

最佳答案

仅在数据库初始化期间调用SQLAllocHandle(),否则可能导致内存泄漏和性能问题。在执行 SQLExecDirect() 命令后,查询结果存储在 hDatabaseStatement 中(根据结果的大小自动分配内存,因此无需调用 SQLAllocHandle(SQL_HANDLE_STMT,...)重复),需要在每次查询后释放。

void InitializeDatabase() // call one time
{
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hDatabaseEnv);
SQLAllocHandle(SQL_HANDLE_DBC, hDatabaseEnv, &hDatabase);
SQLDriverConnect(/* */);
SQLAllocHandle(SQL_HANDLE_STMT, hDatabase, &hDatabaseStatement);
}

void DestroyDatabase() // call one time
{
SQLFreeStmt(hDatabaseStatement, SQL_CLOSE);
SQLFreeHandle(SQL_HANDLE_STMT, hDatabaseStatement);
SQLFreeHandle(SQL_HANDLE_DBC, hDatabase);
SQLFreeHandle(SQL_HANDLE_ENV, hDatabaseEnv);
}

void InsertItemDatabase(/**/)
{
SQLExecDirect(hDatabaseStatement, wchar, SQL_NTS);
SQLFreeStmt(hDatabaseStatement, SQL_CLOSE);
}

关于c++ - 我们是否需要在每次调用 SQLExecdirect 之前调用 SQLAllocHandle 来分配一个 SQLHSTMT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57334635/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com