我在本地运行 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。这完全是荒谬的,但它确实有效。如果有人想出办法,我仍然想知道正确的做法,但在那之前,这是必须要做的。
最佳答案
我怀疑您的转换遇到了字节序问题。尝试使用 GetValue 的模板化(参见 CDynamicAccessor::GetValue )形式获取数字。
关于sql - 使用 OLEDB select 语句获取错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8821590/