數據庫編程練習

/*****************************************************
Version: 1    
Description:
          1. 不可以手動insert數據
          2. 不可以delete指定數據
          3. 使用回掉函數
*****************************************************/

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

void create_table(sqlite3 * db)
{
    char * errmsg = NULL;
    char * sql;

    sql = "create table if not exists mytable (id integer primary key,name text);";

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

}

int insert_record(sqlite3 * db)
{
    char * errmsg = NULL;
    char * sql;

    sql = "insert into mytable (id,name) values (NULL,'chen');";

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

    sql = "insert into mytable (id,name) values (NULL,'wang');";

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

}

int displaycb(void * para,int n_col,char ** column_value,char ** column_name)
{
    int i;
    printf("total column is %d\n",n_col);

    for(i = 0; i < n_col; i++)
    {
        printf("col_name:%s -- > col_val:%s\n",column_name[i],column_value[i]);
    }

    printf("---------------------------\n");

    return 0;
}

void inquire_usecb(sqlite3 * db)
{
    char * errmsg = NULL;
    char * sql;

    sql = "select * from mytable;";

    if( SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&errmsg))
    {
        printf("inquire failed: %s\n",errmsg);
        exit(-1);
    }
}

void delete_table(sqlite3 * db)
{
    char * errmsg = NULL;
    char * sql;

    sql = "delete from mytable;";

    if( SQLITE_OK != sqlite3_exec(db,sql,NULL,NULL,&errmsg))
    {
        printf("delete failed: %S\n",errmsg);
        exit(-1);
    }
    else
    {
        printf("delete ok!\n");
    }

}

int main()
{

    sqlite3 * db;

    //打開數據庫
    if( SQLITE_OK != sqlite3_open("mydatabase",&db))
    {
        printf("open database failed:%s \n",sqlite3_errmsg(db));
    }
    else
    {
        printf("open datebase successed!\n");
    }

    //創建表
    create_table(db);

    //插入數據
    insert_record(db);

    //使用回掉函數
    inquire_usecb(db); 

    delete_table(db); 

    //關閉數據庫
    sqlite3_close(db);

    return 0;
}
/*****************************************************
Version:2    
Description:
          1. 可以手動insert數據
          2. 可以delete指定數據
          3. 使用回掉函數 
*****************************************************/

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

void create_table(sqlite3 * db)
{
    char * errmsg = NULL;
    char * sql;

    sql = "create table if not exists mytable (id integer primary key,name text);";

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

int insert_record(sqlite3 * db)
{
    char * errmsg = NULL;
    char sql[50];
    int  id;
    char name[50];

    printf("請你輸入id和name:");
    scanf("%d,%s",&id,name);

    sprintf(sql, "insert into mytable (id,name) values (%d,'%s');",id,name); // %s 的單引號?

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

int displaycb(void * para,int n_col,char ** column_value,char ** column_name)
{
    int i;
    printf("total column is %d\n",n_col);

    for(i = 0; i < n_col; i++)
    {
        printf("col_name:%s -- > col_val:%s\n",column_name[i],column_value[i]);
    }

    printf("---------------------------\n");

    return 0;
}

void inquire_usecb(sqlite3 * db)
{
    char * errmsg = NULL;
    char * sql;

    sql = "select * from mytable;";

    if( SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&errmsg))
    {
        printf("inquire failed: %S\n",errmsg);
        exit(-1);
    }
}

void delete_table(sqlite3 * db)
{
    char * errmsg = NULL;
    char  sql[50];
    int id;

    printf("請輸入要刪除的id:");
    scanf("%d",&id);
    sprintf(sql, "delete from mytable where id = %d;",id);

    if( SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&errmsg))
    {
        printf("delete failed: %S\n",errmsg);
        exit(-1);
    }
    else
    {
        printf("delete ok!\n");
    }

}

int main()
{

    sqlite3 * db;

    //打開數據庫
    if( SQLITE_OK != sqlite3_open("mydatabase",&db))
    {
        printf("open database failed:%s \n",sqlite3_errmsg(db));
    }
    else
    {
        printf("open datebase successed!\n");
    }

    //創建表
    create_table(db);

    //插入數據
    insert_record(db);

    //使用回掉函數
    inquire_usecb(db); 

    delete_table(db); 
    //關閉數據庫
    printf("***********************\n");
    inquire_usecb(db); 

    sqlite3_close(db);


    return 0;
}
/*****************************************************
Version:3    
Description:
          和版本2相比回掉函數顯示方式發生變化,但由於機制問題永遠不會
          成爲這個樣子
          id       name 
          1        chen
          2        wang
          3        wu
*****************************************************/

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

void create_table(sqlite3 * db)
{
    char * errmsg = NULL;
    char * sql;

    //if not exists   同名表存在不會報錯
    sql = "create table if not exists mytable (id integer primary key,name text);";

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

}

int insert_record(sqlite3 * db)
{
    char * errmsg = NULL;
    char sql[50];
    int  id;
    char name[50];

    printf("請你輸入id和name:");
    scanf("%d,%s",&id,name);

    sprintf(sql, "insert into mytable (id,name) values (%d,'%s');",id,name); // %s 的單引號?

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

int displaycb(void * para,int n_col,char ** column_value,char ** column_name)
{
    int i;
    printf("total column is %d\n",n_col);


    printf("%8s%8s\n","id","name");
    for(i = 0; i < n_col; i++)
    {
        printf("%8s%8s\n",column_name[i],column_value[i]);
    }

    printf("---------------------------\n");

    return 0;
}

void inquire_usecb(sqlite3 * db)
{
    char * errmsg = NULL;
    char * sql;

    sql = "select * from mytable;";

    if( SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&errmsg))
    {
        printf("inquire failed: %S\n",errmsg);
        exit(-1);
    }
}

void delete_table(sqlite3 * db)
{
    char * errmsg = NULL;
    char  sql[50];
    int id;

    printf("請輸入要刪除的id:");
    scanf("%d",&id);
    sprintf(sql, "delete from mytable where id = %d;",id);

    if( SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&errmsg))
    {
        printf("delete failed: %S\n",errmsg);
        exit(-1);
    }
    else
    {
        printf("delete ok!\n");
    }

}

int main()
{
    //數據庫句柄
    sqlite3 * db;

    //打開數據庫
    if( SQLITE_OK != sqlite3_open("mydatabase",&db))
    {
        printf("open database failed:%s \n",sqlite3_errmsg(db));
    }
    else
    {
        printf("open datebase successed!\n");
    }

    //創建表
    create_table(db);

    //插入數據
    insert_record(db);

    //使用回掉函數
    inquire_usecb(db); 

    delete_table(db); 
    //關閉數據庫
    printf("***********************\n");
    inquire_usecb(db); 

    sqlite3_close(db);


    return 0;
}
/*****************************************************
Version:4    
Description:
          和版本2 3相比,調用的函數發生變化,顯示機制不同
          id       name 
          1        chen
          2        wang
          3        wu
          sqlite3_get_table()函數第三個參數azresult
          數據在內存中存放形式:
          id     ← azresult指向這個位置即先指向字段名       
          name
          1
          chen
          2
          zhang 
          3
          wang
*****************************************************/

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

void create_table(sqlite3 * db)
{
    char * errmsg = NULL;
    char * sql;

    sql = "create table if not exists mytable (id integer primary key,name text);";

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

}

int insert_record(sqlite3 * db)
{
    char * errmsg = NULL;
    char sql[50];
    int  id;
    char name[50];

    printf("請你輸入id和name:");
    scanf("%d,%s",&id,name);

    sprintf(sql, "insert into mytable (id,name) values (%d,'%s');",id,name); // %s 的單引號?

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

int displaycb(void * para,int n_col,char ** column_value,char ** column_name)
{
    int i;
    printf("total column is %d\n",n_col);


    printf("%8s%8s\n","id","name");
    for(i = 0; i < n_col; i++)
    {
        printf("%8s",column_value[i]);
    }
    printf("\n");
    printf("---------------------------\n");

    return 0;
}

void inquire_usecb(sqlite3 * db)
{
    char * errmsg = NULL;
    char * sql;

    sql = "select * from mytable;";

    if( SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&errmsg))
    {
        printf("inquire failed: %S\n",errmsg);
        exit(-1);
    }
}

void delete_table(sqlite3 * db)
{
    char * errmsg = NULL;
    char  sql[50];
    int id;

    printf("請輸入要刪除的id:");
    scanf("%d",&id);
    sprintf(sql, "delete from mytable where id = %d;",id);

    if( SQLITE_OK != sqlite3_exec(db,sql,displaycb,NULL,&errmsg))
    {
        printf("delete failed: %S\n",errmsg);
        exit(-1);
    }
    else
    {
        printf("delete ok!\n");
    }

}

void inquire_nocb(sqlite3 * db)
{
    int nrow,ncolumn;
    char ** azresult;
    char * sql;
    char * errmsg;
    int i;

    sql = "select * from mytable;";

    //azresuli存放的是字符指針數組的地址,所以是三級指針
    if( SQLITE_OK != sqlite3_get_table(db,sql,&azresult,&nrow,&ncolumn,&errmsg))
    {
        printf("%s\n",errmsg);
        exit(-1);
    }

    printf("row:%d     column:%d\n",nrow,ncolumn);
    printf("result:\n");

    for(i = 0; i < (nrow + 1) * ncolumn; i++)
    {
        printf("%8s",azresult[i]);
        if((i + 1) % ncolumn == 0)
        {
            printf("\n");
        }
    }

    sqlite3_free_table(azresult);
}
int main()
{

    sqlite3 * db;

    //打開數據庫
    if( SQLITE_OK != sqlite3_open("mydatabase",&db))
    {
        printf("open database failed:%s \n",sqlite3_errmsg(db));
    }
    else
    {
        printf("open datebase successed!\n");
    }

    //創建表
    create_table(db);

    //插入數據
    insert_record(db);

    //使用回掉函數
    inquire_usecb(db); 

    delete_table(db); 
    //關閉數據庫
    printf("***********************\n");
    inquire_nocb(db); 

    sqlite3_close(db);


    return 0;
}
發佈了82 篇原創文章 · 獲贊 38 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章