sqlite的几种访问方法
方法1:直接执行SQL语句
sqlite3* db = Open(_T("./test.db3"), FALSE);
if (db != NULL)
{
ExecuteSQL(db, _T("CREATE TABLE Template(TID INTEGER, TName TEXT(32), TContent TEXT(1024), PRIMARY KEY(TID ASC));"));
for (int i = 0; i < TEST_COUNT; i++)
{
CString s;
s.Format(_T("INSERT INTO Template(TName, TContent) VALUES('%d', '%d');"), i, i);
ExecuteSQL(db, s);
}
Close(db);
}
方法2:批处理
sqlite3* db = Open(_T("./test.db3"), FALSE);
if (db != NULL)
{
ExecuteSQL(db, _T("BEGIN;"));
ExecuteSQL(db, _T("CREATE TABLE Template(TID INTEGER, TName TEXT(32), TContent TEXT(1024), PRIMARY KEY(TID ASC));"));
for (int i = 0; i < TEST_COUNT; i++)
{
CString s;
s.Format(_T("INSERT INTO Template(TName, TContent) VALUES('%d', '%d');"), i, i);
ExecuteSQL(db, s);
}
ExecuteSQL(db, _T("COMMIT;"));
Close(db);
}
方法3:数据绑定
sqlite3* db = Open(_T("./test.db3"), FALSE);
if (db != NULL)
{
ExecuteSQL(db, _T("CREATE TABLE Template(TID INTEGER, TName TEXT(32), TContent TEXT(1024), PRIMARY KEY(TID ASC));"));
TCHAR szSQL[128];
_stprintf(szSQL, _T("INSERT INTO Template(TName, TContent) VALUES(?, ?);"));
sqlite3_stmt *stmt = NULL;
const char *pzTail = NULL;
int utf8Len = 0;
char *utf8 = (char*)enc_unicode_to_utf8((const unsigned short*)szSQL, _tcslen(szSQL), &utf8Len);
int nRes = sqlite3_prepare_v2(db, utf8, utf8Len, &stmt, &pzTail);
delete []utf8;
if (SQLITE_OK != nRes)
{
return;
}
for (int i = 0; i < TEST_COUNT; i++)
{
sqlite3_reset(stmt);
sqlite3_bind_int(stmt, 1, i);
sqlite3_bind_int(stmt, 2, i);
sqlite3_step(stmt);
}
Close(db);
}
方法4:批处理与数据绑定结合
sqlite3* db = Open(_T("./test.db3"), FALSE);
if (db != NULL)
{
ExecuteSQL(db, _T("BEGIN;"));
ExecuteSQL(db, _T("CREATE TABLE Template(TID INTEGER, TName TEXT(32), TContent TEXT(1024), PRIMARY KEY(TID ASC));"));
TCHAR szSQL[128];
_stprintf(szSQL, _T("INSERT INTO Template(TName, TContent) VALUES(?, ?);"));
sqlite3_stmt *stmt = NULL;
const char *pzTail = NULL;
int utf8Len = 0;
char *utf8 = (char*)enc_unicode_to_utf8((const unsigned short*)szSQL, _tcslen(szSQL), &utf8Len);
int nRes = sqlite3_prepare_v2(db.GetObject(), utf8, utf8Len, &stmt, &pzTail);
for (int i = 0; i < TEST_COUNT; i++)
{
sqlite3_reset(stmt);
sqlite3_bind_int(stmt, 1, i);
sqlite3_bind_int(stmt, 2, i);
sqlite3_step(stmt);
}
delete []utf8;
if (SQLITE_OK != nRes)
{
return;
}
sqlite3_finalize(stmt);
ExecuteSQL(db, _T("COMMIT;"));
Close(db);
}
经过测试,给这几种方法的效率排序如下:方法4>方法2>方法3>方法1
测试用的公共代码
sqlite3* Open(LPCTSTR szFile, BOOL bReadOnly /* = FALSE */)
{
int nStrlen = _tcslen(szFile);
if (0 == nStrlen)
{
return FALSE;
} sqlite3* db = NULL;
char *utf8 = (char*)enc_unicode_to_utf8((const unsigned short*)szFile, nStrlen);
int nRes = sqlite3_open_v2(utf8, &db, bReadOnly ? SQLITE_OPEN_READONLY : (SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE), NULL);
delete []utf8;
if (nRes != SQLITE_OK)
{
return NULL;
}
return ;
} void Close(sqlite3* db)
{
if (db != NULL)
{
sqlite3_close(db);
}
} BOOL ExecuteSQL(sqlite3* db, LPCTSTR szSQL)
{
sqlite3_stmt *stmt = NULL;
const char *pzTail = NULL;
int utf8Len = 0;
char *utf8 = (char*)enc_unicode_to_utf8((const unsigned short*)szSQL, _tcslen(szSQL), &utf8Len);
int nRes = sqlite3_prepare_v2(db, utf8, utf8Len, &stmt, &pzTail);
delete []utf8;
if (SQLITE_OK != nRes)
{
return FALSE;
} nRes = sqlite3_step(stmt);
for (int i = 0; i < 10; i++)
{
if (SQLITE_BUSY == nRes)
{
Sleep(1000);
continue;
}
else
{
break;
}
}
sqlite3_finalize(stmt); if (SQLITE_DONE != nRes)
{
return FALSE;
}
return TRUE;
}
sqlite的几种访问方法的更多相关文章
- MVC WebApi的两种访问方法
//UserInfoController using ClassLibrary; using System;using System.Collections.Generic;using System. ...
- 基于三层架构下的公共数据访问方法(Sqlite数据库)
作者总结了一下,使用Winform的三层架构做窗体应用程序,在数据访问方面,有用到纯sql语句方法.参数方法.存储过程方法. 那么什么是三层架构呢? UI---存放Form窗体---(用户所关心的) ...
- .net(C#数据库访问) Mysql,Sql server,Sqlite,Access四种数据库的连接方式
便签记录Mysql,Sql server,Sqlite,Access四种数据库的简单连接方式 //using MySql.Data.MySqlClient; #region 执行简单SQL语句,使用M ...
- JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法
相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...
- 深入理解为什么Java中方法内定义的内部类可以访问方法中的局部变量
好文转载:http://blog.csdn.net/zhangjg_blog/article/details/19996629 开篇 在我的上一篇博客 深入理解Java中为什么内部类可以访问外部类的成 ...
- 局部内部类访问方法中的局部变量为什么加final
转载:http://www.cnblogs.com/mjblogs/p/4971630.html 1)从程序设计语言的理论上:局部内部类(即:定义在方法中的内部类),由于本身就是在方法内部(可出现在形 ...
- C#窗体间通讯的几种处理方法
应用程序开发中,经常需要多窗体之间进行数据通信,写几个例子,把几种常用的通信方式总结一下: 主窗体Form1是一个ListBox,单击选中某列时,弹出窗体Form2,Form2中两个控件,一个是Tex ...
- FTP服务器简易有效的访问方法
访问FTP服务器传统的方法是使用专用的客户端程序,如CuteFTP,8UFTP等,也包括命令行的FTP客户端c:\windows\system32\ftp.exe程序. FTP服务器也有简易访问方法 ...
- Java语言中有4种访问修饰符
转载:http://wuhaidong.iteye.com/blog/851754 Java语言中有4种访问修饰符 在Java语言中有4中访问修饰符:package(默认).private.publi ...
随机推荐
- 关于 Eclipse中的Web项目 部署的文件位置 查看jsp源码的部署位置
使用 eclipse 开发web项目 会默认 部署在 工作目录下: .metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps 在这里 ...
- 利用Python实现一个感知机学习算法
本文主要参考英文教材Python Machine Learning第二章.pdf文档下载链接: https://pan.baidu.com/s/1nuS07Qp 密码: gcb9. 本文主要内容包括利 ...
- JavaScript实现一个复数类
<script type="text/javascript"> /** * 这里定义Complex类,用来描述复数 */ /** * 这个构造函数为它所创建的每个实例定 ...
- Java后端开发书架
本人摘录于江南白衣文章,文章地址:http://calvin1978.blogcn.com/articles/javabookshelf.html 书架主要针对Java后端开发. 3.0版把一些后来买 ...
- 简单的小程序实现ATM机操作
简单的小程序实现ATM机操作 代码如下: package Day06; import java.util.Scanner; public class TestAccount { public stat ...
- 通过添加filter过滤器 彻底解决ajax 跨域问题
1.在web.xml添加filter <filter> <filter-name>contextfilter</filter-name> <filter-cl ...
- STS 配置tomcat以后,无法访问
问题 今天在新环境下安装开发环境STS,使用的的3.9,如下图 安装完成之后配置Tomcat,在STS启动Tocat后,在浏览器输入:http://localhost:8080/ 发现无法访问... ...
- Windows 10 IoT Serials 9 – 如何利用IoTCoreAudioControlTool改变设备的音频设备
大家知道,在Windows 10 IoT Core上,如果用户外接了USB声卡.带有麦克风的摄像头之类的硬件,就会有多个音频设备可以用.但是,系统目前并没有提供直接的UI来设置音频的输入或者输出设备. ...
- css 为元素选择器,css目标状态伪类,结构化选择器,多媒体选择器,清除表默认样式、属性选择器
伪元素选择器 :before 和 :after 添加的位置 :before --- 第一个子节点 :after --- 最后一个子节点 特点 1.默认是 inline 元素 2.必须包含 conten ...
- ajax分页效果、分类联动、搜索功能
一.使用smarty+ajax+php实现无刷新分页效果 效果图 <!DOCTYPE html> <html lang="en"> <head> ...