掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
ADOで、メモリの増加を防ぐには? (ID:56666)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
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; }
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.