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;
}
ツイート | ![]() |