C语言+GTK编写的访问数据库

3 篇文章 1 订阅
3 篇文章 0 订阅
#include<gtk/gtk.h>
#include<mysql.h>
MYSQL *sqlconnect=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;

        /*gtk_message_dialog_new创建一个新的消息对话框,这是一个图标表示对话框类型(错误,警告等)和一些文 本,用户可能希望看到一个简单的对话框。当用户点击一个按钮一个“响应”信号被发射与GtkResponseType响应的ID*/
    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);

        /*mysql_query() 向与指定的连接标识符关联的服务器中的当前活动数据库发送一条查询,如果没有指定 link_identifier,则使用上一个打开的连接。如果没有打开的连接,本函数会尝试无参数调用 mysql_connect() 函数来建立一个连接并使用之。查询结果会被缓存。*/
        if(mysql_query(sqlconnect,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(sqlconnect,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);
    gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,5);
    g_signal_connect(G_OBJECT(button),"clicked",G_CALLBACK(on_dialog_yes),NULL);
    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)
{
    const char *query;
    char query_buf[1024];
    query = gtk_entry_text(GTK_ENTRY(db_entry));
    sprintf(query_buf,"USE %s",query);
    if(mysql_query(sqlconnect,query_buf) == 0)
    {
        create_message_dialog(GTK_MESSAGE_INFO,"数据库选用成功!");
        /*gtk_widget_set_sensitive设置构件的灵敏度。小部件是敏感的,如果用户可以与它进行交互。不敏感的部件都“变灰”,用户无法与它们进行交互。不敏感的部件被称为在其他一些工具包“无效”,“禁用”或“幻像”。*/
        gtk_widget_set_sensitive(db_entry,FALSE);
    }
    else
    {
        create_messge_dialog(GTK_MESSAGE_ERROR,"选用数据库出错!");
    }    
}

void on_create_table_yes(GtkButton *button,gpointer data)
{
    gchar *sql_query;
    GtkTextIter iter1,iter2;     /* 文本缓冲迭代器,GtkTextIter是被设计为在堆栈中分配内存的。它确保拷贝有效并且绝对不会包含任何堆分配数据。*/
    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);
//gtk_text_buffer_get_text()返回值的范围[起点,终点)的文本
    if(mysql_query(sqlconnect,sql_query)==0)  /*mysql_query()函数对指定的连接执行查询*/
    {
        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_windw_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(vbox),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_viewport_new*/
    gtk_box_pack_start(GTK_BOX(hbox),viewport,TRUE,TRUE,5);
    text = gtk_text_view_new();               /*gtk_text_view_new*/
    //gtk_widget_set_usize(text,100,100);
    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数据表的语句,\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(sqlconnect,query_buf) == 0)
    {
        sprintf(query_buf,"DROP TABLE %s",tablename);
        if(mysql_query(sqlconnect,query_buf)==0)
        {
            creat_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_connect()   // 链接
{
    sqlconnect = mysql_init(sqlconnect);
    if(mysql_real_connect(sqlconnect,"localhost","root","dashu",NULL,3306,NULL,0))
    {
        return TRUE;
    }
    else
    {
        sqlconnect = NULL;
        return FALSE;
    }
}


void my_disconnect()                 //断开
{

    mysql_close(sqlconnect);
    sqlconnect = NULL;
}

//----------------------------------------------------------------------


void on_button_connect(GtkButton *button,gpointer data)
{
    if (my_connect() == 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,FALSE,FALSE,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的帮助文档中查找,\nmysql的C语言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(GTK_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;
}



错误如下:

//freeboy@ubuntu:~/Documents/c/mysql$ gcc create.c -o create -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient `pkg-config --libs --cflags gtk+-2.0`
create.c: 在函数‘create_message_dialog’中:
create.c:26:2: 警告: 格式字符串不是一个字面字符串而且没有待格式化的实参 [-Wformat-security]
create.c: 在函数‘on_db_use’中:
create.c:99:8: 警告: 赋值时将整数赋给指针,未作类型转换 [默认启用]
create.c: 在函数‘my_connect’中:
create.c:236:1: 错误: 实参数目与原型不符
/usr/include/mysql/mysql_com.h:470:5: 错误: 原型声明
create.c: 在函数‘on_button_connect’中:
create.c:262:2: 错误: 提供给函数‘my_connect’的实参太少
create.c:235:10: 附注: 在此声明


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值