0

使用以下代码,我总是在 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 库:oracle-instantclient11.2-odbc-11.2.0.1.0-1.x86_64

关于这种行为的原因有什么想法吗?

4

4 回答 4

1

数字 4294967295 是 2 32 -1。换句话说,它是 32 位整数的 -1 的二进制补码。无论哪种方式,在二进制中,这意味着每个位都设置为“1”。在某处,它试图用无符号整数解释有符号值 -1。

它试图用 -1 回复以表明它无法描述行数。然而,有一个数据表示问题给你一个奇怪的值。我怀疑这是驱动程序问题,或者可能是由于 32 位到 64 位异常。

于 2012-07-20T20:29:08.603 回答
1

SQLRowCount 返回受 UPDATE、INSERT 或 DELETE 语句影响的行数;SQLBulkOperations 中的 SQL_ADD、SQL_UPDATE_BY_BOOKMARK 或 SQL_DELETE_BY_BOOKMARK 操作;或者 SQLSetPos 中的 SQL_UPDATE 或 SQL_DELETE 操作 - 当您不执行任何这些操作时返回的值可以被忽略。

有关 SQLRowCount 的更多信息,请参阅 Micrsoft ODBC 文档

于 2012-07-23T07:59:27.177 回答
1

亚当霍克斯给了你一个线索。我强烈怀疑,您使用的 ODBC 驱动程序是用 32 位 SQLULEN 构建的,但您的代码和 unixODBC 是用 64 位 SQLULEN 构建的。获取另一个版本的驱动程序或使用 32 位 SQLLEN/SQLULEN 重新构建 unixODBC,然后重新构建您的应用程序。

于 2012-07-23T08:52:50.707 回答
0

我在另一种情况下遇到了同样的问题。这是由于:

  1. 字节顺序和
  2. 存储大小。

您使用的存储大小和顺序比实际需要的少且不兼容。发生在 32/64 位 int/float 大小差异和 unix-posix 字节排序差异中。

根据我的经验,我一直在 32 位 CentOS 服务器上收到函数调用结果int(-4294967295)注意负号,即字节排序),而在我的 64 位 Windows 本地环境中,我一直在接收函数的正确结果。将大小的类型指示符更改为更大的 64 位兼容(在 PHP 中从SQLT_INTto SQLT_LNG)解决了 32 位 unix 服务器上的问题,同时在 64 位 posix 本地环境中保持了正确的结果。

我的经验

于 2014-11-24T19:47:46.160 回答