LinuxSir.cn,穿越时空的Linuxsir!

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

我想用MySQL自带的C_API来编写基于GTK+的实现查询,更新等功能的图形界面软件应如何写

[复制链接]
发表于 2004-5-15 10:00:34 | 显示全部楼层 |阅读模式
我是程序开发的新手,许多东西一知半解,请兄弟们指导:

我想对一个Mysql的数据库实现查询,更新等功能,使用C_API可以写出没有GUI的程序,但我想写GTK+的图形界面的,但标准C的语句在GTK+里都被改成前缀加多一个g,我想知道应该如何让查询的结果传给GTK+显示或把用户的输入传给Mysql_C_API来对数据库更新?它们如何写才行?请兄弟们给我提示,由于本人比较笨,还请说的详细一点给个例子,多谢:thank :thank
发表于 2004-5-15 21:16:55 | 显示全部楼层

回复: 我想用MySQL自带的C_API来编写基于GTK+的实现查询,更新等功能的图形界面软件应

最初由 kiron 发表
标准C的语句在GTK+里都被改成前缀加多一个g,

??!
能说详细点吗?
 楼主| 发表于 2004-5-15 22:31:56 | 显示全部楼层

回复: 回复: 我想用MySQL自带的C_API来编写基于GTK+的实现查询,更新等功能的图形界面

最初由 kj501 发表
??!
能说详细点吗?


使用MYsql的C_API写的一个例子:
  1. #include <stdio.h>
  2. #include <mysql.h>

  3. int main() {
  4.   MYSQL_RES *query_result;
  5.   MYSQL_ROW row;
  6.   MYSQL *db_handle,mysql;
  7.   int query_error;
  8.    
  9.   mysql_init(&mysql);
  10.   db_handle = mysql_real_connect (&mysql,"localhost","name","password","station_system",0,0,0);
  11.   if (db_handle == NULL) {
  12.     printf (mysql_error(&mysql));
  13.     return 1;
  14.   }
  15.   query_error = mysql_query(db_handle,"SELECT id,company FROM unit");
  16.   if (query_error != 0) {
  17.     printf(mysql_error(db_handle));
  18.     return 1;
  19.   }
  20.   query_result = mysql_store_result(db_handle);
  21.   while (( row = mysql_fetch_row(query_result)) != NULL) {
  22.     printf("Name: %s %s\n",(row[0] ? row[0] : "NULL"),
  23.            (row[1] ? row[1] : "NULL"));
  24.   }
  25.   mysql_free_result(query_result);
  26.   mysql_close(db_handle);
  27. }
复制代码


用gcc -o example example.c -I/usr/include/mysql -L/usr/lib/mysql可以编译


一个用GTK+写的helloworld:
  1. #include <gtk/gtk.h>

  2. /* 这是一个回调函数。data 参数在本示例中被忽略。
  3. * 后面有更多的回调函数示例。*/
  4. void hello( GtkWidget *widget,
  5.             gpointer   data )
  6. {
  7.     g_print ("Hello World\n");
  8. }

  9. gint delete_event( GtkWidget *widget,
  10.                    GdkEvent  *event,
  11.                    gpointer   data )
  12. {
  13.     /* 如果你的 "delete_event" 信号处理函数返回 FALSE,GTK 会发出 "destroy" 信号。
  14.      * 返回 TRUE,你不希望关闭窗口。
  15.      * 当你想弹出“你确定要退出吗?”对话框时它很有用。*/

  16.     g_print ("delete event occurred\n");

  17.     /* 改 TRUE 为 FALSE 程序会关闭。*/

  18.     return TRUE;
  19. }

  20. /* 另一个回调函数 */
  21. void destroy( GtkWidget *widget,
  22.               gpointer   data )
  23. {
  24.     gtk_main_quit ();
  25. }

  26. int main( int   argc,
  27.           char *argv[] )
  28. {
  29.     /* GtkWidget 是构件的存储类型 */
  30.     GtkWidget *window;
  31.     GtkWidget *button;
  32.    
  33.     /* 这个函数在所有的 GTK 程序都要调用。参数由命令行中解析出来并且送到该程序中*/
  34.     gtk_init (&argc, &argv);
  35.    
  36.     /* 创建一个新窗口 */
  37.     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  38.    
  39.     /* 当窗口收到 "delete_event" 信号 (这个信号由窗口管理器发出,通常是“关闭”
  40.      * 选项或是标题栏上的关闭按钮发出的),我们让它调用在前面定义的 delete_event() 函数。
  41.      * 传给回调函数的 data 参数值是 NULL,它会被回调函数忽略。*/
  42.     g_signal_connect (G_OBJECT (window), "delete_event",
  43.                       G_CALLBACK (delete_event), NULL);
  44.    
  45.     /* 在这里我们连接 "destroy" 事件到一个信号处理函数。  
  46.      * 对这个窗口调用 gtk_widget_destroy() 函数或在 "delete_event" 回调函数中返回 FALSE 值
  47.      * 都会触发这个事件。*/
  48.     g_signal_connect (G_OBJECT (window), "destroy",
  49.                       G_CALLBACK (destroy), NULL);
  50.    
  51.     /* 设置窗口边框的宽度。*/
  52.     gtk_container_set_border_width (GTK_CONTAINER (window), 10);
  53.    
  54.     /* 创建一个标签为 "Hello World" 的新按钮。*/
  55.     button = gtk_button_new_with_label ("Hello World");
  56.    
  57.     /* 当按钮收到 "clicked" 信号时会调用 hello() 函数,并将NULL传给
  58.      * 它作为参数。hello() 函数在前面定义了。*/
  59.     g_signal_connect (G_OBJECT (button), "clicked",
  60.                       G_CALLBACK (hello), NULL);
  61.    
  62.     /* 当点击按钮时,会通过调用 gtk_widget_destroy(window) 来关闭窗口。
  63.      * "destroy" 信号会从这里或从窗口管理器发出。*/
  64.     g_signal_connect_swapped (G_OBJECT (button), "clicked",
  65.                               G_CALLBACK (gtk_widget_destroy),
  66.                               window);
  67.    
  68.     /* 把按钮放入窗口 (一个 gtk 容器) 中。*/
  69.     gtk_container_add (GTK_CONTAINER (window), button);
复制代码


可以用gcc -o example example.c `gtk-config --cflags --libs`编译

但如果我要在两个程序间通信,把mysql的查询结果用gtk的图形显示出来,要如何做?让我觉得困惑的是,mysql_C_API是用在标准的C写的,而gtk虽然说数据类型的定义什么的没有什么差别,只是在语句前加一个g,比如int写成了gint,我尝试把第一个例子程序把int,char等改成gtk的gint等,用gcc -o example example.c -I/usr/include/mysql -L/usr/lib/mysql `gtk-config --cflags --libs`编译却通不过

可能我的想当然应该如此,因为没做过真正的程序开发,所以不了解,请兄弟们指导一二:thank :thank :thank
发表于 2004-5-16 08:43:13 | 显示全部楼层
将对数据库的操作单独写一个函数。对界面的操作写作主函数。分开编译,再连接起来。
发表于 2004-5-16 17:10:32 | 显示全部楼层

  1.     printf("Name: %s %s\n",(row[0] ? row[0] : "NULL"),
  2.            (row[1] ? row[1] : "NULL"));
复制代码


这里用于输出查询结果。对于字符串,是char *类型的
gtk的(实际是glib的) gchar 就是 char, 可以直接转换。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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