为什么unixODBC SQLTables总是返回一个4294967295的SQLRowCount?

时间:2012-07-20 16:18:50

标签: oracle odbc unixodbc

使用以下代码,我总是在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

关于这种行为的原因的任何想法?

4 个答案:

答案 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)

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

答案 3 :(得分:0)

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

  1. 字节顺序和
  2. 存储空间大小。
  3. 您使用的存储空间大小和订单较少且与实际需要的不兼容。发生在32/64位int / float大小差异和unix-posix字节排序差异。

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

    My experience