2012-01-11 14 views
2

Oracle 11g2 32bをローカルで実行しており、コードに接続しています。 VC++を使用し、OLE DBに接続します。接続は正常に動作しています(最終的に)、問題なくテーブルにデータを挿入できます。OLEDB select文で間違った値を取得しています

ただし、私が問題に遭遇するのは、データを取得するときです。私はちょうど私のものをテストするためにITEMと呼ばれる単一のテーブルがあります。私はCCommandを使用します。コマンドが実行され、myコマンドに実際にデータが含まれています。実際には、正しい量の列と行が含まれています。ただし、正しいデータが含まれていないようです。

これを実行すると、7から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である)ので、私が代わりに「長い」のが、無駄にさまざまな種類を試してみました。

ありがとうございます。

EDIT:別のテストテーブルでVARCHARを取得することはできましたが、まだ数値で苦労しています。

EDIT:さらにテストすると、4つの異なる数値DBTYPEがすべて異なる不正な数値を読み取ることがわかりました。

EDIT:数字を文字列として読み込み、コード内でintに変換することができました。これは完全にばかげていますが、機能します。私はまだ誰かが何かを見出した場合、それを行う正しい方法を知りたいですが、それまではこれが必要です。

+0

OleDbプロバイダのOracleクライアントプロバイダを使用して試したことがありますか? – DRapp

+0

ここに 'descr your_table'を投稿してください。あなたのコードでは、数値をlong(long *の内容まで)にキャストしますが、この数値はどのようにデータベースに格納されますか? 'typeof(cmd.GetValue(1)) 'とは何ですか?あなたはなぜ直接には行かないのですか?cmd.GetValue(1): 'cout << * cmd.GetValue(1)' – danihp

答えて

0

キャストでエンディアンの問題が発生している可能性があります。数値を取得するには、テンプレート付き(CDynamicAccessor::GetValue参照)形式のGetValueを使用してみてください。

関連する問題