• 151111 sqlite3数据库学习


    最近在学习数据库,想起去年做的项目里用到了sqlite3。那时候,没有任何的数据库经验,误打误撞,找到了sqlite3,然后参考网络上零碎的信息,把它嵌入到工程里,并且成功了。可惜,那时候没有好好保存记录,电脑在被弄坏之后资料全木有了。今天,重新下载、配置了sqlite3,记下学习记录,以备参考。

    ch1. 编译可执行文件和动态链接库

    下载源文件压缩包sqlite-amalgamation-3090200.zip,提取出sqlite3.h sqlite3.c shell.c
    下载dll文件压缩包sqlite-dll-win32-x86-3090200.zip,提取出sqlite3.def

    ==============================================
    1. 使用VS生成动态链接库 
    
    配置属性 - 链接器 - 输入 - 模块定义文件 : 
    sqlite3.def 
    
    配置属性 - C/C++ - 预处理器 - 预处理器定义:
    SQLITE_ENABLE_COLUMN_METADATA
    SQLITE_ENABLE_RTREE
    SQLITE3_EXPORTS
    
    2. 使用VS命令行生成可执行文件sqlite3.exe 和 动态链接库sqlite3.dll 静态库 sqlite3.lib
    ======================================================
    rem 151111 编译sqlite3.exe 
    @cl /O3 /EHsc shell.c sqlite3.c /o:sqlite3.exe
    @del *.obj
    
    ======================================================
    rem 151111 生成sqlite3的动态链接库文件
    @echo off
    @echo clcompiling ...
    @cl /c /Zi /nologo /W3 /O2 /GL /D SQLITE_ENABLE_COLUMN_METADATA /D SQLITE_ENABLE_RTREE  /D SQLITE3_EXPORTS  /D WIN32 /D NDEBUG /D _WINDOWS /D _USRDLL /D _UNICODE /D UNICODE /EHsc "sqlite3.c"
    echo linking ...
    @link /OUT:"sqlite3.dll" /DEF:"sqlite3.def" /OPT:REF /OPT:ICF /LTCG /IMPLIB:"sqlite3.lib" /DLL sqlite3.obj
    @echo done!
    @del *.obj
    @del *.pdb
    @del *.exp 
    pause
    ========================================================
    rem 复制文件到bin目录下 
    @cd ..
    @del /F /Q bin   
    @rmdir bin
    @mkdir bin
    @copy .srcsqlite3.exe .insqlite3.exe 
    @copy .srcsqlite3.dll .insqlite3.dll
    @copy .srcsqlite3.lib .insqlite3.lib
    @copy .srcsqlite3.def .insqlite3.def
    @copy .srcsqlite3.h   .insqlite3.h
    
    
    ================================================================
    3. 使用dumpbin 和 lib工具生成 lib 
    
    也可以直接使用dll文件,使用dumpbin工具导出dll中的def文件,然后使用lib工具生成lib文件。
    以后,在工程中可以不使用LoadLibrary,而直接使用#pragma comment(lib,"xxx.lib")。
    
    (1) 使用dumpbin工具导出dll中的def文件 
    dumpbin /exports sqlite3.dll >sqlite33.def
    将生成的文件,
     
        ordinal hint RVA      name
    
              1    0 00013C6B sqlite3_aggregate_context
              2    1 00005594 sqlite3_aggregate_count
              3    2 000183A4 sqlite3_auto_extension
              ...    ...
    
    
    
    修改为 
    
    EXPORTS
    sqlite3_aggregate_context
    sqlite3_aggregate_count
    sqlite3_auto_extension
    ... 
    
    (2) 使用lib工具,导出lib文件 
    
    lib /def:sqlite33.def /out:sqlite33.lib 
    

    ch2. 运行并测试sqlite3.exe

    1. 建立(或打开已存在的)数据库
    
        sqlite3.exe  test.db 
    
    2. 创建表,插入数据,查询数据,删除数据
    
        PRAGMA foreign_keys=OFF;
        BEGIN TRANSACTION;
        CREATE TABLE users(userid varchar(20) PRIMARY KEY, age int,phone text not null default 'unknow',UNIQUE(userid,phone));
        INSERT INTO "users" VALUES('jin',22,'18040510022');
        INSERT INTO "users" VALUES('jia',23,'18040510023');
        COMMIT;
    
        SELECT * FROM USERS ORDER BY userid;
        SELECT DISTINCT userid FROM USERS ORDER BY userid;
        DELETE  from "users" where userid='jia';
    
    3. 将输出作为文件保存
    
        .output output_bak.db  /*将输出重定向到文件中*/
        .dump                 
        .output stdout         /*返回到标准输入输出*/
    
    4. 备份数据库 
    
        .save saved_bak.db
        .dump /*倾泻、倾倒 */
    
    5. 载入数据库,查看数据信息 
    
        .mode col           /*设置以表格的形式查看数据*/  
        .header on          /*显示表头*/
        .read saved_bak.db  /*读取数据库*/
        .database           /*显示数据库内容 show databases*/
        .tables             /*显示数据表 show tables*/
    
        .schema users          /*显示创建原语 show create table users */
        select type ,name, tbl_name, sql from sqlite_master order by type;  /*显示所有信息*/
    
    
    6. 释放掉被删除的内存空间
    
        sqlite3.exe test.db vacuum
    
    
    7. 注释方式
    
        -- 这是单行注释
    
        /*这是
        多行注释*/
    
    
    8. 5种基本类型
    
        Integer
        Float
        Blob
        Text
        Null
    

    ch3. C/C++嵌入sqlite3

        // 151111 test_sqlite.cpp 
        #include <stdio.h>
        #include <stdlib.h>
        #include <sqlite3.h>
        #pragma comment(lib,"sqlite3.lib")
    
        static int callback(void *NotUsed, int argc, char **argv, char **azColName)
        {
            int i;
            for (i = 0; i < argc; i++)
            {
                printf("%s = %s
    ", azColName[i], argv[i] ? argv[i] : "NULL");
            }
            printf("
    ");
            return 0;
        }
    
        int main(int argc, char **argv)
        {
            sqlite3 *db;
            char *zErrMsg = 0;
            int rc;
    
            if( argc != 3 )
            {
                fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT
    ", argv[0]);
                fprintf(stderr, "such as: test_sqlite.exe .\bin\user.db "select * from users;" 
    ");
                return (1);
            }
    
            rc = sqlite3_open(argv[1], &db);
            if( rc )
            {
                fprintf(stderr, "Can't open database: %s
    ", sqlite3_errmsg(db));
                sqlite3_close(db);
                return (1);
            }
    
            rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
            if( rc != SQLITE_OK )
            {
                fprintf(stderr, "SQL error: %s
    ", zErrMsg);
                sqlite3_free(zErrMsg);
            }
            sqlite3_close(db);
            system("pause");
            return 0;
        }
    

    输出:

    userid = jin
    age = 22
    phone = 18040510022
    
    userid = jia
    age = 23
    phone = 18040510023
    
  • 相关阅读:
    Java注释
    加强版记事本
    Git简单使用
    Git简单使用
    Hadoop 2.6.0动态添加节点
    Hadoop 2.6.0动态添加节点
    ZooKeeper3.4.6配置
    ZooKeeper3.4.6配置
    SSH连接问题
    SSH连接问题
  • 原文地址:https://www.cnblogs.com/ausk/p/4957632.html
Copyright © 2020-2023  润新知