VC++ からのデータ取得

[戻る]
CA 2005/09/02(金) 13:02:07
はじめまして、よろしくご指導ご鞭撻ください。
Visual Stidio6.0のVC++を使用しデータを取得するプログラミングを作成しています。
DB(MSDEを使用)からあるカラムのデータを取得する時のみ
「メモリ不足が不足しています」
というポップが現れ、そこで終了してしまいます。
Accessを使用しMSDEを「.adp」形式でテーブルのデータ定義を参照したところ
「ntext型」となっておりました。(初めて聞きました・・・。)
問題点を切り分ける為、Access(モジュールを作成しただSQLを発行し該当データを取得する。)
でVCで作成したSQLを発行したところ取得できました。OSQLでも取得は可能でした。
何か回避方法などお知りでしたら、ご教授ください。

wood 2005/09/02(金) 17:54:18
趣旨は「Access」のデータ取得では無いようなので

1レコードサイズ、取得したいデータのデータタイプ、データレングス

DB接続方法(ODBC、DAO、RDO、ADO OLEDB等)
などのデータベースの詳細を明記し

データアクセス部分のソースを提示してみてはいかがでしょうか

質問者のとなりで見ている回答者はいないと思いますので
環境を詳細に説明なさったほうが、解決を早める方法です

CA 2005/09/02(金) 19:26:46
すいません。下記がソースになります。
------------------------------------------------------------------
void CDBtestDlg::WUP_DB()
{
 CString strCon;
 CString strSql;

 strCon = "DSN=whatsup;UID=administrator;PWD=";

 //実行SQL生成
 strSql = "select * from SystemActivityLog";

 CDatabase db;
 //接続
 db.OpenEx( _T( strCon ), CDatabase::openReadOnly | CDatabase::noOdbcDialog );

 //実行
 CRecordset rs( &db );

 rs.Open( CRecordset::forwardOnly, _T( strSql ) );

 CString strResult;
 CODBCFieldInfo fi;

 short nFields = rs.GetODBCFieldCount();

 short index;

 if (!rs.IsEOF()) 
 {
    strResult = "";
    for(index = 0; index < nFields; index++ )   
     {
        rs.GetODBCFieldInfo(index, fi);
        strResult = strResult + fi.m_strName + ",";
    }
 }

 CString strValue;

 int i = 0 ;
 CDBVariant varValue;

 while( !rs.IsEOF() )
 {
    strResult = "";
    for(index = 0; index < nFields; index++ )   
    {

        ////////   ここでntext型のデータ取得時に落ちます ///////
         ////////   ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ //////
        rs.GetFieldValue( index, _T( strValue ) );
         ////////   ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ //////

        
        strResult = strResult + strValue + ",";
    }
    AfxMessageBox(strResult);
    rs.MoveNext();
    i++;
 }

 rs.Close();
 db.Close();

}

Blue [E-Mail] 2005/09/03(土) 02:09:21
本題と関係ないけれど

_T( CString変数 )

という使い方はないかと。

普通は
_T( "ABC" )
というふうに文字(列)定数に対して使います。

# UNICODEプロジェクトだと現コードでコンパイルできるかどうか。。。

wood 2005/09/03(土) 08:10:57
MSDNにも「CRecordset::GetFieldValue」のサンプル乗ってます
−−−−−−−−−−−−−−−−−−
while( !rs.IsEOF( ) )
{
   for( short index = 0; index < nFields; index++ )
   {
      rs.GetFieldValue( index, varValue );
      // do something with varValue
   }
   rs.MoveNext( );
}
−−−−−−−−−−−−−−−−−−
こんな感じ、「Blue さん」のご指摘が正解なのだと思われます

古いスレッドには追加発言できません。