安装mysql-connector-odbc-5.1.0后,配置好ODBC,OBDC的名字为MySQLTsetOdbc;下边的测试代码连接MYSQL时出现内存泄漏,但测试SQL Server没有内存泄漏现象;反复测试出现内存泄漏的地方为:pCmd->ActiveConnection = pADOConn;
是程序代码问题还是odbc的问题?哪位高手解答一下,谢谢!int TestFun(void)
{
try
{
pADOConn.CreateInstance(__uuidof(Connection));//Mysql
CString strSource = "Data Source=MySQLTsetOdbc;User ID=Test;Password=111111";
//SQL server
//CString strSource = "Provider=SQLOLEDB.1;Data Source=;Initial Catalog=TestDB;User ID=sa;Password=";
HRESULT hr = pADOConn->Open((_bstr_t)strSource,_T(""),_T(""), adModeUnknown);
if (FAILED(hr))
{
TRACE(_T("Connected Error!\n"));
return -1;
} pADOConn->CursorLocation = adUseClient; TRACE(_T("Connected Ok!\n")); _CommandPtr pCmd;
hr = pCmd.CreateInstance(__uuidof(Command));
if (FAILED(hr))
{
TRACE(_T("_CommandPtr CreateInstance Error!\n"));
return -1;
}
pCmd->CommandType = adCmdText;
pCmd->CommandText = _bstr_t(_T("Update t_test set c2 = '08-10-20' where c1 = '1234'")); VARIANT varAffected;
varAffected.vt = VT_UI4; //这里出现内存泄漏,如注释下边这行,不会出现内存泄漏
pCmd->ActiveConnection = pADOConn;
                //不执行命令,也出现内存泄漏
// pCmd->Execute(&varAffected, NULL, adCmdText);
                //下边这行其实没什么用
pCmd->ActiveConnection = NULL; pCmd = NULL; pADOConn->Close(); pADOConn = NULL; }
catch (_com_error &e)
{
if (pADOConn)
{
CString strErrMsg;
ErrorsPtr Errors = pADOConn->GetErrors();
_variant_t Index;
Index.vt = VT_INT;

for (Index.intVal = 0; Index.intVal < Errors->Count;  Index.intVal++)
{
ErrorPtr Error = Errors->GetItem(Index);

nErrorNum = Error->GetNumber();
strErrMsg += (LPCTSTR)Error->GetDescription();

TRACE(_T("Database Error:0x%08x:%s\n"), nErrorNum, (LPCTSTR)Error->GetDescription());

if (Index.intVal != Errors->Count -1)
strErrMsg += _T("; ");
}
AfxMessageBox(strErrMsg); 
}
else
AfxMessageBox(e.ErrorMessage());  return -1;
} return 0;
}

解决方案 »

  1.   

    开一个线程不停运行上面的函数,程序每秒增加5-10M的内存!但改成连SQL Server时,内存不增加。晕!
      

  2.   

    对,同样的代码,只是接字符串不同,MYSQL出现严重的内存泄漏,而SQL SERVRE很正常 
      

  3.   

    那会不会是驱动的问题? 去下载安装一个mysql的oledb的驱动再试试..
      

  4.   

    下了 MySQL OLE DB Provider 测试一下也是客户端出现内存泄漏
      

  5.   

    pADOConn用完了为什么不.release();
      

  6.   

    打开VC6,新建一工程,选择WIN32控制台或MFC都可以。
    以下代码是以控制台为例,MFC相同。
    选择建立一个空项目,再新建一个c++文件,复制以下代码,具体编译设置见最下面的说明:#include <windows.h>
    #include <iostream>
    #include <mysql.h>
    #include <stdio.h>
    using namespace std;
    int main()
    {
    //connection params
     FILE *file;
     char *host = "localhost";
     char *user = "root";
     char *pass = "yourpassword";
     char *db = "mysql"; 
     
     //sock
     MYSQL *sock;
     MYSQL_RES *results;
     MYSQL_ROW record;
     
     sock = mysql_init(0);
     if (sock) cout << "sock handle ok!" << endl;
     else {
     cout << "sock handle failed!" << mysql_error(sock)<< endl;
     }
     //connection
     if (mysql_real_connect(sock, host, user, pass, db, 0, NULL, 0))
     cout << "connection ok!" << endl;
     else {
     cout << "connection fail: " << mysql_error(sock)<< endl;
     }
     mysql_set_character_set(sock,"gb2312");
     //connection character set
     cout << "connection character set: " << mysql_character_set_name(sock) << endl;
     //wait for posibility to check system/mysql sockets if(mysql_query(sock,"select * from user"))
     {
     cout <<"very good!" <<endl;
     } //links=mysql_fetch_row(sock); results=mysql_store_result(sock);
     printf("user\tlevel\n");
     while(record=mysql_fetch_row(results))
     {
     printf("%s\t %s\n",record[1],record[3]);
     
     }
     mysql_free_result(results);
     system("PAUSE");
     
     //closing connection
     mysql_close(sock);
     return EXIT_SUCCESS;
    }具体的编译连接环境如下:我的mysql安装路径为d:\mysql
    所以要在VC中设置include路径和lib的路径。
    一、添加MySql的include目录到VC工作台中
    Project-> Settings-> C/C++-> Category-> Preprocessor-> Additional include directories中添加:D:\mysql\include。二、添加lib的路径:Tools-> Options-> Directories中选择Library files,然后添加lib的目录:D:\MYSQL\LIB
    然后在Project-> Settings-> Link中,添加libmysql.lib到Object/libray modules中。三、还要确保Project Options中为/subsystem:console或是/subsystem:window,否则编译错误 (这一项不太重要,如果在控制台中用subsystem:console
    在MFC中用/subsystem:window
      

  7.   

    上面是我以前写过的一个VC远程连接MYSQL的实例。
      

  8.   

    经验证,是mysql-connector-odbc-5.1.0的bug最新的mysql-connector-odbc没有此问题