在Linux下,用SQlite数据库编写的图书管理系统源代码及错误总结

本文介绍了一个简单的图书管理系统程序,该系统基于SQLite数据库实现,包括图书信息的增删改查等功能。
</pre><pre name="code" class="html">
总结:重点是利用sprintf()函数实现数据动态输入输出
错误总结:刚开始输入数据时只能输入一个字符,多于一个字符就出现段错误,检查后发现是<pre name="code" class="html">sprintf(sql,"insert into book_info(ISBN,name,writer,publisher,time,price) values(%d,'%s','%s','%s','%s',%d);",ISBN,name,writer,publisher,time,price);
    printf("---------------------\n");这一句中,<span style="font-family: Arial, Helvetica, sans-serif;">values()里面有字符串,应该用单引号括起来,才表示将一个字符串插入相应的地方,否则就只能输入一个字符。</span>
<span style="font-family:Arial, Helvetica, sans-serif;">在Linux下编写程序时,遇到最多的错误就是段错误, 通常段错误是指访问的内存超出了系统所给这个程序的内存空间,遇到段错误,首先检查scanf(),看输入的参数有没有加取地址符,很多时候我都是这个地方出问题了;</span>
<span style="font-family:Arial, Helvetica, sans-serif;">再检查指针。。。。</span>
<span style="font-family:Arial, Helvetica, sans-serif;">个人心得:本来觉得应该很难写,自己写不出来的,后来因为某个赌注,逼着自己一晚上写了出来,这个程序也算是我写程序的又一个新的起点吧,以后会更加自信!!</span>

/*****************************************************
copyright (C), Nanjing University of Tecnology
File name:db.c
Author: Xiecan  Version:0.1    Date: 2016-05-10 14:48
Description:
Funcion List: 
*****************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <sqlite3.h>

#define N 10
#define M 15

int displaycb(void *para,int n_column,char ** column_value,char ** column_name);
int inquire_usecb(sqlite3 *db);
void Menus(sqlite3 *db);

int creat_table(sqlite3 *db);
int insert_data(sqlite3 *db);
int delete_data(sqlite3 *db);
int update_data(sqlite3 *db);
int find_data(sqlite3 *db);
int show_data(sqlite3 *db);
int qiut(sqlite3 *db);


int main(int argc, char **argv)
{
    sqlite3 *db = NULL;
    int rc;

    rc = sqlite3_open("database.db",&db);

    if(rc != SQLITE_OK)
    {
        printf("open database error!\n");
        exit(-1);
    }
    else 
    {
        printf("create database success!\n");
    }

    rc = creat_table(db);
    
    while(1)
    {
        Menus(db);
    }

    //rc = creat_table(db);

    return 0;
}

int inquire_usecb(sqlite3 *db)
{
    char *sql;
    char *errmsg;

    sql = "select * from book_info;";

    if(SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&errmsg))
    {
        printf("exec_select error!error on:%s\n",errmsg);
        exit(-1);
    }
    /*sql = "./header on";

    if(SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&errmsg))
    {
        printf("exec_header error!error on:%s\n",errmsg);
        exit(-1);
    }*/

    return 0;
}

int displaycb(void *para,int n_column,char **column_value,char ** column_name)
{
    int i;

    printf("**************************************************\n");
    printf("total column is %d\n",n_column);
    for(i = 0; i < n_column; i++)
    {
        printf("columnname:%s---->columnvalue:%s\n",column_name[i],column_value[i]);
    }

    printf("**************************************************\n");
    return 0;
}
/****************************************************
函数功能:选择菜单
****************************************************/
void Menus(sqlite3 *db)
{
    int ch;
    printf("/***************欢迎进入图书管理系统****************/\n");
    printf("*               1.添加图书信息\
          \n                2.删除图书信息\
          \n                3.查找图书信息\
          \n                4.修改图书信息\
          \n                5.输出图书管理系统所有图书信息\
          \n                6.退出系统\
          \n/***************************************************/\n");
    printf("请输入你想进行的操作:\n");
    scanf("%d",&ch);
    switch(ch)
    {
        case 1:
            insert_data(db);
            inquire_usecb(db);
           break;
        case 2:
            delete_data(db);
            inquire_usecb(db);
           break;
        case 3:
            find_data(db);
            inquire_usecb(db);
           break;
        case 4:
            update_data(db);
            inquire_usecb(db);
           break;
        case 5:
            inquire_usecb(db);
           break;
        case 6:
            qiut(db);
           break;
        default:
            printf("输入错误,请重新输入!\n");
    }
}

int creat_table(sqlite3 *db)
{
    char *sql;
    char *errmsg;

    sql = "create table if not exists book_info(\
           ISBN integer primary key,\
           name text,\
           writer text,\
           publisher text,\
           time text,\
           price real);";

    if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
    {
        printf("exec_create table error! error on:%s\n",errmsg);
        exit(-1);
    }

    return 0;
}

int insert_data(sqlite3 *db)
{
    char sql[100];
    char *errmsg;
    int i;
    int num;

    int ISBN;
    char name[N];
    char writer[N];
    char publisher[N];
    char time[N];
    int price;
    
    printf("你想录入几本书?\n");
    scanf("%d",&num);

    for(i = 1; i <= num; i++)
    {
        printf("请输入第%d本书的信息:\n",i);

        printf("ISBN:");
        scanf("%d",&ISBN);

        printf("书名:");
        //gets(name);
        scanf("%s",name);

        printf("作者:");
        scanf("%s",writer);

        printf("出版社:");
        scanf("%s",publisher);
    
        printf("出版时间:");
        scanf("%s",time);

        printf("价格:");
        scanf("%d",&price);
        
        printf("********************\n");
        sprintf(sql,"insert into book_info(ISBN,name,writer,publisher,time,price) values(%d,'%s','%s','%s','%s',%d);",ISBN,name,writer,publisher,time,price);
    printf("---------------------\n");
        if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
        {
            printf("exec_insert data error! error on:%s\n",errmsg);
            exit(-1);
        }

    }

        return 0;
}

/*****************************************************
函数功能:删除图书
*****************************************************/
int delete_data(sqlite3 *db)
{
    char sql[100];
    char *errmsg;
    int ch;
    int ISBN;
    char name[N];
    char writer[N];
    char publisher[N];
    char time[N];


        printf("--------删除图书信息--------\n");
    printf("请选择你想进行的删除操作:\n");
    printf("        1.删除与指定ISBN相同的书\
          \n        2.删除与指定书名相同的书\
          \n        3.删除指定作者的书\
          \n        4.删除指定出版社的书\n");
    printf("------------------------\n");
    scanf("%d",&ch);

    switch(ch)
    {
        case 1:
            printf("请输入你要删除的图书的ISBN:\n");//根据ISBN找到指定图书
            scanf("%d",&ISBN);
            sprintf(sql,"delete from book_info where ISBN = %d;",ISBN);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_delete data according to ISBN error! error on:%s\n",errmsg);
                exit(-1);
            }
           break;
        case 2:
            printf("请输入你想删除图书的名字:\n");
            scanf("%s",name);
           sprintf(sql,"delete from book_info where name = %s;",name);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_delete data according to name error! error on:%s\n",errmsg);
                exit(-1);
            }
           break;
        case 3:
            printf("请输入你想删除图书的作者名:\n");
            scanf("%s",writer);
           sprintf(sql,"delete from book_info where writer = %s;",writer);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_delete data according to writer error! error on:%s\n",errmsg);
                exit(-1);
            }
           break;
        case 4:
            printf("请输入你想删除图书的出版社名字:\n");
            scanf("%s",publisher);
           sprintf(sql,"delete from book_info where publisher = %s;",publisher);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_delete data according to publisher error! error on:%s\n",errmsg);
                exit(-1);
            }
           break;
        default:
            printf("输入错误!\n");
    }
}

/******************************************************
函数功能:根据需要选择要进行修改的操作
******************************************************/
int update_data(sqlite3 *db)
{
    char *errmsg;
    char sql[100];
    int ch;
    int c = 1;

    int NU;
    int ISBN;
    char name[N];
    char writer[N];
    char publisher[N];
    char time[N];
    int price;

     while(c)
    {
        c = 0;
        printf("--------修改图书信息--------\n");
        printf("请输入你想修改图书的ISBN:\n");
        scanf("%d",&NU);

        printf("请选择你想进行的修改操作:\n");
        printf("            1.修改ISBN\
              \n            2.修改书名\
              \n            3.修改作者\
              \n            4.修改出版社名\
              \n            5.修改书的价格\
              \n            6.修改出版日期\n");
        printf("----------------------\n");
        scanf("%d",&ch);

        switch(ch)
        {
         case 1:
            printf("请输入新的ISBN:\n");
            scanf("%d",&ISBN);

            sprintf(sql,"update book_info set ISBN = %d where ISBN = %d;",ISBN,NU);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_update ISBN error! error on:%s\n",errmsg);
                exit(-1);
            }
           break;
        case 2:
            printf("请输入新的书名:\n");
            scanf("%s",name);
           sprintf(sql,"update book_info set name = %s where ISBN = %d;",name,NU);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_update name error! error on:%s\n",errmsg);
                exit(-1);
            }
           break;
        case 3:
            printf("请输入新的作者名字:\n");
            scanf("%s",writer);
           sprintf(sql,"update book_info set writer = %s where ISBN = %d;",writer,NU);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_update writer error! error on:%s\n",errmsg);
                exit(-1);
            }
           break;
        case 4:
            printf("请输入新的出版社名字:\n");
            scanf("%s",publisher);
           sprintf(sql,"update book_info set publisher = %s where ISBN = %d;",publisher,NU);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_update publisher error! error on:%s\n",errmsg);
                exit(-1);
            }
            break;
        case 5:
            printf("请输入新的time:\n");
            scanf("%s",time);
           sprintf(sql,"update book_info set time = %s where ISBN = %d;",time,NU);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_update time error! error on:%s\n",errmsg);
                exit(-1);
            }
            break;
        case 6:
            printf("请输入新的price:\n");
            scanf("%d",&price);
           sprintf(sql,"update book_info set price = %d where ISBN = %d;",price,NU);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_update price error! error on:%s\n",errmsg);
                exit(-1);
            }
            break;
        default:
            printf("输入错误\n");
        }

C:      printf("还要继续修改吗?\
             \n1.继续\
             \n0.退出\n");
        scanf("%d",&c);
        if(c > 1)
        {
            printf("输入错误,请重新输入!\n");
            goto C;
        }

    }
    printf("修改后:\n");

}
   
int find_data(sqlite3 *db)
{
    char sql[100];
    char *errmsg;
    int ch;
    int a,b;
    char stime[N];
    char etime[N];
    int ISBN;
    char name[N];
    char writer[N];
    char publisher[N];

        printf("--------查找图书信息--------\n");
    printf("请选择你想进行的查找操作:\n");
    printf("        1.按ISBN查找\
          \n        2.按书名查找\
          \n        3.查找指定作者的所有书\
          \n        4.查找指定出版社出版的所有书\
          \n        5.查找书的价格范围在指定区间的书\
          \n        6.查找出版时间在指定区间内的书\n");
        printf("----------------------\n");
    scanf("%d",&ch);

    switch(ch)
    {
        case 1:
            printf("请输入你想查找图书的ISBN:\n");
            scanf("%d",&ISBN);

            sprintf(sql,"select * from book_info where ISBN = %d;",ISBN);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_find data according to ISBN error! error on:%s\n",errmsg);
                exit(-1);
            }
         break;
        case 2:
            printf("请输入你想查找图书的书名:\n");
            scanf("%s",name);
            sprintf(sql,"select * from book_info where = %s;",name);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_find data according to name error! error on:%s\n",errmsg);
                exit(-1);
            }
          break;
        case 3:
            printf("请输入你想查找图书的作者:\n");
            scanf("%s",writer);
            sprintf(sql,"select * from book_info where writer = %s;",writer);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_find data according to writer error! error on:%s\n",errmsg);
                exit(-1);
            }
        break;
        case 4:
            printf("请输入你想查找图书的出版社名字:\n");
            scanf("%s",publisher);
            sprintf(sql,"select * from book_info where publisher = %s;",publisher);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_find data according to publisher error! error on:%s\n",errmsg);
                exit(-1);
            }
       break;
        case 5:
            printf("请输入你想查找图书价格的下限:\n");
            scanf("%s",&a);
            printf("请输入你想查找图书的上限:\n");
            scanf("%s",&b);
            sprintf(sql,"select * from book_info where price in (%d,%d);",a,b);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_find data according to price error! error on:%s\n",errmsg);
                exit(-1);
            }
          break;
        case 6:
            printf("请输入你想查找图书出版日期的区间[a,b]:(以逗号隔开)\n");
            scanf("%s,%s",stime,etime);
            sprintf(sql,"select * from book_info where strcmp(time,%s) >= 0 and strcmp(time,%s) <= 0;",stime,etime);
            if(SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
            {
                printf("exec_find data according to time error! error on:%s\n",errmsg);
                exit(-1);
            }
         break;
        default:
            printf("输入错误\n");
    }
   
    return 0;
}
int show_data(sqlite3 *db)
{
    return 0;
}
int qiut(sqlite3 *db)
{
    printf("欢迎使用图书管理系统,再见!\n");
    sqlite3_close(db);
    exit(0);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值