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

时间:2012-11-03 10:04:55

标签: sql c 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的选择语句吗?

如果我这样给,

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(语句句柄)与它们一起工作..

谢谢.. :)

1 个答案:

答案 0 :(得分:3)

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

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

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

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