使用mysql_fetch_row后应用程序崩溃

时间:2013-11-16 20:47:31

标签: c++ mysql sql freebsd

我遇到一个关于简单MySQL函数的问题,mysql_fetch_row当我使用它时,我的应用程序将崩溃,它会在执行时发生。 无论我运行什么查询,它都会崩溃。核心转储说:

(gdb) bt full
#0  0x2866397f in mysql_store_result () from /usr/home/ld/application
#1  0x28637905 in main () from /usr/home/ld/application
#2  0x08441d3a in CRC_GetCodeSize20 ()

代码看起来很简单:

int main()
{
  MYSQL *conn;      // the connection
  MYSQL_RES *res;   // the results
  MYSQL_ROW row;    // the results row (line by line)

  struct connection_details mysqlD;
  mysqlD.server = "localhost";  // where the mysql database is
  mysqlD.user = "mysqlusername";        // the root user of mysql   
  mysqlD.password = "mysqlpassword"; // the password of the root user in mysql
  mysqlD.database = "mysql";    // the databse to pick

  conn = mysql_connection_setup(mysqlD);

  res = mysql_perform_query(conn, "select 1, 2");

  printf("Result:\n");
  while ((row = mysql_fetch_row(res)) !=NULL)
      printf("%s\n", row[0]);

  mysql_free_result(res);
  mysql_close(conn);

  return 0;
}

有什么问题?

修改

mysql_perform_query:

MYSQL_RES* mysql_perform_query(MYSQL *connection, char *sql_query)
{
   if (mysql_query(connection, sql_query))
   {
      printf("MySQL query error : %s\n", mysql_error(connection));
      exit(1);
   }

   return mysql_use_result(connection);
}

2 个答案:

答案 0 :(得分:4)

确定。所以我花了很多时间来重现这个问题。我假设您从本教程中采用了示例:http://www.codingfriends.com/index.php/2010/02/17/mysql-connection-example/,因为它完全相同。

采取的步骤:

  1. cd / usr / ports / databases / mysql56-client&& make install

  2. 将上述教程中的确切代码复制粘贴到test.cpp

  3. g ++ -I / usr / local / include / mysql -L / usr / local / lib / mysql -lmysqlclient test.cpp

  4. ./ a.out的

  5. 输出:

    数据库中的Mysql表: 条目 老

  6. 我使用了远程mysql服务器和测试帐户。首先,我确保可以通过控制台mysql -h mydomain.com -u test -p

    连接到它

    该程序似乎正常工作。我注意到的唯一事情是,有时需要1秒才能执行,而其他时间则需要10秒才能执行。

    基于PC-BSD Isotope Edition(9.1 RELEASE)构建,具有最新的端口树。

    所以现在有2个人成功建造(我和你的朋友)。代码是相同的唯一我能想到的错误是libmysqlclient.so库。尝试更新您的端口树并进行全新构建。或者尝试不同的版本。

答案 1 :(得分:0)

您可以尝试使用netstat命令查看已注册的 * 端口 *,因为它可能崩溃的原因是,您使用的是已经注册的你的dbase的端口。检查一下。
此外,如果您发现在 已经 注册的端口上工作,请尝试更改S / W中的端口号以及必须从注册表中删除该值的端口号(注册表)。(有时它使用影子端口,所以需要这样做。)

同样检查“conn”中的null,不知何故,你可能无法启动连接。 (连接池耗尽?非常值得怀疑)。