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

アダム・ホークスがヒントをくれました。あなたが使用しているODBCドライバーはSQLULEN 32ビットで構築されていましたが、コードとunixODBCはSQLULEN 64ビットで構築されていると強く思います。ドライバーの別のビルドを入手するか、32 ビット SQLLEN/SQLULEN で unixODBC を再構築してから、アプリを再構築してください。

于 2012-07-23T08:52:50.707 に答える
1

SQLRowCount は、UPDATE、INSERT、または DELETE ステートメントによって影響を受ける行の数を返します。SQLBulkOperations での SQL_ADD、SQL_UPDATE_BY_BOOKMARK、または SQL_DELETE_BY_BOOKMARK 操作。または SQLSetPos の SQL_UPDATE または SQL_DELETE 操作 - これらのいずれも実行していないときに返される値は無視できます。

SQLRowCount の詳細については、 Microsoft ODBC のドキュメントを参照してください。

于 2012-07-23T07:59:27.177 に答える
1

4294967295 は 2 32 -1 です。別の言い方をすれば、これは 32 ビット整数の -1 の 2 の補数です。いずれにせよ、バイナリでは、すべてのビットが「1」に設定されていることを意味します。どこかで、符号付きの値 -1 を符号なしの整数で解釈しようとしています。

行数を記述できないことを示すために -1 で応答しようとしています。ただし、奇妙な値を与えるデータ表現の問題があります。これはドライバーの問題であるか、32 ビットから 64 ビットへの異常が原因であると思われます。

于 2012-07-20T20:29:08.603 に答える