我使用无dsn连接成功连接到SQL Server数据库。不幸的是,当我查询我的数据库时,它没有绑定我的id,种类和描述变量的值(即使你在我的代码中看到的正是我试图做的事情)。
我想从中选择的表格如下所示。出于某种原因,当我使用SQLExecDirect
执行查询时,它要么不执行语句,要么将值绑定到我想要的id,种类和描述(在以下行中)。相反,我得到ID,Species,Description列名称(即因为它只是一个cout),但列名下面没有数据(即因为数据没有被正确绑定)。
MushroomID Species Descript Season
1 Matsutake Matsutake Fall
2 King Boletus King Boletus Fall
3 Scaber Stalk Bolete Scaber Stalk Bolete Fall
4 Chicken of the Woods Chicken of the Woods Fall
5 Chanterelle Chanterelle Fall
6 Lobster Lobster Fall
我已经多次介入,但不知道我在看什么。我是SQL的完整菜鸟,使用C ++是与SQL交互的噩梦。然而,就我而言。
代码中的while语句永远不会运行。由于某种原因,hstmt是0x0000,我不知道为什么。完整的代码如下所示。
#include <sql.h>
#include <sqlext.h>
#include <iostream>
#include <cstring>
using namespace std;
void main()
{
SQLHANDLE henv;
SQLHANDLE hdbc;
SQLHANDLE hstmt;
SDWORD cbQual;
char * query = "USE MyName GO SELECT * FROM MyName.Mushroom;";
char id[100], species[100], description[100];
SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);
SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);
SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);
SQLConnect(hdbc, (unsigned char *)"MyServer.brown.edu", SQL_NTS,
(unsigned char *)"MyName", SQL_NTS,
(unsigned char *)"MyName", SQL_NTS);
SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);
SQLExecDirect(hstmt, (unsigned char *)query, SQL_NTS);
SQLBindCol(hstmt, 1, SQL_CHAR, id, 100, &cbQual);
SQLBindCol(hstmt, 2, SQL_CHAR, species, 100, &cbQual);
SQLBindCol(hstmt, 3, SQL_CHAR, description, 100, &cbQual);
//SQLGetData (hstmt, 1, SQL_CHAR, id, 100, &cbQual);
cout << "ID\tspecies\tDescription" << endl
<< "___\t________\t__________" << endl;
while(!SQLFetch(hstmt))
cout << id << '\t' << species << "\t\t" << description << '\t' << endl;
SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
SQLDisconnect(hdbc);
SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
SQLFreeHandle(SQL_NULL_HANDLE, henv);
}
任何人都可以发现任何明显的错误,可能导致我的htsmt为0x00000000和id,种类和描述只包含垃圾吗?