|
GTK+ 操作 Mysql 数据库示例程序 版本 1.0
- /*
- 作者:wide288 时间:2005-2-23 元宵节
- wide288@0[tempc2]$ cat makefile
- CC = gcc
- LIB = -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient
- all:
- $(CC) -o create create.c $(LIB) `pkg-config gtk+-2.0 --cflags --libs`
- wide288@0[tempc2]$
- */
复制代码
- #include <gtk/gtk.h>
- #include <mysql.h>
- #define DEF_HOST_NAME "localhost"
- #define DEF_USER_NAME "wide288"
- #define DEF_PASSWORD "123"
- #define DEF_DATABASE "lcrj"
- MYSQL *myconnect = NULL;
- gboolean isclosed = TRUE;
- gboolean iscreate = TRUE;
- static GtkWidget *dialog = NULL;
- static GtkWidget *entry = NULL;
- static GtkWidget *table_dialog = NULL;
- static GtkWidget *db_entry = NULL;
- static GtkWidget *text = NULL;
- static GtkTextBuffer *text_buffer;
- gboolean isok = FALSE;
- static GtkWidget *drop_table_dialog = NULL;
- static GtkWidget *drop_db_entry = NULL;
- static GtkWidget *drop_table_entry = NULL;
- static GtkTextBuffer *message_buffer;
- static GtkWidget *mlabel;
- void create_message_dialog(GtkMessageType type, gchar* message)
- {
- GtkWidget* dialogx;
- dialogx = gtk_message_dialog_new(NULL,
- GTK_DIALOG_MODAL|GTK_DIALOG_DESTROY_WITH_PARENT,
- type, GTK_BUTTONS_OK, message);
- gtk_dialog_run(GTK_DIALOG(dialogx));
- gtk_widget_destroy(dialogx);
- }
- void on_dialog_yes(GtkButton *button, gpointer data)
- {
- gchar query_buf[4096];
- const gchar* dbname;
- dbname = gtk_entry_get_text(GTK_ENTRY(entry));
- if(iscreate == TRUE)
- {
- sprintf(query_buf, "CREATE DATABASE %s", dbname);
- if(mysql_query(myconnect, query_buf) == 0)
- {
- create_message_dialog(GTK_MESSAGE_INFO, "成功创建数据库!");
- }else{
- create_message_dialog(GTK_MESSAGE_ERROR, "创建数据库时出错!");
- }
- }else{
- sprintf(query_buf, "DROP DATABASE %s", dbname);
- if(mysql_query(myconnect, query_buf) == 0)
- {
- create_message_dialog(GTK_MESSAGE_WARNING, "数据库已经被删除!");
- }else{
- create_message_dialog(GTK_MESSAGE_ERROR, "删除数据库时出错!");
- }
- }
- gtk_widget_destroy(dialog);
- }
- void on_dialog_no(GtkButton *button, gpointer data)
- {
- gtk_widget_destroy(dialog);
- }
- void create_run_dialog(gchar *title)
- {
- GtkWidget *label, *vbox, *button, *sep, *hbox;
- dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(dialog), title);
- g_signal_connect(G_OBJECT(dialog), "delete_event",
- G_CALLBACK(gtk_widget_destroy),dialog);
- gtk_container_set_border_width(GTK_CONTAINER(dialog),10);
- vbox = gtk_vbox_new(FALSE,0);
- gtk_container_add(GTK_CONTAINER(dialog),vbox);
- label = gtk_label_new("输入数据库名:");
- gtk_box_pack_start(GTK_BOX(vbox),label, FALSE, FALSE, 5);
- entry = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(vbox),entry, FALSE, FALSE, 5);
- sep = gtk_hseparator_new();
- gtk_box_pack_start(GTK_BOX(vbox),sep, FALSE, FALSE, 5);
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox),hbox, FALSE, FALSE, 5);
- button = gtk_button_new_from_stock(GTK_STOCK_YES);
- g_signal_connect(G_OBJECT(button), "clicked",
- G_CALLBACK(on_dialog_yes), NULL);
- gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);
- gtk_widget_show_all(dialog);
- }
- void on_db_use(GtkButton *button, gpointer data)
- {
- const char* query;
- char query_buf[1024];
- query = gtk_entry_get_text(GTK_ENTRY(db_entry));
- sprintf(query_buf, "USE %s", query);
- if(mysql_query(myconnect, query_buf) == 0)
- {
- create_message_dialog(GTK_MESSAGE_INFO, "数据库选用成功!");
- gtk_widget_set_sensitive(db_entry, FALSE);
- }else{
- create_message_dialog(GTK_MESSAGE_ERROR, "选用数据库时出错!");
- }
- }
- void on_create_table_yes(GtkButton* button, gpointer data)
- {
- gchar* sql_query;
- GtkTextIter iter1, iter2;
- gtk_text_buffer_get_start_iter(text_buffer, &iter1);
- gtk_text_buffer_get_end_iter(text_buffer, &iter2);
- sql_query = gtk_text_buffer_get_text(text_buffer, &iter1, &iter2, FALSE);
- if(mysql_query(myconnect, sql_query) == 0)
- {
- create_message_dialog(GTK_MESSAGE_INFO, "成功创建数据表!");
- }else{
- create_message_dialog(GTK_MESSAGE_ERROR, "运行SQL语句时出错!");
- }
- }
- void create_table_dialog(gchar* title)
- {
- GtkWidget *vbox, *hbox, *label, *button, *viewport;
- table_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(table_dialog), title);
- g_signal_connect(G_OBJECT(table_dialog), "delete_event",
- G_CALLBACK(gtk_widget_destroy), table_dialog);
- gtk_container_set_border_width(GTK_CONTAINER(table_dialog), 10);
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(table_dialog), vbox);
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
- label = gtk_label_new("数据库名称:");
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
- db_entry = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(hbox), db_entry, FALSE, FALSE, 5);
- button = gtk_button_new_with_label("选用");
- g_signal_connect(G_OBJECT(button), "clicked",
- G_CALLBACK(on_db_use), NULL);
- gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);
-
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
- viewport = gtk_viewport_new(NULL, NULL);
- gtk_box_pack_start(GTK_BOX(hbox), viewport, TRUE, TRUE, 5);
- text = gtk_text_view_new();
- gtk_container_add(GTK_CONTAINER(viewport), text);
- text_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 5);
- label = gtk_label_new("请在左侧的\n文本输入区\n域内输入创\n建数据表的\nSQL语句,\n单击下面的\n按钮即可执\n行创建数据\n操作");
- gtk_box_pack_start(GTK_BOX(vbox),label, FALSE, FALSE, 5);
- button = gtk_button_new_with_label("创建数据表");
- g_signal_connect(G_OBJECT(button), "clicked",
- G_CALLBACK(on_create_table_yes), NULL);
- gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
- gtk_widget_show_all(table_dialog);
- }
- void on_drop_table_yes(GtkButton* button, gpointer data)
- {
- gchar query_buf[4096];
- const gchar *dbname, *tablename;
- dbname = gtk_entry_get_text(GTK_ENTRY(drop_db_entry));
- tablename = gtk_entry_get_text(GTK_ENTRY(drop_table_entry));
- sprintf(query_buf, "USE %s", dbname);
- if(mysql_query(myconnect, query_buf) == 0)
- {
- sprintf(query_buf, "DROP TABLE %s", tablename);
- if(mysql_query(myconnect, query_buf) == 0)
- {
- create_message_dialog(GTK_MESSAGE_WARNING,
- "数据库已经打开,数据表成功删除!");
- }else{
- create_message_dialog(GTK_MESSAGE_ERROR,
- "数据库已经打开,但数据表并未删除!");
- }
- }else{
- create_message_dialog(GTK_MESSAGE_ERROR,"打开数据库时出错!");
- }
- gtk_widget_destroy(drop_table_dialog);
- }
- void on_drop_table_no(GtkButton* button, gpointer data)
- {
- gtk_widget_destroy(drop_table_dialog);
- }
- void create_drop_table_dialog(gchar* title)
- {
- GtkWidget *vbox, *hbox, *label, *button, *sep;
- drop_table_dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- gtk_window_set_title(GTK_WINDOW(drop_table_dialog), title);
- g_signal_connect(G_OBJECT(drop_table_dialog),"delete_event",
- G_CALLBACK(gtk_widget_destroy), drop_table_dialog);
- gtk_container_set_border_width(GTK_CONTAINER(drop_table_dialog),10);
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(drop_table_dialog), vbox);
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
- label = gtk_label_new("打开的数据库:");
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
- drop_db_entry = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(hbox), drop_db_entry, FALSE, FALSE, 5);
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
- label = gtk_label_new("要删除的数据表:");
- gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
- drop_table_entry = gtk_entry_new();
- gtk_box_pack_start(GTK_BOX(hbox), drop_table_entry, FALSE, FALSE, 5);
- sep = gtk_hseparator_new();
- gtk_box_pack_start(GTK_BOX(vbox), sep, FALSE, FALSE, 5);
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 5);
- button = gtk_button_new_from_stock(GTK_STOCK_YES);
- g_signal_connect(G_OBJECT(button), "clicked",
- G_CALLBACK(on_drop_table_yes), NULL);
- gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);
- button = gtk_button_new_from_stock(GTK_STOCK_NO);
- g_signal_connect(G_OBJECT(button), "clicked",
- G_CALLBACK(on_drop_table_no), NULL);
- gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);
- gtk_widget_show_all(drop_table_dialog);
- }
- gboolean my_connect1()
- {
- myconnect = mysql_init(myconnect);
- if(mysql_real_connect(myconnect, DEF_HOST_NAME,
- DEF_USER_NAME, DEF_PASSWORD, DEF_DATABASE, MYSQL_PORT, NULL, 0))
- {
- return TRUE;
- }else{
- myconnect = NULL;
- return FALSE;
- }
- }
- void my_disconnect()
- {
- mysql_close(myconnect);
- myconnect = NULL;
- }
- void on_button_connect(GtkButton *button, gpointer data)
- {
- if(my_connect1() == FALSE)
- {
- gtk_label_set_text(GTK_LABEL(mlabel), "错误:不能与数据库服务器连接。");
- }else{
- gtk_label_set_text(GTK_LABEL(mlabel), "信息:成功与数据库服务器连接。");
- isclosed = FALSE;
- }
- }
- void on_button_disconnect(GtkButton *button, gpointer data)
- {
- my_disconnect();
- isclosed = TRUE;
- gtk_label_set_text(GTK_LABEL(mlabel), "注意:成功与数据库服务器断开。");
- }
- void on_create(GtkButton *button, gpointer data)
- {
- create_run_dialog("创建mysql数据库");
- iscreate = TRUE;
- }
- void on_drop(GtkButton *button, gpointer data)
- {
- create_run_dialog("删除mysql数据库");
- iscreate = FALSE;
- }
- void on_create_table(GtkButton *button, gpointer data)
- {
- create_table_dialog("创建数据表");
- }
- void on_drop_table(GtkButton *button, gpointer data)
- {
- create_drop_table_dialog("删除数据表");
- }
- void on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
- {
- if(isclosed == FALSE)
- {
- my_disconnect();
- create_message_dialog(GTK_MESSAGE_INFO, "成功与服务器断开!");
- }
- gtk_main_quit();
- }
- int main(int argc, char* argv[])
- {
- GtkWidget *window;
- GtkWidget *vbox1, *hbox, *vbox, *viewport;
- GtkWidget *button, *message;
- GtkTextIter iter;
- gtk_init(&argc, &argv);
- window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
- g_signal_connect(G_OBJECT(window), "delete_event",
- G_CALLBACK(on_delete_event), NULL);
- gtk_window_set_title(GTK_WINDOW(window), "创建/删除数据库和数据表");
- gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
- gtk_container_set_border_width(GTK_CONTAINER(window), 10);
- vbox1 = gtk_vbox_new(FALSE, 0);
- gtk_container_add(GTK_CONTAINER(window), vbox1);
- hbox = gtk_hbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(vbox1), hbox, FALSE, FALSE, 5);
- message = gtk_text_view_new();
- gtk_box_pack_start(GTK_BOX(hbox), message, TRUE, TRUE, 5);
- message_buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(message));
- gtk_text_buffer_get_end_iter(message_buffer, &iter);
- gtk_text_buffer_insert(message_buffer, &iter, "此处用来显示一些与软件\n使用有关的数据信息。\n可以到程序中找到这段代码,\n并应用到自己的回调函数中。\n与MySQL数据库服务器连接\n需要用到服务器、用户名\n和密码等参数,这些参数的\n设置可以到MySQL的帮助\n文档中找到,MySQL的C语\n言API的详细说明也可以在\n此文档中找到。", -1);
- vbox = gtk_vbox_new(FALSE, 0);
- gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 5);
- button = gtk_button_new_with_label("连接服务器");
- g_signal_connect(G_OBJECT(button), "clicked",
- G_CALLBACK(on_button_connect), NULL);
- gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
- button = gtk_button_new_with_label("断开");
- g_signal_connect(G_OBJECT(button), "clicked",
- G_CALLBACK(on_button_disconnect), NULL);
- gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
- button = gtk_button_new_with_label("创建数据库");
- g_signal_connect(G_OBJECT(button), "clicked",
- G_CALLBACK(on_create), NULL);
- gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
- button = gtk_button_new_with_label("删除数据库");
- g_signal_connect(G_OBJECT(button), "clicked",
- G_CALLBACK(on_drop), NULL);
- gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
- button = gtk_button_new_with_label("创建数据表");
- g_signal_connect(G_OBJECT(button),"clicked",
- G_CALLBACK(on_create_table), NULL);
- gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
- button = gtk_button_new_with_label("删除数据表");
- g_signal_connect(G_OBJECT(button), "clicked",
- G_CALLBACK(on_drop_table), NULL);
- gtk_box_pack_start(GTK_BOX(vbox), button, FALSE, FALSE, 5);
- viewport = gtk_viewport_new(NULL, NULL);
- gtk_box_pack_start(GTK_BOX(vbox1), viewport, FALSE, FALSE, 5);
- mlabel = gtk_label_new("此处也可以显示提示信息");
- gtk_container_add(GTK_CONTAINER(viewport), mlabel);
- gtk_widget_show_all(window);
- gtk_main();
- return FALSE;
- }
- /*
- 此示例本是为写一个理财软件所写,且多抄于书中。 只是花些时间调试。和看 Mysql Api 的手册什么的。 如果有朋友想一起写什么理财软件或用到了 mysql 和 gtk+ 就写邮件给我吧。如果有空大家一起写它。 wide288 at 163 dot com
- */
复制代码
网址:http://blog.csdn.net/wide288/archive/2005/02/23/299094.aspx |
|