C:mysql_store_result()和mysql_fetch_row()在不同的函数中

时间:2013-06-17 12:10:07

标签: mysql c

我在使用函数mysql_store_result()和mysql_fetch_row()时遇到了一个问题。

如果我这样做,一切正常:

int main() {
  MYSQL *connection;
  MYSQL_RES *result;
  MYSQL_ROW row;
  //Connect to database

  mysql_query(connection, "SELECT column1 FROM table ORDER BY column1 ASC");
  result = mysql_use_result(connection);
  row = mysql_fetch_row(result);
  puts(row[0]);

  //Free results & close connection
}

但是当我试图在两个不同的函数中执行它时,我总是在mysql_fetch_row(结果)上得到一个错误:没有可用的源代码“mysql_fetch_row()位于0xb781454d”。

我尝试了这两种方式(没有释放结果或关闭数据库中的连接()):

int main() {
  MYSQL_RES *result;
  MYSQL_ROW row;

  database(result);
  row = mysql_fetch_row(result);
  puts(row[0]);

  //free results
}

void database(MYSQL_RES *result) {
  MYSQL *connection;
  //Connect to database

  mysql_query(connection, "SELECT column1 FROM table ORDER BY column1 ASC");
  result = mysql_use_result(connection);
}

int main() {
  MYSQL *connection;
  MYSQL_RES *result;
  MYSQL_ROW row;

  database(connection);
  result = mysql_use_result(connection);
  row = mysql_fetch_row(result);
  puts(row[0]);

  //close connection & free results
}

void database(MYSQL *connection) {
  //Connect to database

  mysql_query(connection, "SELECT column1 FROM table ORDER BY column1 ASC");
}

所以我的问题:

  1. 我做错了什么?
  2. 是否可以将选择和输出分为两个不同的功能而不将所有结果复制到RAM中的不同结构中?
  3. 我正在尝试在没有面向对象的过程编程中实现它。什么是最佳做法?
  4. 感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您的第一次尝试失败,因为database按值传递指向MYSQL_RES的指针。这意味着它在调用者变量的副本上运行,不会影响调用者变量的状态。如果你想修改调用者的变量,你需要传递一个指向它的指针,即MYSQL_RES**

int main() {
    ....
    database(&result);
    ....
}

void database(MYSQL_RES **result) {
  MYSQL *connection;
  //Connect to database

  mysql_query(connection, "SELECT column1 FROM table ORDER BY column1 ASC");
  *result = mysql_use_result(connection);
}

或者,在这种情况下,如果您更改database以返回MYSQL_RES*

,则会更容易
int main() {
    ....
    result = database();
    ....
}

MYSQL_RES* database() {
  MYSQL *connection;
  //Connect to database

  mysql_query(connection, "SELECT column1 FROM table ORDER BY column1 ASC");
  return mysql_use_result(connection);
}

第二个重构选项因类似原因而失败,但connection是问题变量。