下面是stdafx.h的#pragma once#include "targetver.h"#include <stdio.h>
#include <tchar.h>// TODO: 在此处引用程序需要的其他头文件#import "C:\Program Files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
#import "c:\program files\common files\system\ado\msadox.dll" 
// testAdoB.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include <atlstr.h>
int _tmain(int argc, _TCHAR* argv[])
{
if( FAILED(::CoInitialize(NULL)) ) 
{

return 0;
} TCHAR asd=getchar(); BSTR connStr=L"Driver={SQL server};server=192.168.0.1;database=fafunnew;Pooling=true;Min Pool Size=5;UID=XXX;PWD=XXX";
//comP.CreateInstance(__uuidof(Command));
//rec.CreateInstance(__uuidof(Recordset)); _variant_t vNull;
vNull.vt = VT_ERROR;
vNull.scode = DISP_E_PARAMNOTFOUND; while (asd!='N')
{
_ConnectionPtr con;
_RecordsetPtr rec;
_CommandPtr comP;
try
{
con.CreateInstance(__uuidof(Connection));
con->CursorLocation   =   adUseClient ;
con->Mode=adModeRead;
con->Open(connStr,"","",0); comP.CreateInstance(__uuidof(Command));
_ParameterPtr pp[5];//=new _ParameterPtr[5]; pp[0]=comP->CreateParameter("@siteId",adInteger,adParamInput,sizeof(int),(int)101);
comP->Parameters->Append(pp[0]);
pp[1]=comP->CreateParameter("@usertype",adUnsignedTinyInt,adParamInput,sizeof(BYTE),(byte)0); comP->Parameters->Append(pp[1]); pp[2]=comP->CreateParameter("@salelease",adUnsignedTinyInt,adParamInput,sizeof(BYTE),(byte)1); comP->Parameters->Append(pp[2]); pp[3]=comP->CreateParameter("@housetype",adUnsignedTinyInt,adParamInput,sizeof(BYTE),(byte)1); comP->Parameters->Append(pp[3]); pp[4]=comP->CreateParameter("@urltypefrom",adUnsignedTinyInt,adParamInput,sizeof(BYTE),(byte)4); comP->Parameters->Append(pp[4]);
comP->CommandText="getDicConvert";
comP->CommandType=adCmdStoredProc;
comP->ActiveConnection = con;
comP->Prepared=true; rec.CreateInstance(__uuidof(Recordset));
rec->PutRefSource(comP); rec->Open(vNull,vNull,adOpenStatic,adLockReadOnly ,comP->CommandType); int i=rec->RecordCount; rec->MoveNext(); rec->MoveLast(); //if (comP!=NULL)
//{
// comP->Release();
//} if (rec!=NULL)
{
if (rec->State==adStateOpen)
{
rec->Close(); } //rec->Release();
// rec=NULL;
} if (con!=NULL)
{
if (con->State==adStateOpen)
{
con->Close();
} //con=NULL; }
}
catch(_com_error &e)
{ CString err;
err.Format(L"%s", e.Description() ); }
catch (...)
{
} asd=getchar();

}
CoUninitialize();
return 0;
}输入一次执行两次,大约增长60K内存

解决方案 »

  1.   

    不要反复的打开,关闭数据库,它会有资源泄漏
    你用一个成员变量,程序启动的时候Open,后面就是每次利用它来查询sql
    直到程序退出的时候才Close
      

  2.   

    我这只是个测试!我知道了,这是ado自己造成的泄漏,和我的程序是没有多少关系的!我现在想用一个connection(多线程同时调用,可能同时得到100个结果集,这些结果集不必更新、删除、插入),得到n个能够移动、搜索的结果集,而同时,在用command进行更新时不会产生错误的(如什么结果集未关闭等),行不行?