我刚开始为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的两个insert语句和两个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 (语句句柄)如何与它们一起工作。
谢谢。。:)
发布于 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语句,这需要两个句柄。
https://stackoverflow.com/questions/13208087
复制相似问题