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
原文地址:https://www.cnblogs.com/ausk/p/4957632.html