使用以下代码,我总是在Oracle数据库上获得该值
SQLHSTMT hStmt = SQL_NULL_HANDLE;
SQLRETURN sret;
SQLLEN rowCount = 0;
const SQLHDBC conn = this->getConnection();
if (conn == NULL)
{
ret = false;
}
SQLAllocHandle(SQL_HANDLE_STMT, conn, &hStmt);
std::string metaTableName="meta_table";
sret=SQLTables( hStmt,
NULL, 0, /* no specific catalog */
NULL, 0, /* no specific schema */
(SQLCHAR *)metaTableName.c_str(), SQL_NTS,
NULL, 0); /* no specific type - table or view */
if ((sret != SQL_SUCCESS) && (sret != SQL_SUCCESS_WITH_INFO))
{
std::cout << "Problem retrieving " << metaTableName << " table from database!" << std::endl);
ret= false;
}
SQLRowCount(hStmt,&rowCount);
std::cout <<std::endl << "Rows: " <<rowCount<<std::endl ;
没有错误消息,因此没有明显的原因导致此行为
使用oracle libs: 甲骨文instantclient11.2-ODBC-11.2.0.1.0-1.x86_64
关于这种行为的原因的任何想法?
答案 0 :(得分:1)
数字4294967295是2 32 -1。换句话说,对于32位整数,它是-1的二进制补码。无论哪种方式,二进制表示每个位都设置为“1”。在某处,它试图用无符号整数解释带符号的值-1。
它试图回复-1表示它无法描述行数。但是,有一个数据表示问题给你一个奇怪的值。我怀疑这是一个驱动程序问题,或者可能是由于32位到64位的异常。
答案 1 :(得分:1)
SQLRowCount返回受UPDATE,INSERT或DELETE语句影响的行数; SQLBulkOperations中的SQL_ADD,SQL_UPDATE_BY_BOOKMARK或SQL_DELETE_BY_BOOKMARK操作;或SQLSetPos中的SQL_UPDATE或SQL_DELETE操作 - 当您不执行任何操作时返回的值可以忽略。
有关SQLRowCount的更多信息,请访问Micrsoft ODBC documentation
答案 2 :(得分:1)
答案 3 :(得分:0)
在另一种情况下,我遇到了同样的问题。这是由于:
您使用的存储空间大小和订单较少且与实际需要的不兼容。发生在32/64位int / float大小差异和unix-posix字节排序差异。
根据我的经验,我一直在收到函数调用结果int(-4294967295)
(注意负号,即字节排序)一个32位的CentOS服务器,而在我的64位Windows本地环境中,我已经从功能中获得了正确的结果。将大小的类型指示符更改为更大的64位兼容(在PHP中从SQLT_INT
更改为SQLT_LNG
)解决了32位unix服务器上的问题,同时在64位posix本地上保持了正确的结果环境。