zoukankan      html  css  js  c++  java
  • sqlite学习笔记8:C语言中使用sqlite之创建表

    前面已经说了怎样打开和关闭数据库,这次要说得是怎样运行SQL语句,来创建一张表。


    要用的的函数:

    sqlite3_exec(sqlite3* db, const char *sql, sqlite_callback callback, void *data, char **errmsg)
    參数:
    db:已经打开的数据库实例
    sql:SQL语句,是一个字符串
    callback:是一个回调函数
    data:做为回调函数的第一个參数
    errmsg:用于带回错误信息
    该回调函数有两种返回值类型.
            1.返回零:sqlite3_exec() 将继续运行查询.
            2.返回非零:sqlite3_exec()将马上中断查询, 且 sqlite3_exec() 将返回 SQLITE_ABORT.

    
    

    回调函数的格式例如以下:
    int sqlite_callback(
        void* pv,    /* 由 sqlite3_exec() 的第四个參数传递而来 */
        int argc,        /* 表的列数 */
        char** argv,    /* 指向查询结果的指针数组, 能够由 sqlite3_column_text() 得到 */
        char** col        /* 指向表头名的指针数组, 能够由 sqlite3_column_name() 得到 */
    );
    
    參数格式:
        传给sqlite3_exec的回调函数,用来显示查询结果
        对每一条查询结果调用一次该回调函数
    參数:
        pv:由sqlite3_exec传递的初始化參数
        argc:表头的列数
        col:表头的名字数组指针
        argv:表头的数据数组指针
    返回值:
        1:中断查找
        0:继续列举查询到的数据



    实例:

    #include <stdio.h>
    #include <stdlib.h>
    #include "sqlite/sqlite3.h"
    
    #define DB_NANE "sqlite/test.db"
    
    sqlite3 *db = NULL;
    char* sql = NULL;
    char *zErrMsg = NULL;
    int ret = 0;
    
    typedef enum{
        false,
        true
    } bool;
    
    static int callback(void *NotUsed, int argc, char **argv, char **azColName)
    {
        int i = 0;
        for(i=0; i < argc; i++){
            printf("%s = %s
    ", azColName[i], argv[i] ? argv[i] : "NULL");
        }
        printf("
    ");
        
        return 0;
    }
    
    bool connectDB()
    {
        ret = sqlite3_open(DB_NANE, &db);
        
        if( ret != SQLITE_OK){
            fprintf(stderr, "Error open database: %s
    ", sqlite3_errmsg(db));
            sqlite3_free(zErrMsg);
            
            return false;
        }
        
        fprintf(stdout, "Successfully opened database
    ");
        return true;
    }
    
    
    /* 相对于前篇文章加入了这个函数 */
    bool createTable()
    {
        /* Create SQL statement */
        sql = "CREATE TABLE COMPANY("  
        "ID INT PRIMARY KEY     NOT NULL," 
        "NAME           TEXT    NOT NULL," 
        "AGE            INT     NOT NULL," 
        "ADDRESS        CHAR(50)," 
        "SALARY         REAL );";
        
        /* Execute SQL statement */
        ret = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
        if( ret != SQLITE_OK ){
            fprintf(stderr, "Error SQL: %s
    ", zErrMsg);
            sqlite3_free(zErrMsg);
            
            return false;
        }
        
        fprintf(stdout, "Successfully table created
    ");
        
        return true;
    }
    
    bool closeDB()
    {
        int ret = 0;
        ret = sqlite3_close(db);
        if ( ret == SQLITE_BUSY ){
            return false;
        }
        
        return true;
    }
    
    int main(int argc, char* argv[])
    {
        connectDB();
        createTable();/*添加了一个函数调用*/
        closeDB();
        
        return 0;
    }

    这个函数仅仅能运行一次,第二次运行会报错说表已经存在。删除生成的test.db能够再次运行。

  • 相关阅读:
    巡风安装笔记
    泛微ecology OA系统某接口存在数据库配置信息泄露漏洞
    Apache Solr Velocity模板远程代码执行复现
    泛微OA系统多版本存在命令执行漏洞
    各种浏览器UA值
    使用python合并excel
    疑难杂症----udf提权无法导出.dll
    疑难杂症----windows7
    Nmap的使用
    Sqlmap的使用
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/5367421.html
Copyright © 2011-2022 走看看