使用 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 << *cmd.GetValue(1)
【参考方案1】:
我怀疑你的演员阵容遇到了字节序问题。尝试使用 GetValue 的模板化(参见CDynamicAccessor::GetValue)形式来获取数字。
【讨论】:
以上是关于使用 OLEDB 选择语句获取错误值的主要内容,如果未能解决你的问题,请参考以下文章
使用此 INSERT INTO 语句和 .NET OleDb 命名空间时如何解决语法错误?
您只能在 C# 中的固定语句初始值设定项错误中获取未固定表达式的地址