您的位置:首页 > 数据库 > MySQL

GTK+ 操作 Mysql 数据库示例程序 版本 1.0

2005-02-23 18:18 537 查看
/*

作者: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

#include

#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

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐