GTK+浅谈之十二数据库编程

一、简介

        Gtk+2.0本身不具有数据库功能,但由于它采用C语言设计可与数据库系统底层结合,如使用MySQL的C语言API开发数据库应用程序。

二、详解

1、连接MySQL并创建数据库和表

(1)代码create.c:
/***gcc -o create create.c -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient `pkg-config --cflags --libs gtk+-2.0`*****/
#include <gtk/gtk.h>
#include <mysql.h>

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;

gboolean my_connect_run()
{
    myconnect = mysql_init(myconnect);
    if (mysql_real_connect(myconnect, "localhost", NULL, NULL, NULL, MYSQL_PORT, NULL, 0)) {
        return TRUE;
    }
    else {
        myconnect = NULL;
        return FALSE;
    }
}
void my_disconnect()
{
    mysql_close(myconnect);
    myconnect = NULL;
}

void create_message_dialog(GtkMessageType type, gchar *message)
{
    GtkWidget *dialogx = gtk_message_dialog_new(NULL, (GtkDialogFlags)(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_button_connect(GtkWidget *widget, gpointer data)
{
    if (my_connect_run() == FALSE) {
        gtk_label_set_text(GTK_LABEL(mlabel), "错误:不能与数据库服务器连接。");
    }
    else {
        gtk_label_set_text(GTK_LABEL(mlabel), "信息:成功与数据库服务器连接。");
        isclosed = FALSE;
    }
}

void on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
    if (isclosed == FALSE) {
        my_disconnect();
        create_message_dialog(GTK_MESSAGE_INFO, "成功与服务器断开");
    }
    gtk_main_quit();
}

/***********************************/

void on_dialog_yes(GtkButton *button, gpointer data)
{
    gchar query_buf[4096];
    const gchar *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)
{
    if (myconnect == NULL ) {
        create_message_dialog(GTK_MESSAGE_WARNING, "请先连接数据库服务器!");
        return;
    }
    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_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER);
    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);
    button = gtk_button_new_from_stock(GTK_STOCK_NO);
    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_dialog_no), 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)
{
    char query_buf[1024];
    const char *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)
{
    if (myconnect == NULL ) {
        create_message_dialog(GTK_MESSAGE_WARNING, "请先连接数据库服务器!");
        return;
    }
    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_window_set_position(GTK_WINDOW(table_dialog), GTK_WIN_POS_CENTER);
    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创建数据表的SQL语句\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, *seq;
    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_window_set_position(GTK_WINDOW(drop_table_dialog), GTK_WIN_POS_CENTER);
    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);

    seq = gtk_hseparator_new();
    gtk_box_pack_start(GTK_BOX(vbox), seq, 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);
}
/***********************************/
void on_button_disconnect(GtkWidget *widget, gpointer data)
{
    my_disconnect();
    isclosed = TRUE;
    gtk_label_set_text(GTK_LABEL(mlabel), "注意:成功与数据库服务器断开。");
}

void on_create(GtkWidget *widget, gpointer data)
{
    create_run_dialog("创建mysql数据库");
    iscreate = TRUE;
}

void on_drop(GtkWidget *widget, gpointer data)
{
    create_run_dialog("删除mysql数据库");
    iscreate = FALSE;
}

void on_create_table(GtkWidget *widget, gpointer data)
{
    create_table_dialog("创建数据表");
}

void on_drop_table(GtkWidget *widget, gpointer data)
{
    create_drop_table_dialog("删除数据表");
}

/***********************************/
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, "连接mysql数据库服务器\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 TRUE;
}
编译:
gcc -o create create.c -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient `pkg-config --cflags --libs gtk+-2.0`
运行:
编译:

2、表中插入数据

(1)创建数据库和表
CREATE DATABASE ourdb;
USE ourdb;
CREATE TABLE student(
  id int(2) PRIMARY KEY, 
  name char(20), 
  xclass char(20),
  chinese double(5, 2),
  math double(5, 2),
  english double(5, 2),
  zhonghe double(5,2)
);
(2)代码insert.c:
/***gcc -o insert insert.c -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient `pkg-config --cflags --libs gtk+-2.0`*****/
#include <gtk/gtk.h>
#include <mysql.h>

MYSQL *myconnect = NULL;
gboolean isclosed = TRUE;
MYSQL_RES *res;
MYSQL_FIELD *fd;
MYSQL_ROW row;
static GtkWidget *mlabel = NULL;
static GtkWidget *c_spin = NULL;
static GtkWidget *m_spin = NULL;
static GtkWidget *e_spin = NULL;
static GtkWidget *a_spin = NULL;
static GtkWidget *name_entry = NULL;
static GtkWidget *combo = NULL;
static GtkWidget *id_spin = NULL;
void on_insert(GtkButton *button, gpointer data)
{
    gchar query_buf[4096];
    gdouble chinese, math, english, all;
    const gchar *name;
    const gchar *xclass;
    gint id;

    chinese = gtk_spin_button_get_value(GTK_SPIN_BUTTON(c_spin));
    math = gtk_spin_button_get_value(GTK_SPIN_BUTTON(m_spin));
    english = gtk_spin_button_get_value(GTK_SPIN_BUTTON(e_spin));
    all = gtk_spin_button_get_value(GTK_SPIN_BUTTON(a_spin));
    name = gtk_entry_get_text(GTK_ENTRY(name_entry));
    xclass = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(combo)->entry));
    id = (gint)gtk_spin_button_get_value(GTK_SPIN_BUTTON(id_spin));
    sprintf(query_buf, "INSERT INTO student VALUES('%d', '%s', '%s', %.2f, %.2f, %.2f, %.2f)",
            id, name, xclass, chinese, math, english, all);
    if (mysql_query(myconnect, query_buf) == 0) {
        gtk_label_set_text(GTK_LABEL(mlabel), "信息:数据插入成功!");
    }
    else {
        gtk_label_set_text(GTK_LABEL(mlabel), "信息:数据插入失败!");
    }
}

GtkWidget *create_combo(void)
{
    GtkWidget *combo;
    GList *items = NULL;
    items = g_list_append(items, (gpointer)("一年级一班"));
    items = g_list_append(items, (gpointer)("一年级二班"));
    items = g_list_append(items, (gpointer)("二年级一班"));
    items = g_list_append(items, (gpointer)("二年级二班"));
    items = g_list_append(items, (gpointer)("一年级一班"));
    items = g_list_append(items, (gpointer)("三年级二班"));
    combo = gtk_combo_new();
    gtk_combo_set_popdown_strings(GTK_COMBO(combo), items);
    return combo;
}
gboolean my_connect_run()
{
    gchar *query_buf = "USE ourdb";
    myconnect = mysql_init(myconnect);
    if (mysql_real_connect(myconnect, "localhost", NULL, NULL, NULL, MYSQL_PORT, NULL, 0)) {
        if (mysql_query(myconnect, query_buf) == 0) {
            return TRUE;
        }
        else {
            return FALSE;
        }
    }
    else {
        myconnect = NULL;
        return FALSE;
    }
}
void my_disconnect()
{
    mysql_close(myconnect);
    myconnect = NULL;
}
void on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
    if (isclosed == FALSE) {
        my_disconnect();
    }
    gtk_main_quit();
}
int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *hbox, *vbox, *viewport;
    GtkWidget *button, *label;
    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_default_size(GTK_WINDOW(window), 500, 100);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);

    vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), 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);
    c_spin = gtk_spin_button_new_with_range(0, 100, 0.5);
    gtk_box_pack_start(GTK_BOX(hbox), c_spin, FALSE, FALSE, 5);
    label = gtk_label_new("数学:");
    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
    m_spin = gtk_spin_button_new_with_range(0, 100, 0.5);
    gtk_box_pack_start(GTK_BOX(hbox), m_spin, FALSE, FALSE, 5);
    label = gtk_label_new("英语:");
    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
    e_spin = gtk_spin_button_new_with_range(0, 100, 0.5);
    gtk_box_pack_start(GTK_BOX(hbox), e_spin, FALSE, FALSE, 5);
    label = gtk_label_new("综合:");
    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
    a_spin = gtk_spin_button_new_with_range(0, 100, 0.5);
    gtk_box_pack_start(GTK_BOX(hbox), a_spin, 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);
    id_spin = gtk_spin_button_new_with_range(1, 999, 1);
    gtk_box_pack_start(GTK_BOX(hbox), id_spin, FALSE, FALSE, 5);
    label = gtk_label_new("班级:");
    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
    combo = create_combo();
    gtk_box_pack_start(GTK_BOX(hbox), combo, FALSE, FALSE, 5);
    label = gtk_label_new("姓名:");
    gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
    name_entry = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(hbox), name_entry, FALSE, FALSE, 5);
    button = gtk_button_new_with_label("插入");
    gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);
    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_insert), NULL);

    viewport = gtk_viewport_new(NULL, NULL);
    gtk_box_pack_start(GTK_BOX(vbox), viewport, FALSE, FALSE, 5);
    mlabel = gtk_label_new(NULL);
    gtk_container_add(GTK_CONTAINER(viewport), mlabel);
    if (my_connect_run() == FALSE) {
        gtk_label_set_text(GTK_LABEL(mlabel), "错误:不能与数据库服务器连接。");
    }
    else {
        gtk_label_set_text(GTK_LABEL(mlabel), "信息:成功与数据库服务器连接。");
        isclosed = FALSE;
    }

    gtk_widget_show_all(window);
    gtk_main();
    return TRUE;
}
编译运行:
gcc -o create create.c -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient `pkg-config --cflags --libs gtk+-2.0`


3、从表中读取数据

从上述的ourdb数据库中将student表中的数据读取出来并显示在窗口中。
 (1)代码select.c:
/***gcc -o select select.c -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient `pkg-config --cflags --libs gtk+-2.0`*****/
#include <gtk/gtk.h>
#include <mysql.h>
MYSQL *myconnect = NULL;
gboolean isclosed = TRUE;
MYSQL_RES *res;
MYSQL_FIELD *fd;
MYSQL_ROW row;
static GtkWidget *mlabel;
static GtkWidget *text;
GtkTextBuffer *buffer;
static GtkWidget *entry;
GtkTextIter iter;

void on_select(GtkButton *button, gpointer data)
{
    gchar query_buf[1024];
    gchar info_buf[256];
    const gchar *table;
    gint rows, i, j;
    table = gtk_entry_get_text(GTK_ENTRY(entry));
    sprintf(query_buf, "SELECT * FROM %s", table);
    if (mysql_query(myconnect, query_buf) == 0) {
        gtk_label_set_text(GTK_LABEL(mlabel), "信息:成功选择数据。");
        res = mysql_store_result(myconnect);
        j = mysql_num_fields(res);
        for(i = 0; i < j; i++) {
            fd = mysql_fetch_field(res);
            gtk_text_buffer_get_end_iter(buffer, &iter);
            gtk_text_buffer_insert(buffer, &iter, fd->name, -1);
            gtk_text_buffer_get_end_iter(buffer, &iter);
            gtk_text_buffer_insert(buffer, &iter, "\t", -1);
        }
        gtk_text_buffer_get_end_iter(buffer, &iter);
        gtk_text_buffer_insert(buffer, &iter, "\n", -1);
        while(row = mysql_fetch_row(res)) {
            for(i = 0; i < j; i++) {
                gtk_text_buffer_get_end_iter(buffer, &iter);
                gtk_text_buffer_insert(buffer, &iter, row[i], -1);
                gtk_text_buffer_get_end_iter(buffer, &iter);
                gtk_text_buffer_insert(buffer, &iter, "\t", -1);
            }
            gtk_text_buffer_get_end_iter(buffer, &iter);
            gtk_text_buffer_insert(buffer, &iter, "\n", -1);
        }
        rows = (gint)mysql_num_rows(res);
        sprintf(info_buf, "共有%d条数据被选择!\n", rows);
        gtk_text_buffer_get_end_iter(buffer, &iter);
        gtk_text_buffer_insert(buffer, &iter, info_buf, -1);
        mysql_free_result(res);
    }
    else {
        gtk_label_set_text(GTK_LABEL(mlabel), "信息:执行SQL语句时出错。");
    }
}

gboolean my_connect_run()
{
    gchar *query_buf = "USE ourdb";
    myconnect = mysql_init(myconnect);
    if (mysql_real_connect(myconnect, "localhost", NULL, NULL, NULL, MYSQL_PORT, NULL, 0)) {
        if (mysql_query(myconnect, query_buf) == 0) {
            return TRUE;
        }
        else {
            return FALSE;
        }
    }
    else {
        myconnect = NULL;
        return FALSE;
    }
}

void my_disconnect()
{
    mysql_close(myconnect);
}

void on_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data)
{
    if (isclosed == FALSE) {
        my_disconnect();
    }
    gtk_main_quit();
}

int main(int argc, char *argv[])
{
    GtkWidget *window;
    GtkWidget *vbox, *hbox, *viewport;
    GtkWidget *button, *label;
    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_default_size(GTK_WINDOW(window), 500, 100);
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
    gtk_container_set_border_width(GTK_CONTAINER(window), 10);

    vbox = gtk_vbox_new(FALSE, 0);
    gtk_container_add(GTK_CONTAINER(window), 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);
    entry = gtk_entry_new();
    gtk_box_pack_start(GTK_BOX(hbox), entry, FALSE, FALSE, 5);
    button = gtk_button_new_with_label("选择数据");
    gtk_box_pack_start(GTK_BOX(hbox), button, FALSE, FALSE, 5);
    g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(on_select), NULL);

    text = gtk_text_view_new();
    gtk_box_pack_start(GTK_BOX(vbox), text, TRUE, TRUE, 5);
    buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text));
    viewport = gtk_viewport_new(NULL, NULL);
    gtk_box_pack_start(GTK_BOX(vbox), viewport, FALSE, FALSE, 5);
    mlabel = gtk_label_new(NULL);
    gtk_container_add(GTK_CONTAINER(viewport), mlabel);
    if(my_connect_run() == FALSE){
      gtk_label_set_text(GTK_LABEL(mlabel), "错误:不能与数据库服务器连接。");
    }
    else {
      gtk_label_set_text(GTK_LABEL(mlabel), "信息:成功与数据库服务器链接。");
      isclosed = FALSE;
    }
    gtk_widget_show_all(window);
    gtk_main();
    return TRUE;
}
编译运行:
gcc -o select select.c -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient `pkg-config --cflags --libs gtk+-2.0`

三、总结

(1)Linux系统应安装MySQL数据库及其开发包,并运行mysql服务,在root用户下可通过service mysqld status查看运行状态。MySQL中C语言的API和SQL语句规范可参考相应文档,开发头文件在/usr/include/mysql,链接库在/usr/lib64/mysql目录下的libmysqlclient.so。
(2)从表中读取数据,涉及到表的字段数、字段类型、数据集的保存和释放符等内容,比较繁琐。
(3)若有建议,请留言,在此先感谢!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值