如题,这是我的数据库的OPEN函数:
bool CMyDatabase::Open(char * szHost, char * szUser, char * szPasswd,char * szDB, 
unsigned int uiPort, char * szSocket, unsigned int uiFlag )
{
if (m_bIsOpen)
{ if (m_nRefCount == 0 )
Close();
else 
{ // message:please close all recordset
g_nMyDBError = 1000;
return FALSE;
}
} m_hdbc = mysql_init(NULL);
if (m_hdbc == NULL) 
{ g_nMyDBError = 1001;
return FALSE;
} if (szDB != NULL) 
strcpy(m_szDBName ,szDB);

if ( mysql_real_connect(m_hdbc, szHost, szUser, szPasswd, 
szDB, uiPort, szSocket , uiFlag) == NULL )
/*if ( mysql_real_connect(m_hdbc, "localhost", "root", "123", 
"abc", 3306, "" , 0) == NULL )*/
{ g_nMyDBError = 1002;//下断点的话会走到这里来
return FALSE;
}
m_bIsOpen = TRUE;
return TRUE;
}
m_hdbc = mysql_init(NULL);这一句执行完成以后m_hdbc不是NULL,但是它到了if ( mysql_real_connect(m_hdbc 这里的时候会出错,会连接失败,m_hdbc的东西我仔细看了,经过mysql_init(NULL)返回的这个根本就没有初始化。我另写了一个超简单的版本:
#include "windows.h"
#include "mysql.h"
#include "stdio.h"
class t
{
public:
bool Init()
{
if(!open())
return false;
return true;
}
private:
bool open()
{
m_hdbc = mysql_init(NULL);
if (m_hdbc == NULL) 
{
return FALSE;
}

if ( mysql_real_connect(m_hdbc, "localhost", "root", "123", 
"abc", 3306, "" , 0) == NULL )
{
return FALSE;
}
return true;
}
private:
MYSQL* m_hdbc;
};
t g_db;
void main()
{
if(g_db.Init())
printf("");
return;
}
这个版本的可以正常运行,而且我跟踪过去的m_dbc经过mysql_init(NULL)初始化之后里面是有东西的。我的环境是VC6.0,MYSQL是4.1。在线等待答案,希望回帖的人看清楚了我的问题所在,不要从别处复制一些我不想看到的东西过来。谢谢!

解决方案 »

  1.   

    是不是要初始化一下?
    mysql_library_init(0, NULL, NULL);
      

  2.   

    另外,
    mysql_real_connect 返回NULL,可以用 mysql_error(m_hdbc) 看看, 是什么错误
      

  3.   

    #2楼的,这个不用初始化,我看了MYSQL的手册,上面说了是不用调用mysql_library_init(0, NULL, NULL);函数的,mysql_init(NULL); 函数会默认调用。原话如下:
    If you like, the call to mysql_library_init() may be omitted, because mysql_init() will invoke it automatically as necessary. 
    另外我的最简单的例子里也是这样弄的,没有调用。
      

  4.   

    #4楼的能说得具体一点么?我
    if ( mysql_real_connect(m_hdbc, szHost, szUser, szPasswd, 
    szDB, uiPort, szSocket , uiFlag) == NULL )
    /*if ( mysql_real_connect(m_hdbc, "localhost", "root", "rot_pwd_8", 
    "gametest", 3306, "" , 0) == NULL )*/
    {
    MessageBox(NULL,mysql_error(m_hdbc),"",0);
    g_nMyDBError = 1002;
    return FALSE;
    }
    m_bIsOpen = TRUE;//竟然执行到了这里!!!
    return TRUE;
    怎么什么都没看到而且它竟然还执行了我上面加注释的地方不可思议。
    这个mysql_error(m_hdbc)到底怎么个用法????
      

  5.   

    搞清楚了,我重新来个const char*s = mysql_error(m_hdbc);就能看到了。错误原话如下:
    Client does not support authentication protocol requested by server; consider upgrading MySQL client 
    经查具体原因如下:
    我的源码是别人编译过的,它的MYSQL是4.1以前的版本,而它的libmysql.dll文件还保留在原来的.EXE同级目录里。我没有更新这个文件。所以运行的时候会出现这个问题。
    这个问题我搞了三天没弄明白,现在终于明白了。谢谢了!