我试图从我的数据库中的一个表中获取一个int值。为了使用ODBC处理这个问题,我写了:
std::string strRequete = "SELECT MIN(idO) FROM dbo.Opo WHERE l = 'x' AND b = '' AND t = 'r'";
std::wstring strwRequete(strRequete.begin(), strRequete.end());
retcode = SQLExecDirect(hstmt, (SQLWCHAR*)strwRequete.c_str(), SQL_NTS);
SQLINTEGER cbTestStrId;
SQLINTEGER sziIdO;
SQLGetData(hstmt, 1, SQL_C_LONG, &sziIdO, 1, &cbTestStrId);
但是,使用这个避风港解决了我的问题。我获得了很长的价值作为回报,我无法理解其含义,而不是获得86
。
我该如何解决这个问题?
答案 0 :(得分:1)
在SQLGetData()
函数调用中,使用SQL_C_DEFAULT
而不是SQL_C_LONG
作为TargetType
参数(第三个)。
如果TargetType
为SQL_C_DEFAULT
,则驱动程序会根据源的SQL数据类型选择默认的C数据类型,在您的情况下应为int
。
如果SQL数据源中的值未定义为int
,则可以使用SQLINTEGER
作为TargetType
进行转换为int
。
此外,SQLGetData()
中的最后一个参数应为SQLLEN
类型,因此请相应地更改变量cbTestStrId
。执行后测试其值,因为它可以通知您有关错误的信息,如果它与下列之一匹配:
The length of the data available to return
SQL_NO_TOTAL
SQL_NULL_DATA
在这种情况下,您的sziIdO
不应视为有效。检查SQL是否有错误,并确保它在SQL服务器上产生有效的响应。
有关该主题的更多信息,请阅读this MSDN page。