语句处理(hstmt)究竟是做什么的? 在ODBC中

我是新编写ODBC的c代码,但在这里我有疑问…在为C搜索odbc函数教程的教程之后,我仍然知道他们如何协同工作……

该语句处理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的select语句吗?

如果我这样给

 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循环中,也插入了多次…

以及它们如何与下面的function一起工作?

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

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

谢谢.. :)

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

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

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

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