Windows 中SQLite3 使用(2) –- 基本导出函数
一、概述
SQLite3 的最常使用基本导出函数有五个:
sqlite3_open:打开(链接到) SQLite3 数据库。
sqlite3_close:关闭 SQLite3 数据库连接。
sqlite3_exec:对于已打开的数据库连接,执行 SQL 语句。
sqlite3_get_table:对于已打开的数据库连接,查询数据库。
sqlite3_free:释放 SQLite 内部分配的内存。
二、使用
SQLite3 使用非常简单,像 Windows 大部分 API 一样,先打开对应的资源,获得句柄,然后对资源进行操纵,最后关闭句柄。
下面的代码演示其过程(代码中含有大量注释,具体函数调用过程可看注释):
#include "stdafx.h"
#include "sqlite3.h"
#include <windows.h>
#pragma comment(lib, "sqlite3.lib")
void PrintInfo(LPCSTR* pPrintInfo, int nRows, int nCols)
{
LPCSTR lpszTemp = NULL;
for (int nRowIndex = 0; nRowIndex <= nRows; nRowIndex++) // nRowIndex = 0 时,查找到的是表头
{
for (int nColIndex = 0; nColIndex < nCols; nColIndex++)
{
lpszTemp = *(pPrintInfo + nRowIndex * nCols + nColIndex); // 信息是直接累加的,前面是表头
if (lpszTemp)
{
printf(lpszTemp);
printf("/n");
}
}
printf("---------------------------------------/n");
}
printf("=======================================================/n");
}
void main()
{
sqlite3* pSQLite = NULL;
int nRet = 0;
LPCSTR lpszSQL1 = "create table people(name varchar(20), age int, birthday datetime);"; // 创建表格people 的SQL 语句
LPCSTR lpszSQL2 = "insert into people values('wang',20,'1990-6-3');"; // 插入信息的SQL 语句
LPCSTR lpszSQL3 = "insert into people values('li',21,'1989-3-2');";
LPCSTR lpszSQL4 = "select * from people;"; // 查找表格people 的所有信息的SQL 语句
LPCSTR lpszSQL5 = "delete from people where name='wang';"; // 删除姓名为"wang" 的信息
LPSTR* plpszResult = NULL;
int nRows = 0;
int nCols = 0;
nRet = sqlite3_open("C://SQLite3_Test.db", &pSQLite); // 链接到数据库,如果成功,数据库句柄指针存储于pSQLite 中
if (nRet != SQLITE_OK) // 函数返回SQLITE_OK 表示连接成功,否则直接退出连接
goto Exit0;
nRet = sqlite3_exec(pSQLite, lpszSQL1, NULL, NULL, NULL); // 执行SQL 语句,创建people 表
if (nRet != SQLITE_OK)
goto Exit0;
nRet = sqlite3_exec(pSQLite, lpszSQL2, NULL, NULL, NULL); // 执行SQL 语句,将信息插入表格
if (nRet != SQLITE_OK)
goto Exit0;
nRet = sqlite3_exec(pSQLite, lpszSQL3, NULL, NULL, NULL);
if (nRet != SQLITE_OK)
goto Exit0;
nRet = sqlite3_get_table(pSQLite, lpszSQL4, &plpszResult, &nRows, &nCols, NULL); // 查询表格中所有信息
if (nRet != SQLITE_OK)
goto Exit0;
PrintInfo((LPCSTR*)plpszResult, nRows, nCols); // 输出查询到的信息
nRet = sqlite3_exec(pSQLite, lpszSQL5, NULL, NULL, NULL); // 删除姓名为"wang" 的信息
if (nRet != SQLITE_OK)
goto Exit0;
nRet = sqlite3_get_table(pSQLite, lpszSQL4, &plpszResult, &nRows, &nCols, NULL);
if (nRet != SQLITE_OK)
goto Exit0;
PrintInfo((LPCSTR*)plpszResult, nRows, nCols); // 当删除一项后,再打印出数据库中的信息
Exit0:
if (plpszResult)
{
if (*plpszResult)
{
sqlite3_free(*plpszResult);
*plpszResult = NULL;
}
}
if (pSQLite)
{
sqlite3_close(pSQLite); // 关闭SQLite 数据库连接
pSQLite = NULL;
}
DeleteFile("C://SQLite3_Test.db"); // 删除用于测试的文件
return;
}
三、使用时的线程安全
在 Windows 中,SQLite3 是线程安全的,但使用时也必须遵守规定:一个 sqlite3 结构体指针,只能在一个线程中使用,如果需要将此 sqlite3 结构体传递给其他线程,则必须先复制一份,然后传递。