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 ...
随机推荐
- JVM入门——运行时数据区
这张图我相信基本上对JVM有点接触的都应该很熟悉,可以说这是JVM入门的第一课.其中的“堆”和“虚拟机栈(栈)”更是耳熟能详.下面将围绕这张图对JVM的运行时数据区做一个简单介绍. 程序计数器(Pro ...
- 终于等到你!MobileTest免费公测,华为带你走出安卓适配大坑
一.安卓适配之痛真的无解吗? Android平台的诞生对智能手机的普及功不可没,但设备繁多.品牌众多.版本各异,芯片.摄像头.分辨率不统一等等,这些都逐渐成为Android系统发展的障碍,碎片化严重不 ...
- docker~从Dockerfile到Container的过程(终于算是OK了)
上一文章,主要介绍Dockerfile里各参数的含义,以及在项目文件里这些内容的含义,因为大叔认为官方和网上其它文章说的有些模棱两可,不太好让大家理解,所有我又从新写了一个大白话的文章,希望可以给大家 ...
- Eclipse简单插件开发-启动时间提示
1.新建Plug-in Project 不用改其他选项,直接点击"Next",然后点击"Finish" 2.新建ShowTime.java package ...
- 求n个逆元的O(n)算法
它的推导过程如下,设,那么 对上式两边同时除,进一步得到 再把和替换掉,最终得到 初始化,这样就可以通过递推法求出模奇素数的所有逆元了. 转自 http://blog.csdn.net/acdrea ...
- [Android]Android内存泄漏你所要知道的一切(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/7235616.html Android内存泄漏你所要知道的一切 ...
- Selenium自动化初级/中级网络授课班招生
近期学习selenium和appium的测试人员越来越多,应广大刚接触UI自动化以及对selenium想要更深入了解的测试人员的要求,特请一位资深测试架构师为我们开课讲解selenium,以及如何设计 ...
- HDFS笔记——技术点汇总
目录 · 概况 · 原理 · HDFS 架构 · 块 · NameNode · SecondaryNameNode · fsimage与edits合并 · DataNode · 数据读写 · 容错机制 ...
- Django中ORM模型总结(一)[概述,查询语句]
理解ORM框架 概述 O:(objects)->类和对象. R:(Relation)->关系,关系数据库中的表格. M:(Mapping)->映射. 作用: 可以通过类和类对象就可以 ...
- 浅谈jQuery Pagination Ajax 分页插件的使用
插件介绍 此插件是jQuery的ajax分页插件.分页切换时无刷新也无延迟,因为是一次性加载的.如果你用到此插件作分页的时候,涉及到的数据量大,建议不要使用此插件,因为加载慢会导致用户体验不好! 插件 ...