ADOで、メモリの増加を防ぐには?


MD  2005-03-13 02:54:35  No: 56666

VC++にてデータベースを使うのは今回が初めてです。
ADOを使用してAccessファイルのテーブルの読み書きは出来たのですが、
テーブルのデータを更新するとメモリ使用量が増えていき、困っています。
COleSafeArrayや、Variant型のメモリの開放が必要なのでしょうか。
どなたか詳しい方教えていただけないでしょうか
よろしくお願いします。

OS:WindowsXP
VC6.0SP6

StdAfx.h に以下を追加
//ADO関係
#import "C:\program files\common files\system\ado\msado15.dll" \
      no_namespace \
      rename( "EOF", "adoEOF" )

CTestDlgDlg.h ヘッダに宣言
  CDbData m_dbData;  //データベースアクセス用

BOOL CTestDlgDlg::OnInitDialog()
{
  <省略>

  AfxOleInit();

  if(!m_dbData.DbOpen("C:/DB.mdb")){
    AfxMessageBox("データ用データベースファイルを開けませんでした。", MB_ICONERROR);
    return  FALSE;
  }
  <省略>

}

void CTestDlgDlg::OnDBTest()
{
  COleSafeArray vaFieldlist;
  COleSafeArray vaValuelist;
  _variant_t retField;
  static float  fa = 0;
  char  dummy_id[][8] = {"CLC001", "CLC002", "CLC003", "CLC004", "CLC005"};
  
  fa = fa + (float).1;
  vaFieldlist.CreateOneDim(VT_VARIANT, 5);
  vaValuelist.CreateOneDim(VT_VARIANT, 5);
  for(long la = 0; la < max; la++){
    if(retField.vt != VT_NULL){
      vaFieldlist.PutElement(&la, &(_variant_t(dummy_id[la])));
      vaValuelist.PutElement(&la, &(_variant_t((float)fa)));
    }
  }
  // テーブル更新
  m_dbData.SetTagValueArray("T_Data", &vaFieldlist, &vaValuelist);
  vaFieldlist.Clear();
  vaFieldlist.Detach();
  vaValuelist.Clear();
  vaValuelist.Detach();
  
}

BOOL CDbData::DbOpen(char *DataSrcName)
{
  CString  str;

  // Access2000形式の場合、Jet.OLEDB.4.0
  str.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=%s;", DataSrcName);

  //省略
}

//Fieldlist と一致するレコードの"値"フィールドにValuesの値を代入
BOOL CDbData::SetTagValueArray(const char *tbl_name,
            COleSafeArray *Fieldlist, COleSafeArray *Values)
{
  _variant_t vRecsAffected(0L);
  _variant_t  vValue;
  char  str[64];
  long  la = 0;
  long  max = (long)vaFieldlist->GetOneDimSize();  
  _RecordsetPtr pRecordSet;
  HRESULT hr;
  _variant_t vNull;
  vNull.vt = VT_ERROR;
  vNull.scode = DISP_E_PARAMNOTFOUND;

  sprintf(str, "SELECT * FROM %s", tbl_name);

  try
  {
    hr = pRecordSet.CreateInstance(_uuidof(Recordset));
    if (SUCCEEDED(hr)){
      pRecordSet->PutRefActiveConnection(m_pConnection);
      hr = pRecordSet->Open(str, vNull, adOpenForwardOnly, adLockOptimistic, adCmdText);
      if (SUCCEEDED(hr)){
        _variant_t  vVal;
        while(!pRecordSet->GetadoEOF()){
          vValue = pRecordSet->GetCollect("フィールド名");
          for(long la = 0; la < max; la++){
            vaFieldlist->GetElement(&la, &vVal);
            if(vValue == vVal){
              Values->GetElement(&la, &vVal);
              pRecordSet->PutCollect("値", vVal);
              break;
            }
          }
          pRecordSet->MoveNext();
        }
        pRecordSet->Close();
        pRecordSet.Release();
      }
    }
  }
  catch( _com_error &e )
  {
    // 省略
  }

  return  FALSE;
}


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加