LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1743|回复: 25

用GTK+编写数据库应用程序的问题,请大家帮忙看看这段程序

[复制链接]
发表于 2004-9-9 13:13:20 | 显示全部楼层 |阅读模式
这是我写的一个测试的程序,目的是想把从数据库查询得到的信息用GTK的图形显示出来:
  1. #include <stdio.h>
  2. #include <gtk/gtk.h>
  3. #include <mysql.h>

  4. /* Define global variables */

  5. MYSQL *mysql;
  6. MYSQL_RES *query_result;
  7. MYSQL_ROW row;

  8. gchar *username = "root";
  9. gchar *password = "123456";
  10. gchar *database = "station_system";
  11. gchar *hostname = "localhost";

  12. /* End the global variables Define */

  13. gint
  14. query_mysql (gchar *query)
  15. {
  16.   gint success = 0;

  17.   if (mysql_query (mysql, query) == 0)
  18.     {
  19.       query_result = mysql_store_result (mysql);
  20.       success = 1;
  21.     }

  22.   return success;
  23. }
  24.       

  25. void
  26. window_quit()
  27. {
  28.   printf ("Window quit!\n");
  29.   gtk_main_quit();
  30. }

  31. gint
  32. main (gint argc, gchar *argv[])
  33. {
  34.   gtk_set_locale ();
  35.   gtk_init (&argc, &argv);

  36.   GtkWidget *window;
  37.   GtkWidget *button;
  38.   GtkWidget *box;
  39.   GtkWidget *label;

  40.   gchar *query;

  41.   if (mysql_init (mysql) == NULL) return 1;

  42.   mysql = mysql_real_connect (mysql, hostname, username, password, database, 0, 0, 0);

  43.   if (mysql == NULL) return 1;

  44.   sprintf (query, "SELECT * FROM station WHERE province="广东省"");

  45.   if (query_mysql (query) == 0) return 1;

  46.   row = mysql_fetch_row (query_result);

  47.   window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  48.   label = gtk_label_new (row[0]);
  49.   button = gtk_button_new_with_label ("退出");
  50.   box = gtk_vbox_new (TRUE, 5);

  51.   gtk_window_set_title (GTK_WINDOW (window), "数据库窗口");
  52.   gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
  53.   //gtk_window_set_border_width (GTK_WINDOW (window), 10);

  54.   gtk_signal_connect (GTK_OBJECT (button), "clicked", GTK_SIGNAL_FUNC (window_quit), NULL);

  55.   gtk_box_pack_start (GTK_BOX (box), label, FALSE, FALSE, 0);  
  56.   gtk_box_pack_start (GTK_BOX (box), button, FALSE, FALSE, 0);
  57.   gtk_container_add (GTK_CONTAINER (window), box);

  58.   gtk_widget_show (label);
  59.   gtk_widget_show (button);
  60.   gtk_widget_show (box);
  61.   gtk_widget_show (window);

  62.   gtk_main ();

  63.   mysql_free_result (query_result);
  64.   mysql_close (mysql);

  65.   return 0;
  66. }
复制代码


我用下面的参数编译成功:
gcc -o new new.c  `gtk-config --cflags --libs` -I/usr/local/mysql/include/mysql -L/usr/local/mysql/lib/mysql -lmysqlclient -lz

但执行程序时出现“段错误”,然后程序退出,关键是哪里出错了呢?
我是直接取查询到的MYSQL_ROW类型变量row作为label = gtk_label_new (row[0]);传递给GTK函数的,这样是不是不行?请兄弟们指教,谢谢
发表于 2004-9-9 15:00:55 | 显示全部楼层
可惜我的电脑坏了,不然就帮你测试一下.恩~~~~~~~~~~~~
发表于 2004-9-9 16:50:43 | 显示全部楼层
加上-g重新编译 用gdb调试一下看看是哪里出的问题
发表于 2004-9-9 18:10:48 | 显示全部楼层
是mysql这个指针变量引起的,
 楼主| 发表于 2004-9-9 19:11:31 | 显示全部楼层
最初由 freedomli 发表
是mysql这个指针变量引起的,


这位兄台请了
能否说多一点,我不知道这个MYSQL *mysql指针哪里用错了?
发表于 2004-9-9 19:12:06 | 显示全部楼层
看看是那行出错的。再看看类型转换什么的。
加上宏转换
如 GTK_XXXX_XX
 楼主| 发表于 2004-9-9 19:16:51 | 显示全部楼层
最初由 wide288 发表
看看是那行出错的。再看看类型转换什么的。
加上宏转换
如 GTK_XXXX_XX


在GDB里运行,有如下错误,再仔细看看mysql = mysql_real_connect (mysql, hostname, username, password, database, 0, 0, 0);用法好像没有用错

Program received signal SIGSEGV, Segmentation fault.
0x4031932f in mysql_real_connect ()
   from /usr/local/mysql/lib/mysql/libmysqlclient.so.12
发表于 2004-9-9 19:25:36 | 显示全部楼层
mysql_real_connect
这个函数我没看,我也正在调程序,一样命苦啊。你好好看看,类型最好能对上就行。
 楼主| 发表于 2004-9-11 21:23:03 | 显示全部楼层
自己顶一下
发表于 2004-9-13 20:27:26 | 显示全部楼层
嘻嘻~~mysql在mysql_real_connect之前要先init一下的...
好像叫mysql_init(*sql)吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表