使用OLEDB select语句获取错误的值

时间:2012-01-11 15:11:01

标签: sql database oracle visual-c++ oledb

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

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

当我运行这个时,我应该得到7行编号为4到10,而我却逐渐接收到增加和远离值在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。这完全是荒谬的,但它确实有效。如果有人想出来的话,我仍然想知道这样做的正确方法,但在那之前,这将是必须做的。

1 个答案:

答案 0 :(得分:0)

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