首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >语句到底处理(Hstmt)做什么?在ODBC中

语句到底处理(Hstmt)做什么?在ODBC中
EN

Stack Overflow用户
提问于 2012-11-03 10:04:54
回答 1查看 4.5K关注 0票数 2

我刚开始为ODBC编写c代码,但这里我有个问题.在搜索了C的odbc函数教程教程之后,我仍然不知道它们是如何协作工作的.

对于数据库数据,该语句处理hstmt的具体操作是什么?我知道它控制作为参数的SQL查询语句。但是,那么我作为查询提供的每个SQL语句都应该有每个语句句柄(Hstmt)。还是几个SQL查询语句的一个语句句柄?

例如,

代码语言:javascript
复制
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的两个insert语句和两个select语句,我应该这样做吗?

如果我这样做,

代码语言:javascript
复制
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 (语句句柄)如何与它们一起工作。

谢谢。。:)

EN

回答 1

Stack Overflow用户

发布于 2012-11-03 11:49:28

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

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

如果您知道C++,那么将句柄看作这个对象指针是有帮助的。和SQLAllocStmt()作为构造函数。和SQLFetch()作为类的实例方法。最后,SQLFreeHandle()作为析构函数。这正是C++ ODBC包装类所做的,就像MFC的CRecordSet,CDatabase来包装SQLHDBC句柄一样。

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13208087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档