关于mysql c api查询mysql数据库中的information_schema.statistics表时返回结果错误的问题。(api有bug?)代码如下:
void CHMySql::Free()
{
if(res != NULL)
mysql_free_result(res);
res = NULL;
}
bool CHMySql::Exist(const char * pstrSql)
{
Free();
if(mysql_real_query(&mysql, (char*)(LPCTSTR)pstrSql, (UINT)strlen(pstrSql)) != 0)
{
AfxMessageBox(GetErrorInfo()); 
return FALSE;
}
res = mysql_store_result(&mysql);
if(res != NULL)
{
return (mysql_num_rows(res) > 0);
}
return FALSE;
}
//判断某张表中,索引是否存在
BOOL CHMySql::ExistIndex(const char * lpstrIndex, const char * lpstrTable)
{
char strSql[256];
sprintf(strSql, "select index_name from information_schema.statistics where table_name='%s' and index_name='%s';", lpstrTable, lpstrIndex);
return Exist(strSql);
}CHMySql sql;
if(!sql.ExistIndex("index_formid", "sycheck")
{
AfxMessageBox("索引不存在");
}
else
{
AfxMessageBox("索引存在");
}执行以上代码,结果为"索引不存在"。当我用命令行在sycheck表中增加index_formid索引后再执行以上代码,结果还是"索引不存在"(但是在客户端命令行执行strSql字符串处的命令时,命令行显示索引已经存在。)。也就是说mysql c api查询information_schema.statistics表和命令行查询的结果不一样。显然是api返回的结果是错误的。奇怪的是当我重启mysql后,api返回"索引存在",又是正确的了。但我再删除该索引,api返回的结果还是"索引存在"。要保证api返回的结果的正确性,就必须在执行调用api的代码前重启一次mysql。这个是什么问题?是不是api的bug?注:api查询普通表的时候,没有这个错误。

解决方案 »

  1.   

    单步断点调试中看一下实际的SQL语句是什么,会不会是SQL写错了。
      

  2.   

    SQL语句应该没问题,要不然重启mysql后再执行代码,返回的结果为什么又是正确的?
      

  3.   

    MYSQL、MYSQL ODBC什么版本、系统是多少位的
    重新建立此表的索引再试试
      

  4.   

    在客户端上运行你的SQL看看结果
      

  5.   

    information_schema.statistics, 这个统计有延时吧,而且很可能跟会话有关。
    你在你的代码里执行一段创建索引的语句,紧接着上述调用,肯定有值。
      

  6.   

    早就解决了,忘上来回复了。
    是information_schema.statistics的TABLE_NAME字段要区分大小写的问题。
    我在调用api函数的sql语句里写是table_name="SYCHECK",但是在客户端命令行输入的sql语句是table_name="sycheck"。而information_schema.statistics表中的TABLE_NAME字段是小写的"sycheck"。所以命令行返回的是正确的,api返回的是错误的。奇怪的是只有information_schema.statistics的TABLE_NAME字段要区分大小写,其他字段如INDEX_NAME不区分大小写。还有为什么在api里的sql语句table_name="SYCHECK",重启mysql后第一次执行时结果是正确的,以后就不正确的原因就不得而知了。
      

  7.   

    因为在我项目的代码里是
    if(!sql.ExistIndex("index_formid", SY_TB_CHECK)
    而SY_TB_CHECK在其他文件中是这样定义的: #define SY_TB_CHECK _T("SYCHECK")
    查了一个下午,发现是表名的大小写写错了。