用c语言动态操作sqilite3数据库v2.0

/* 项目名称:用c语言动态操作sqilite3数据库
 *
 * 项目成员:张双喜
 *
 * 编译环境:gcc
 *
 * 项目功能:
 *     1、动态创建表
 *     2、动态实现对表的基本操作(增、删、改、查)
 *     3、清空表数据、删除表(附加功能)
 *
 * 项目总结:
 *     1、涉及的技术:
 *        
 *         1、int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**);
 *          欲实现动态操作数据库,必须动态构造sql语句,构造sql语句可以用strcat函数,逐步拼接,直至完整构造出sql语句。
 *        
 *         2、欲实现简单菜单选项效果,须分离出实现每个子功能的函数,在switch中,选择的调用
 *        
 *         3、
 *
 *     2、意外收获:
 *        
 *         1、想输入一条带有空格的字符串,不能用scanf函数,应为scanf函数遇到空格、换行、回车自动结束输入,所以scanf不能达到预期效果
 *          ,解决该问题可以使用gets函数,但是gets是个危险函数,c语言不提倡使用,在使用gets函数前,一定要清空缓冲区,否则。会出现
 *          意想不到的输入结果,这就是先前没有清空缓冲区造成的。
 *        
 *         2、linux c 清空缓冲区的问题:
 *             个人见解:
 *                 经测试,linux c 使用fflush(stdin)无法清空缓冲区,使用fflush(stdin)后,再使用gets函数,gets还是会从缓冲区中读取东西,
 *                 因为缓冲区经fflush(stdin)没有被清空;
 *                 经过在网上找资料,得知setbuf(stdin, NULL);这样一个函数,经测试,清理缓冲区成功。
 *
 *             简言之:linux c 清空缓冲区的函数:setbuf(stdin, NULL);
 *
 *     3、编程中问题及其解决方法:
 *
 *         1、更新数据库update正确使用方法:
 *             update table_name set name = 'new_name', sex = 'new_sex' where id = id_val;        //是正确的
 *             上句中的,不能换成and,
 *             即:
 *             update table_name set name = 'new_name' and sex = 'new_sex' where id = id_val;        //是错误的
 *       
 *        2、字符串的问题:
 *            char * p = "hello world!";    //该字符串是只读的不能修改字符串,不能改写,不能strcat(p, "jack");
 *
 *            char str[] = "hello world!"    //这样可以通过指针或不通过指针对字符串进行任意操作
 *            char *p;
 *            p = str;
 *
 *        3、字符串清理零:
 *            char str[10];
 *
 *            memset(str, 0,sizeof(str));
 *
 *
 *
 *
 *     张双喜
 *     v1.0
 *     2010.9.29    14:39
 *
 * update 1
 *    
 *     1、增加了一个测试表test_table,解决了,每次对操作数据库必须首先建立一个表的bug
 *     2、增加了确认退出功能
 *
 *     张双喜
 *     v2.0
 *     2010.9.30    9:40
 *        
 * */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "sqlite3.h"

/*该结构体是方便对表内数据操作*/

typedef struct table_column
{
    char column_name[100];        //列名
    char column_type[200];        //列的数据类型
}COLUMN;

void db_create(sqlite3 * db, char * pTable_name, int column_num, COLUMN column[], int * create_flag);
int rscallback(void * p, int column, char ** column_val,char ** column_name);
void db_show(sqlite3 * db, char * pTable_name);
void db_insert(sqlite3 * db, char * pTable_name, int column_num, COLUMN column[], int * test_flag, int * create_flag);
void db_update(sqlite3 * db, char * pTable_name, int column_Num, COLUMN column[], int * test_flag, int * create_flag);
void db_delete(sqlite3 * db, char * pTable_name);
void db_empty(sqlite3 * db, char * pTable_name);
void db_drop(sqlite3 * db, char *pTable_name, int * test_flag, int * create_flag);
void db_test(sqlite3 * db, char * pTable_name, int ** test_flag);
void db_flag(sqlite3 * db, int * create_flag, int * test_flag, char * pTable_name);
void db_reset_table_name(sqlite3 * db, char * pTable_name);

int main(int argc, char* argv[])
{
    sqlite3 * db;
    int empty = 1;
    int ret = 0;
    int create_flag = 1;
    int test_flag = 1;
    int test_flag_create = 1;
    char c = 'n';
    char * errmsg = NULL;
    int choice = -1;
    char table_name[20];
    char * pTable_name;
    int column_num;
    int i;
    COLUMN column[10];
    pTable_name = table_name;
    strcpy(pTable_name, "test_table");

    ret = sqlite3_open("student.db", &db);
    if(ret != SQLITE_OK)
    {
        perror("slqite3_open");
        exit(1);
    }

    while(choice != 0)
    {
        printf("please input your choise:/n");
        printf("------------------------------------------------------------------/n");
        printf("|0.exit|1.create|2.show|3.insert|4.update|5.delete|6.empty|7.drop|/n");
        printf("------------------------------------------------------------------/n");
        scanf("%d", &choice);
       
        switch(choice)
        {
            case 0:
                    printf("you choise leave, y or n?/n");
                    setbuf(stdin, NULL);
                    scanf("%c", &c);
                    setbuf(stdin, NULL);
                    if(c == 'y')
                    {
                        if(test_flag == 0)
                        {
                            db_drop(db, "test_table", &test_flag, &create_flag);
                        }
                       
                        printf("goodbye!/n");

                        sqlite3_close(db);

                        return 0;
                    }
                    else
                    {
                        choice = -1;
                    }

                    break;
                   
            case 1:
                    printf("we will create a table for you, please input the name of your table:/n");
                    scanf("%s",pTable_name);
                    printf("please input the number of column:/n");
                    scanf("%d", &column_num);
                    printf("please input column_name column_type:/n");

                    for(i = 0; i < column_num; i++)
                    {
                        scanf("%s %s", column[i].column_name, column[i].column_type);                       
                    }

                    db_create(db, table_name, column_num, column, &create_flag);
                    break;
            case 2:
                    db_flag(db, &create_flag, &test_flag, table_name);
                    db_show(db, table_name);
                    break;
                  
            case 3:
                    db_flag(db, &create_flag, &test_flag, table_name);
                    db_insert(db, table_name, column_num, column, &test_flag, &create_flag);
                    break;
            case 4:
                    db_flag(db, &create_flag, &test_flag, table_name);
                    db_update(db, table_name, column_num, column, &test_flag, &create_flag);
                    break;
            case 5:
                    db_flag(db, &create_flag, &test_flag, table_name);
                    db_delete(db, table_name);
                    break;
            case 6:
                    db_flag(db, &create_flag, &test_flag, table_name);
                    db_empty(db, table_name);
                    break;
            case 7:
                    db_flag(db, &create_flag, &test_flag, table_name);
                    db_drop(db, table_name, &test_flag, &create_flag);
                    break;
            default:
                    printf("your choice is not exist!/n");
                    break;
   
        }
       
    }

    sqlite3_close(db);

    return 0;
}

void db_flag(sqlite3 * db, int * create_flag, int * test_flag, char * pTable_name)
{
    if(create_flag)
    {
        if(*test_flag)
        {
            db_test(db, pTable_name, &test_flag);
        }
       
    }

    return;
}

void db_test(sqlite3 * db, char * pTable_name, int ** test_flag)
{
    int ret;
    char * errmsg;

    **test_flag = 0;

    printf("because you have not create a table,so we create a test_table table for you!/n");
    ret = sqlite3_exec(db, "create table test_table (id integer primary key autoincrement, name text, sex text, age integer);", NULL, NULL, &errmsg);
    if(ret != SQLITE_OK)
    {
        printf("error:%d:%s/n", ret, errmsg);
        exit(1);
    }
    ret = sqlite3_exec(db, "insert into test_table (name, sex, age) values ('zsx', 'm', 23);",NULL ,NULL, &errmsg);
    if(ret != SQLITE_OK)
    {
        printf("error:%d:%s/n", ret, errmsg);
        exit(1);
    }

    return;
}

void db_create(sqlite3 * db, char * pTable_name, int column_num, COLUMN column[], int * create_flag)
{
    int ret, i;
    char * errmsg = NULL;
    char sql[200];
    char * pSql;

    *create_flag = 0;
   
    pSql = sql;

    strcpy(pSql, "create table ");
   
    strcat(pSql, pTable_name);
   
    strcat(pSql, "(");

    strcat(pSql, column[0].column_name);
    strcat(pSql, " ");
    strcat(pSql, column[0].column_type);
    strcat(pSql, " primary key autoincrement");
    strcat(pSql, ", ");

    for(i = 1; i < column_num-1; i++)
    {
        strcat(pSql, column[i].column_name);
        strcat(pSql, " ");
        strcat(pSql, column[i].column_type);
        strcat(pSql, ", ");
    }

    strcat(pSql, column[column_num-1].column_name);
    strcat(pSql, " ");
    strcat(pSql, column[column_num-1].column_type);
    strcat(pSql, ");");

    printf("/nsqlite > %s/n/n",pSql);

    ret = sqlite3_exec(db, pSql, NULL, NULL, &errmsg);
    if(ret != SQLITE_OK)
    {
         printf("error:%d:%s/n", ret, errmsg);
         exit(1);
    }
   
    return;
}

int rscallback(void * p, int column, char ** column_val,char ** column_name)
{
    int i;
    *(int *)p = 0;

    for(i = 0; i < column; i++)
    {
        printf("%s > %s/t/t",column_name[i], column_val[i]);
    }
    printf("/n");
    return 0;
}

void db_show(sqlite3 * db, char * pTable_name)
{
    int ret = 0;
    char * errmsg = NULL;
    int empty = 1;
    char sql[200];
    char * pSql;

    pSql = sql;

    strcpy(pSql, "select * from ");
    strcat(pSql, pTable_name);
    strcat(pSql, ";");
    printf("/nsqlite > %s/n/n", pSql);

    ret = sqlite3_exec(db, pSql, rscallback, &empty, &errmsg);
    if(ret != SQLITE_OK)
    {
        printf("error:%d:%s/n", ret, errmsg);
        exit(1);
    }

    if(empty)
    {
        printf("the table is empty!/n");
    }

    printf("/n");
    return;
}

void db_insert(sqlite3 * db, char * pTable_name, int column_num, COLUMN column[], int * test_flag, int * create_flag)
{
    int ret = 0;
    char * errmsg = NULL;
    char sql[200];
    char * pSql;
    char tmp[20];
    int i;
    char test_val[100];

    pSql = sql;
    strcpy(pSql, "insert into ");
    strcat(pSql, pTable_name);
    strcat(pSql, "(");

    if((*test_flag == 0) && (*create_flag))
    {
        strcat(pSql, " name, ");
        strcat(pSql, "sex, ");
        strcat(pSql, "age ) ");
        strcat(pSql, "values (");

        printf("please input name:/n");
        scanf("%s", test_val);
        strcat(pSql, " /'");
        strcat(pSql, test_val);
        strcat(pSql, "/', ");
        printf("please input sex:/n");
        scanf("%s", test_val);
        strcat(pSql, "/'");
        strcat(pSql, test_val);
        strcat(pSql,"/', ");
        printf("please input age:/n");
        scanf("%s",test_val);
        strcat(pSql,test_val);
        strcat(pSql, ");");
    }
    if(*create_flag == 0)
    {
        for(i = 1; i < column_num-1; i++)
        {
            strcat(pSql, column[i].column_name);
            strcat(pSql, ", ");
        }

        strcat(pSql, column[column_num-1].column_name);
        strcat(pSql, ") ");
        strcat(pSql, "values(");
        for(i = 1; i < column_num-1; i++)
        {
            printf("please input %s/n",column[i].column_name);
            if(strcmp(column[i].column_type,"text") == 0)
            {
                strcat(pSql, "/'");
                memset(tmp, 0, sizeof(tmp));
                scanf("%s",tmp);
                strcat(pSql, tmp);
                strcat(pSql,"/'");
                strcat(pSql, ",");
            }
            else
            {
                memset(tmp,0,sizeof(tmp));
                scanf("%s",tmp);
                strcat(pSql, tmp);
                strcat(pSql,",");
                strcat(pSql," ");
            }
        }
        printf("please input %s/n",column[column_num-1].column_name);
        if(strcmp(column[column_num-1].column_type, "text") == 0)
        {
            scanf("%s",tmp);
            strcat(pSql, "/'");
            strcat(pSql, tmp);
            strcat(pSql, "/'");
            strcat(pSql, ");");
        }
        else
        {
            scanf("%s",tmp);
            strcat(pSql, tmp);
            strcat(pSql, ");");
        }
    }
    printf("/nsqlite > %s/n/n", pSql);
 
    ret = sqlite3_exec(db, pSql, NULL, NULL, &errmsg);
    if(ret != SQLITE_OK)
    {
        printf("error:%d:%s/n", ret, errmsg);
        exit(1);
    }

    return;
}

void db_update(sqlite3 * db, char * pTable_name, int column_num, COLUMN column[], int * test_flag, int * create_flag)
{
    int ret = 0;
    char * errmsg = NULL;
    char sql[200];
    char * pSql;
    char new_val[20];
    char  new_id[3];
    int i;
    char test_val[100];
   

    pSql = sql;
    strcpy(pSql, "update ");
    strcat(pSql, pTable_name);
    strcat(pSql, " set ");

    if((*test_flag == 0) && (*create_flag))
    {
        strcat(pSql, "name = ");
        printf("please input a new name:/n");
        scanf("%s",test_val);
        strcat(pSql,"/'");
        strcat(pSql,test_val);
        strcat(pSql, "/', sex = ");
        printf("please input a new sex: /n");
        scanf("%s", test_val);
        strcat(pSql, "/'");
        strcat(pSql, test_val);
        strcat(pSql, "/', age = ");
        printf("please input a new age:/n");
        scanf("%s",test_val);
        strcat(pSql,test_val);
        strcat(pSql, " where id = ");
        printf("please input a id that you want to change:/n");
        scanf("%s",test_val);
        strcat(pSql, test_val);
        strcat(pSql, ";");   
    }
    if(*create_flag == 0)
    {
        for(i = 1; i < column_num-1; i++)
        {
            strcat(pSql, column[i].column_name);
            strcat(pSql, " = ");
            if(strcmp(column[i].column_type, "text") ==0)
            {
                strcat(pSql, "/'");
                memset(new_val, 0, sizeof(new_val));
                printf("please input a new %s/n", column[i].column_name);
                scanf("%s",new_val);
                strcat(pSql, new_val);
                strcat(pSql, "/'");
                strcat(pSql, " , ");
            }
            else
            {
                memset(new_val, 0, sizeof(new_val));
                printf("please input a new %s/n", column[i].column_name);
                scanf("%s",new_val);
                strcat(pSql, new_val);
                strcat(pSql, " , ");
            }
        }

        strcat(pSql, column[i].column_name);
        strcat(pSql, " = ");

        if(strcmp(column[column_num-1].column_type, "text") ==0)
        {
            strcat(pSql, "/'");
            memset(new_val, 0, sizeof(new_val));
            printf("please input a new %s/n", column[i].column_name);
            scanf("%s",new_val);
            strcat(pSql, new_val);
            strcat(pSql, "/'");
            strcat(pSql, " ");
        }
        else
        {
            memset(new_val, 0, sizeof(new_val));
            printf("please input a new %s/n", column[i].column_name);
            scanf("%s",new_val);
            strcat(pSql, new_val);
            strcat(pSql, " ");
        }

        strcat(pSql, "where id = ");
        printf("please input the id that you want to change its value:/n");
        scanf("%s",new_id);
        strcat(pSql, new_id);
        strcat(pSql, ";");
    }
    printf("sqlite > %s/n/n",pSql);
     
    ret = sqlite3_exec(db, pSql, NULL, NULL, &errmsg);
    if(ret != SQLITE_OK)
    {
        printf("error:%d:%s/n", ret, errmsg);
        exit(1);
    }

    return;
   
}

void db_delete(sqlite3 * db, char * pTable_name)
{
    int ret = 0;
    char * errmsg = NULL;
    char sql[200];
    char * pSql;
    char tmp_name[20];
    char tmp_id[3];
   

    pSql = sql;
    strcpy(pSql, "delete from ");
    strcat(pSql, pTable_name);
    strcat(pSql, " where id = ");
    printf("please input a id that you want to delete:/n");
    scanf("%s",tmp_id);
    strcat(pSql, tmp_id);
    strcat(pSql, ";");

    printf("/nsqlite > %s/n/n",pSql);
     
    ret = sqlite3_exec(db, pSql, NULL, NULL, &errmsg);
    if(ret != SQLITE_OK)
    {
        printf("error:%d:%s/n", ret, errmsg);
        exit(1);
    }

    return;
}

void db_empty(sqlite3 * db, char * pTable_name)
{
    int ret = 0;
    char * errmsg = NULL;
    char sql[200];
    char * pSql;


    pSql = sql;
    strcpy(pSql, "delete from ");
    strcat(pSql, pTable_name);
    strcat(pSql,";");

    printf("/nsqlite > %s/n/n",pSql);

    ret = sqlite3_exec(db, pSql, NULL, NULL, &errmsg);
    if(ret != SQLITE_OK)
    {
        printf("error:%d:%s/n", ret, errmsg);
        exit(1);
    }

    return;
}
   
void db_drop(sqlite3 * db, char * pTable_name, int * test_flag, int * create_flag)
{
    int ret = 0;
    char * errmsg = NULL;
    char sql[200];
    char * pSql;


    pSql = sql;
    strcpy(pSql, "drop table ");
    strcat(pSql, pTable_name);
    strcat(pSql,";");

    if(*test_flag)
    {
        printf("/nsqlite > %s/n/n",pSql);
    }

    if(*create_flag == 0)
    {
        printf("/nsqlite > %s/n/n",pSql);
    }

    ret = sqlite3_exec(db, pSql, NULL, NULL, &errmsg);
    if(ret != SQLITE_OK)
    {
        printf("error:%d:%s/n", ret, errmsg);
        exit(1);
    }

    return;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值