使用 OLEDB 选择语句获取错误值

Posted

技术标签:

【中文标题】使用 OLEDB 选择语句获取错误值【英文标题】:Getting wrong values with OLEDB select statement 【发布时间】:2012-01-11 15:11:00 【问题描述】:

我在本地运行 Oracle 11g2 32b,并在代码中连接到它。我使用 VC++ 并与 OLE DB 连接。连接工作正常(终于),我可以毫无问题地将数据插入我的表中。

然而,我确实遇到问题的地方是在获取数据时。我有一个名为 ITEM 的表只是为了测试我的东西。我使用 CCommand。命令执行,我的命令实际上包含数据。事实上,它包含正确数量的列和行;但是,它似乎没有包含正确的数据。

当我运行它时,我应该得到编号为 4 到 10 的 7 行,而我却收到了 83 000 000 和 168 000 000 之间逐渐增加和遥远的值。当我尝试获取列名时,我也得到数字而不是字符串。

stringstream stream;
    string str;
    stream << "SELECT * FROM ITEM";
    str = stream.str();
    wstring commandText = s2ws(str);

    hr = cmd.Open(session, commandText.c_str());
    if(FAILED(hr))
        cout << "Select failed." << endl; 
        //Cropped for brevity, closes connection and returns -1
    else
        cout << "Selection successful." << endl;
        hr = cmd.MoveFirst();
        int counter = 0;
        while(!FAILED(hr) && hr != DB_S_ENDOFROWSET)
            counter++;
            hr = cmd.MoveNext();
            cout << *(long*)(cmd.GetValue(1)) << endl;
        
        cout << "Number of entries : " << counter << endl;
    

我首先虽然可能是数据类型问题(我的列在 Oracle 中的数据类型是 INTEGER),所以我尝试了不同的类型而不是“long”,但无济于事。

提前致谢。

编辑:我能够在另一个测试表上检索 VARCHAR,但我仍在努力处理数字。

编辑:进一步的测试表明,4 个不同的数字 DBTYPE 都读取不同的离谱数字。

编辑:我能够将数字作为字符串读取并在我的代码中将它们转换回 int。这完全是荒谬的,但它确实有效。如果有人想出办法,我仍然想知道正确的做法,但在那之前,这是必须要做的。

【问题讨论】:

成为 Oracle...您是否尝试过使用 Oracle 客户端提供商而不是 OleDb 提供商? 你应该在这里发帖descr your_table。在您的代码中,您将数字转换为long(转换为 long* 的内容),但是,这些数字是如何存储在数据库中的? typeof(cmd.GetValue(1)) 是什么?为什么不直接cout cmd.GetValue(1):cout &lt;&lt; *cmd.GetValue(1) 【参考方案1】:

我怀疑你的演员阵容遇到了字节序问题。尝试使用 GetValue 的模板化(参见CDynamicAccessor::GetValue)形式来获取数字。

【讨论】:

以上是关于使用 OLEDB 选择语句获取错误值的主要内容,如果未能解决你的问题,请参考以下文章

插入语句 C# OleDb 中的语法错误

无法使用 OLEDB 从 CSV 获取所有列的值

使用此 INSERT INTO 语句和 .NET OleDb 命名空间时如何解决语法错误?

您只能在 C# 中的固定语句初始值设定项错误中获取未固定表达式的地址

使用OLEDB读取EXCEL数据时,为何读取不到单元格中的时间值,全是1900\1\0

System.Data.OleDb.OleDbException: 'UPDATE 语句中的语法错误。 '