安装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;
}
是程序代码问题还是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;
}
以下代码是以控制台为例,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