sqlite>
运行.help(注意sqlite命令行提供的命令都以”.”开头)可以看到sqlite命令行接口提供下面的功能.
.databases 列出数据库文件名
.tables ?PATTERN? 列出?PATTERN?匹配的表名
.import FILE TABLE 将文件中的数据导入的文件中
.dump ?TABLE? 生成形成数据库表的sql脚本
.output FILENAME 将输出导入到指定的文件中
.output stdout 将输出打印到屏幕
.mode MODE ?TABLE? 设置数据输出模式(csv,html,tcl…
.nullvalue STRING 用指定的串代替输出的NULL串
.read FILENAME 执行指定文件中的sql语句
.schema ?TABLE? 打印创建数据库表的sql语句
.separator STRING 用指定的字符串代替字段分隔符
.show 打印所有sqlite环境变量的设置
.quit 退出命令行接口
数据库的五种数据类型:TEXT,NUMERIC,INTEGER,REAL,NONE
在@H_301_30@sqlite的使用过程中最常发生的数据库异常便是数据库被锁定了(@H_301_30@sqlITE_BUSY或者@H_301_30@sqlITE_LOCKED)。@H_301_30@sqlite对于并发的处理机制是允许同一个进程的多个线程同时读取一个数据库,但是任何时刻只允许一个线程@H_301_30@/进程写入数据库。所以必须要必须要对数据库的读写进行控制。@H_301_30@
@H_301_30@sqlite数据库本身提供了两个函数用来处理锁定情况:
@H_301_30@int sqlite3_busy_handler(sqlite3*,int(*)(void*,int),void*);
@H_301_30@int sqlite3_busy_timeout(sqlite3*,int ms);
使用这两个函数可以设定当发生数据库锁定的时候,调用什么函数来处理,以及设定锁定时的等待时间。
@H_301_30@
@H_301_30@ 当然通常情况下我们还可以用另外一种方法来解决这类问题,那便是设置互斥量。一般情况下我们可以使用互斥量,临界区等来实现。在这里我使用了互斥量,主要是因为我需要在多个不同的进程中并发的访问同一个数据库。用于锁定和解锁的函数如下:
void Lock()
{
if((hCounter = OpenMutex(MUTEX_ALL_ACCESS,FALSE,"kangxiaofang")) == NULL)
{
//如果没有其他进程创建这个互斥量,则重新创建@H_301_30@
hCounter = CreateMutex(NULL,"kangxiaofang");
WaitForSingleObject(hCounter,INFINITE);
}
else
{
WaitForSingleObject(hCounter,INFINITE);
}
}
void UnLock()
{
//释放使用权@H_301_30@
ReleaseMutex(hCounter);
CloseHandle(hCounter);
}
当然我们也可以把等待时间设定为@H_301_30@60秒,以免出现死等的现象。具体使用时可以按如下调用:@H_301_30@
Lock();
rc = sqlite3_exec(db,"BEGIN;",&zErrMsg);
rc = sqlite3_exec(db,exec,"COMMIT;",&zErrMsg);
UnLock();
经过测试这种方法的消耗要小于循环打开数据库的操作:)接下来我们要讨论一下,如何在@H_301_30@sqlite中存取大容量的数据(二进制)。