1

我是为 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循环中也被多次插入...

以及它们如何与以下功能一起工作?

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

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

谢谢你.. :)

4

1 回答 1

3

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

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

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

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

于 2012-11-03T11:49:28.257 回答