はじめまして、よろしくご指導ご鞭撻ください。
Visual Stidio6.0のVC++を使用しデータを取得するプログラミングを作成しています。
DB(MSDEを使用)からあるカラムのデータを取得する時のみ
「メモリ不足が不足しています」
というポップが現れ、そこで終了してしまいます。
Accessを使用しMSDEを「.adp」形式でテーブルのデータ定義を参照したところ
「ntext型」となっておりました。(初めて聞きました・・・。)
問題点を切り分ける為、Access(モジュールを作成しただSQLを発行し該当データを取得する。)
でVCで作成したSQLを発行したところ取得できました。OSQLでも取得は可能でした。
何か回避方法などお知りでしたら、ご教授ください。
趣旨は「Access」のデータ取得では無いようなので
1レコードサイズ、取得したいデータのデータタイプ、データレングス
DB接続方法(ODBC、DAO、RDO、ADO OLEDB等)
などのデータベースの詳細を明記し
データアクセス部分のソースを提示してみてはいかがでしょうか
質問者のとなりで見ている回答者はいないと思いますので
環境を詳細に説明なさったほうが、解決を早める方法です
すいません。下記がソースになります。
------------------------------------------------------------------
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();
}
本題と関係ないけれど
_T( CString変数 )
という使い方はないかと。
普通は
_T( ABC )
というふうに文字(列)定数に対して使います。
# UNICODEプロジェクトだと現コードでコンパイルできるかどうか。。。
MSDNにも「CRecordset::GetFieldValue」のサンプル乗ってます
------------------
while( !rs.IsEOF( ) )
{
for( short index = 0; index < nFields; index++ )
{
rs.GetFieldValue( index, varValue );
// do something with varValue
}
rs.MoveNext( );
}
------------------
こんな感じ、「Blue さん」のご指摘が正解なのだと思われます