gpt4 book ai didi

sql - 语句 handle(hstmt) 究竟做了什么?在ODBC中

转载 作者:太空宇宙 更新时间:2023-11-04 02:11:44 25 4
gpt4 key购买 nike

我刚开始为 ODBC 编写 C 代码但在这里我有问题......在搜索了 C 的 odbc 函数教程教程之后,我仍然无法准确理解他们如何协同工作...

语句 handle hstmt 对数据库数据到底做了什么?我知道它控制着我作为参数给出的 SQL 查询语句。但,,那么我作为查询给出的每个 SQL 语句都应该有每个语句句柄(hstmt)吗?还是多个 SQL 查询语句的一个语句句柄?

例如,

lstrcpy((LPTSTR)update, L"insert into employee values  ('Dshong','summer','LosAngeles');");
SQLExecDirect(hstmt1, update, SQL_NTS);

lstrcpy((LPTSTR)update, L"insert into works values ('Dshong','Small Bank', 2500);");
SQLExecDirect(hstmt3, update1, SQL_NTS);

lstrcpy((LPTSTR)select, L"select * from works;");
if (SQLExecDirect(hstmt, select, SQL_NTS) != SQL_SUCCESS)
return printf("can’t exec direct");


lstrcpy((LPTSTR)select1, L"select * from employee;");
if (SQLExecDirect(hstmt2, select1, SQL_NTS) != SQL_SUCCESS)
return printf("can’t exec direct");

我应该像这样给两个插入语句和两个带有四个 hstmt 的选择语句吗?

如果我这样给,

lstrcpy((LPTSTR)insert, L"insert into employee values ('Dshong','summer','LosAngeles');");
SQLExecDirect(hstmt1, insert, SQL_NTS);

SQLExecDirect 将 hstmt1 作为参数,但我不知道 SQLExecDirect 如何使用它..

按照我的想法,结果应该是插入一行,不是吗?

但是当我运行代码时,它会为 ('Dshong','summer','LosAngeles') 插入多个相同的行...当我打印出结果时, ('Dshong','summer','LosAngeles') 被多次插入即使插入行不在 for 循环中...

以及它们如何与以下功能协同工作?

  • SQLBindCol(hstmt, 1, SQL_C_CHAR, id, (SDWORD)sizeof(id), &idlen);
  • SQLFetch(hstmt)

我知道他们只是在做什么,但是..在这里我想知道到底是用什么方式hstmt(语句句柄)与它们一起工作..

谢谢你..:)

最佳答案

C 中的句柄只是指向由 ODBC 分配的一 block 内存的指针。通常是跟踪 SQL 查询状态的结构。句柄在 INSERT 语句中用处不大,只用了一次。除非失败,否则您需要将完全 相同的句柄传递给 SQLError() 以找出问题所在。然后使用哪个 ODBC 访问该内部结构并检索错误代码。句柄相对于结构指针的优势在于它隐藏了内部实现。

您当然需要在 SELECT 查询中重复使用它,因为您要检索查询结果。您必须将 完全 相同的句柄传递给 SQLBindCol() 以将查询结果中的列映射到内存位置。并使用 SQLFetch() 检索一行。

如果您了解 C++,那么将句柄视为 this 对象指针会很有帮助。和 SQLAllocStmt() 作为构造函数。并将 SQLFetch() 作为类的实例方法。最后 SQLFreeHandle() 作为析构函数。这正是 C++ ODBC 包装器类所做的,例如 MFC 的 CRecordSet、CDatabase 来包装 SQLHDBC 句柄。

在大多数情况下,您只使用一个 SQLHSTMT 句柄。除非你同时运行多个 SQL 语句。假设要从 SELECT 查询生成 UPDATE 语句,这需要两个句柄。

关于sql - 语句 handle(hstmt) 究竟做了什么?在ODBC中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13208087/

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