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 ...
随机推荐
- python学习笔记之运算符
目录 前言 软件环境 身份运算符 算术运算符 比较运算符 位移运算符 自变运算符 位运算符 逻辑运算符 成员关系运算符 Python真值表 最后 前言 在前面的博文介绍了Python的数据结构之后,接 ...
- 设备常用框架framework
framework名称 framework说明 framework文档 Accelerate.framework 包含加速数学和DSP函数 http://developer.apple.com/iph ...
- python机器学习实战(二)
python机器学习实战(二) 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7159775.html 前言 这篇noteboo ...
- Java 异常Exception e中e的getMessage()和toString()以及 e.printStackTrace();方法的区别
Exception e中e的getMessage()和toString()方法的区别: 示例代码1: public class TestInfo { private static String ...
- Spring3中@Value注解的使用
Spring可以通过@Value注解来直接获取properties文件里面配置的值. 1. 首先要在spring的配置文件中指明properties文件的位置: <context:propert ...
- JS - 讨论 - 编码习惯 - JavaScript代码到底要不要写分号?
如题:烦请大家在评论区给出原创意见!多谢!
- Java虚拟机:JVM内存分代策略
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java虚拟机根据对象存活的周期不同,把堆内存划分为几块,一般分为新生代.老年代和永久代(对HotSpot虚拟机而言),这就是JVM的内存 ...
- Week 1 # A A + B Problem II
原题描述: A - A + B Problem II I have a very simple problem for you. Given two integers A and B, your jo ...
- Selenium模拟JQuery滑动解锁
滑动解锁一直做UI自动化的难点之一,我补一篇滑动解锁的例子,希望能给初做Web UI自动化测试的同学一些思路. 首先先看个例子. https://www.helloweba.com/demo/2017 ...
- 【AngularJS】学习资料
1. http://www.cnblogs.com/lcllao/tag/AngularJs/ http://www.ituring.com.cn/article/13474 http://www.a ...