我是新编写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(语句句柄)与它们一起工作..
谢谢.. :)答案 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语句,这需要两个句柄。