调试代码的时候碰到了三个问题:
1. mysql_query()函数执行失败后,返回值为1,却打不出错误    iRet = mysql_query(l_pMyData, szSqlSentence);    if (SK_SUCCESS != iRet)
    {
        MTGW_LOG_DBG("fail:SqlSentence:%s\n",szSqlSentence);
        MTGW_LOG_DBG("error flag is %d: %s\n",iRet, mysql_error(l_pMyData));
        retuan FAIL;
     } 打印出来的是 
fail:select * from history limit 0, 50
error flag is 1:
可我看了mysql的相关头文件,好像没有返回值是1的呀,貌似是从1000多开始的,到底是有错没错,语句是可以执行的;
有时候却打印出:
error flag is 1: Lost connection to MySQL server during query
2. mysql_store_result函数执行失败,返回NULL
    printf("%x\n",l_pMyData);
    iRet = mysql_query(l_pMyData, szSqlSentence);
    printf("%x\n",l_pMyData);     ......
    printf("%x\n",l_pMyData);
    res = mysql_store_result( l_pMyData ) ;
    printf("%x\n",l_pMyData);
    if (NULL == res)
    {
         printf("mysql_store_result fail\n");
     }打印出:
0x003030a8
0x003030a8
0x003030a8
0x003030a8
mysql_store_result fail
  句柄的指向并没有改变,怎么会执行失败呢3.第三个问题就更奇怪了,程序运行时上述函数都是执行成功的,但在单步调试时经常出现失败。

解决方案 »

  1.   

    检查MYSQL的最长允许等待时间。
      

  2.   

    错误日志应该是这样设置吧:log-error = "D:/errordate.err" ,内容是空的
    还有楼上说的最长允许等待时间指的哪一个,关于时间的有好几个?我的一些配置如下:
    [client]
    port = 3306
    socket = /tmp/mysql.sock
    default-character-set=gbk[mysqld]
    port = 3306
    default-character-set=gbk
    log-error = "D:/errordate.err"  #错误日志
    log = "D:/logdate.err"          #通用查询日志socket = /tmp/mysql.sock
    skip-locking
    key_buffer_size = 16K
    max_allowed_packet = 32M  #10
    table_open_cache = 4
    sort_buffer_size = 64K
    read_buffer_size = 256K
    read_rnd_buffer_size = 256K
    net_buffer_length = 8K
    thread_stack = 128K
    tmp_table_size = 50
    query_cache_size=32M  #查询缓冲
    thread_cache_size=8  
    net_read_timeout=120 
    net_write_timeout=120server-id = 1
    skip-name-resolve [mysqldump]
    quick
    max_allowed_packet = 32M[mysql]
    no-auto-rehash[myisamchk]
    key_buffer_size = 8M
    sort_buffer_size = 8M[mysqlhotcopy]
    interactive-timeout帮忙分析下吧,我在看了很多资料了,都没解决。我在线等待!!!!
      

  3.   

    mysql> show variables like '%timeout%';
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | connect_timeout            | 10    |
    | delayed_insert_timeout     | 300   |
    | innodb_lock_wait_timeout   | 50    |
    | innodb_rollback_on_timeout | OFF   |
    | interactive_timeout        | 28800 |
    | net_read_timeout           | 30    |
    | net_write_timeout          | 60    |
    | slave_net_timeout          | 3600  |
    | table_lock_wait_timeout    | 50    |
    | wait_timeout               | 28800 |
    +----------------------------+-------+
    10 rows in set (0.00 sec)mysql>
      

  4.   

    return值只要不是0,都是有错误或者警告信息的,估计程序出错跟timeout值有关。~~~~~~~~~~~~~~~~~~~~~~``
    http://iihero.com
      

  5.   

    不知道哪个值的影响大,调试的时候我只连接3个客户端,一条语句一条语句执行,没有等多久。有时候一开始调试,mysql_query函数就出错了。这问题就像个定时炸弹,虽然运行时没出什么问题,但不知道哪天突然爆发出来,一直搞不定。另外问个问题,哪个参数可以设置查询结果存储上限的,避免查询后保存结果集时内存溢出。
    mysql> show variables like '%timeout%';
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | connect_timeout            | 10    |
    | delayed_insert_timeout     | 300   |
    | innodb_lock_wait_timeout   | 50    |
    | innodb_rollback_on_timeout | OFF   |
    | interactive_timeout        | 28800 |
    | net_read_timeout           | 120   |
    | net_write_timeout          | 120   |
    | slave_net_timeout          | 3600  |
    | table_lock_wait_timeout    | 50    |
    | wait_timeout               | 28800 |
    +----------------------------+-------+
      

  6.   

    要是检查sql语句,楼主试下这个:  if (mysql_query('select * from history limit 0,50')){
       echo 'success';
      }
    else{echo mysql_error();}
      

  7.   

    另外问个问题,哪个参数可以设置查询结果存储上限的,避免查询后保存结果集时内存溢出;加大max_allowed_pacted的值,试下;
      

  8.   

    现在我在查询后执行mysql_store_result出错,打印出
    out of memory (Needed 448 bytes)配置文件里 max_allowed_packet = 64M,这个值应该是足够的。还是老样子,运行时是成功的,在调试时出现问题。
      

  9.   

    溢出内存了,能不能用mysql_use_result实现;
      

  10.   

    可能我的问题要换一个问法了,我的代码里有一个定时器,每隔几秒就更新数据库数据,
    当我把它停掉后再调试,之前的函数失败问题就没有出现了。可是我用的是两个独立的句柄,
    不应该互相影响才对。定时器(5秒)                      mysql_query()
     操作表 A    --->   数据库  <---  mysql_store_result()
                                         mysql_fetch_row() 
                                     操作表 B
    它们是基于多线程的
      

  11.   

    这个不是解决问题的办法。
    我了解你说的情况,有时候,如果长时间一个connection不活动,不执行任何CRUD操作,这个connection就会被server端给“废”掉,
    解决办法就是在你得到connection之后,立即设置两个参数:
        std::string timeout = "2592000";
        sql = "set wait_timeout=" + timeout;
        mysql_query(sql.c_str());    sql = "set interactive_timeout=" + timeout;
        mysql_query(sql.c_str());
    这里将timeout设成一个月,足够应付了。
    这之后执行你要的查询,就不会有什么问题。还有一种解决方案,启用一个线程, 每隔一段时间,比如1分钟,针对每个连接,作一次简单的"select 1"操作。第一种方案最简单。