SQLite入门(二)读写二进制数据
//读二进制数据的函数
BOOL OpenBinDataFile(BYTE **pBUf,UINT &len)
{
if (pBUf == NULL)
{
return FALSE;
}
std::ifstream fs;
fs.open(g_szBinDataPath,ios::binary);
if (!fs.is_open())
{
cout<<"File:"<<g_szBinDataPath<<"not Open"<<endl;
return FALSE;
}
fs.seekg(0,ios::end);
len = fs.tellg();
fs.seekg(0,ios::beg);
*pBUf = new BYTE[len];
if (NULL == *pBUf)
{
cout<<"内存分配不足"<<endl;
return FALSE;
}
fs.read((char*)(*pBUf),len);
fs.close();
return TRUE;
}
//#define _USE_TRANSACTION //是否使用事务
#define _DB_TABLE_COUNTS 10 //100张表
#define LOOPSCOUNT 20 //记录数
#define TABLEFLAG 10 //第十张表写入1000个记录
#define RESETEST
BOOL SqlitePerfWithUnicode()//Unicode
{
cout<<"UNICODE TEST:"<<endl;
BYTE *pBuf=NULL;
UINT len = 0;
if (!OpenBinDataFile(&pBuf,len))
{
cout<<"打开二进制数据失败"<<endl;
if (pBuf)
{
delete []pBuf;
}
return FALSE;
}
sqlite3 *db = NULL;
TCHAR *errMsg = NULL;
sqlite3_stmt *pstmt=NULL;
TCHAR *psql = NULL;
int nRet = -1,nRows=-1;
nRet = sqlite3_open16(L"F:\\UnicodeTest.db",&db);
if (nRet)
{
wcout<<L"无法打开UnicodeTest数据库:"<<sqlite3_errmsg16(db)<<endl;
//sqlite3_free(errMsg);
sqlite3_close(db);
cin.get();
return 1;
}
else
{
wcout<<L"成功打开UnicodeTest.db"<<endl;
}
TCHAR szNum[100]={0};
TCHAR table[100]={0};
//std::vector<std::wstring> vecTableNames;
std::vector<std::wstring> vecID;
std::wstring wst;
std::vector<std::wstring> vecInsertStr,vecReadStr;
vecInsertStr.reserve(_DB_TABLE_COUNTS);
vecReadStr.reserve(_DB_TABLE_COUNTS);
for (int j=0;j<LOOPSCOUNT*10;++j)
{
_itot(j,szNum,10);
vecID.push_back(szNum);
}
for (int i=0;i<_DB_TABLE_COUNTS;++i)//建立100张表
{
_itot(i,szNum,10);
//vecID.push_back(szNum);//不够
wst = L"unicodetest_";
wst += szNum;//表命名:unicodetest_x
//vecTableNames.push_back(wst);
psql = L"create table if not exists %s(id nchar(20) primary key,name blob)";
_snwprintf_s(table,_countof(table),_TRUNCATE,psql,wst.c_str());
//创建 _DB_TABLE_COUNTS 张表
psql = table;
sqlite3_prepare16(db,psql,-1,&pstmt,NULL);
sqlite3_step(pstmt);
sqlite3_reset(pstmt);
psql = L"insert into %s values(?,?);";
_snwprintf_s(table,_countof(table),_TRUNCATE,psql,wst.c_str());
//psql = table;
vecInsertStr.push_back(table);
psql = L"select id,name from %s;";
_snwprintf_s(table,_countof(table),_TRUNCATE,psql,wst.c_str());
//psql = table;
vecReadStr.push_back(table);
}
//psql = L"create table if not exists unicodetest(id nchar(20) primary key,name blob)";
//sqlite3_prepare16(db,psql,-1,&pstmt,NULL);
//sqlite3_step(pstmt);
//sqlite3_reset(pstmt);
DWORD dwBegin = GetTickCount();
#ifdef _USE_TRANSACTION
sqlite3_exec(db,"begin transaction;",NULL,NULL,NULL);
#endif
for(int j=1;j<_DB_TABLE_COUNTS;++j)
{
psql = const_cast<TCHAR*>(vecInsertStr[j].c_str());
#ifdef RESETEST
sqlite3_prepare16(db,psql,-1,&pstmt,NULL);
#endif
for (int i=0;i<LOOPSCOUNT;++i)//写
{
#ifndef RESETEST
sqlite3_prepare16(db,psql,-1,&pstmt,NULL);
#endif
sqlite3_bind_text16(pstmt,1,vecID[i].c_str(),-1,NULL);
sqlite3_bind_blob(pstmt,2,pBuf,len,NULL);
sqlite3_step(pstmt);
#ifdef RESETEST
sqlite3_reset(pstmt);
#else
sqlite3_finalize(pstmt);
#endif
}
}
psql = const_cast<TCHAR*>(vecInsertStr[0].c_str());//id为"0"的表写入1000个记录
for (int i=0;i<LOOPSCOUNT*10;++i)//写
{
sqlite3_prepare16(db,psql,-1,&pstmt,NULL);
sqlite3_bind_text16(pstmt,1,vecID[i].c_str(),-1,NULL);//这里也相应的扩大
sqlite3_bind_blob(pstmt,2,pBuf,len,NULL);
sqlite3_step(pstmt);
sqlite3_reset(pstmt);
}
#ifdef _USE_TRANSACTION
sqlite3_exec(db,"commit transaction;",NULL,NULL,NULL);
#endif
DWORD dwEnd = GetTickCount();
cout<<"共有 "<< _DB_TABLE_COUNTS <<" 张表,每张表"<<"插入 "<<LOOPSCOUNT<<" 份记录(每份大小["<<len<<"B].)"<<endl;
cout<<"其中最后一张表插入"<<LOOPSCOUNT*10<<"记录"<<endl;
cout<<"总耗时:"<<dwEnd-dwBegin<<endl;
dwBegin = GetTickCount();
#ifdef _USE_TRANSACTION
sqlite3_exec(db,"begin transaction;",NULL,NULL,NULL);
#endif
for (int i=0;i<_DB_TABLE_COUNTS;++i)//读
{
sqlite3_prepare16(db,vecReadStr[i].c_str(),-1,&pstmt,NULL);
nRet = sqlite3_step(pstmt);
while(nRet == SQLITE_ROW)
{
sqlite3_column_text16(pstmt,0);
sqlite3_column_blob(pstmt,1);//数据先不读出
nRet = sqlite3_step(pstmt);
}
sqlite3_reset(pstmt);
}
#ifdef _USE_TRANSACTION
sqlite3_exec(db,"commit transaction;",NULL,NULL,NULL);
#endif
dwEnd = GetTickCount();
cout<<"依次读 "<<_DB_TABLE_COUNTS<<" 张表内的 "<<LOOPSCOUNT<<"份记录,总耗时:"<<dwEnd-dwBegin<<endl;
sqlite3_reset(pstmt);
sqlite3_finalize(pstmt);
sqlite3_close(db);
if (pBuf)
{
delete []pBuf;
}
//cin.get();
return TRUE;
}
SQLite入门(二)读写二进制数据的更多相关文章
- IO流-文本IO\读写二进制数据
文本IO 一.简述 OutputStreamWriter类使用选定的编码方式吧Unicode字符流转换为字节流,InputStreamReader类将包含字节的输入流转为可以产生Unicode字符的读 ...
- DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表
原文:DevExpress XtraReports 入门二 创建 data-aware(数据感知) 报表 本文只是为了帮助初次接触或是需要DevExpress XtraReports报表的人群使用的, ...
- 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据
[源码下载] 背水一战 Windows 10 (89) - 文件系统: 读写文本数据, 读写二进制数据, 读写流数据 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 读写文本数 ...
- Java读写二进制数据
import java.io.*; import java.time.LocalDate; public class Test { public static void main(String[] a ...
- echart图表控件配置入门(二)常用图表数据动态绑定
上一节 <echart图表控件配置入门(一)>介绍了echarts图表控件的入门配置,使开发人员可以快速搭建出一个静态的图表.但是在实际开发过程这还是不够的,不可能所有的图表控件都是静态数 ...
- Qt里怎么处理二进制数据
Qt里有个专门的类QDataStream就是专门读写二进制数据的, 它与QByteArray搭配在网络编程中有奇效. 来个栗子: // write data QByteArray data; QDat ...
- 重新想象 Windows 8 Store Apps (23) - 文件系统: 文本的读写, 二进制的读写, 流的读写, 最近访问列表和未来访问列表
原文:重新想象 Windows 8 Store Apps (23) - 文件系统: 文本的读写, 二进制的读写, 流的读写, 最近访问列表和未来访问列表 [源码下载] 重新想象 Windows 8 S ...
- SQLite 入门教程(二)创建、修改、删除表 (转)
转于 SQLite 入门教程(二)创建.修改.删除表 一.数据库定义语言 DDL 在关系型数据库中,数据库中的表 Table.视图 View.索引 Index.关系 Relationship 和触发器 ...
- SQLite入门与分析(二)---设计与概念(续)
SQLite入门与分析(二)---设计与概念(续) 写在前面:本节讨论事务,事务是DBMS最核心的技术之一.在计算机科学史上,有三位科学家因在数据库领域的成就而获ACM图灵奖,而其中之一Jim G ...
随机推荐
- Python——Django学习笔记
Django——一个封装好的神奇框架 若本文有任何内容错误,望各位大佬指出批评,并请直接联系作者修改,谢谢!小白学习不易. 一.简要模型 模型类操作数据表: python manage.py shel ...
- 在win7系统设置SQL Server2014 express为远程数据
如何设置远程访问到SQLserver服务器(局域网内的设置) 1.首先,使用Windows+R键 输入services.msc 打开本地服务. *说明:①MSSQLSERVER是正式使用的SQL创建实 ...
- nodejs之socket.io 聊天实现
写在前面:最近很火的“996”话题,可谓是引起一片热议,马老师说:能够996应该是幸运的,996是对奋斗者的一种机遇(记得不是很清楚).996缺少的是自己的空闲时间了,当我是空闲的时候偶尔996挺好的 ...
- 转 JSON在PHP中的基本应用
PHP原生提供json_encode()和json_decode()函数,前者用于编码,后者用于解码. 一.json_encode() 该函数主要用来将数组和对象,转换为json格式.先看一个数组转换 ...
- ionic3 pop到指定页面
this.navCtrl.getViews().forEach(element => { if(element.name == 'JiecheHomePage'){ this.navCtrl.p ...
- java实现多线程的4种方式
1.继承Thread类 看jdk源码可以发现,Thread类其实是实现了Runnable接口的一个实例,继承Thread类后需要重写run方法并通过start方法启动线程. 继承Thread类耦合性太 ...
- Oracle系统表整理 --sql
-- DBA/ALL/USER/V_$/GV_$/SESSION/INDEX开头的绝大部分都是视图-- DBA_TABLES意为DBA拥有的或可以访问的所有的关系表.-- ALL_TABLES意为某一 ...
- python中range()和len()函数区别
函数:len() 作用:返回字符串.列表.字典.元组等长度 语法:len(str) 参数: str:要计算的字符串.列表.字典.元组等 返回值:字符串.列表.字典.元组等元素的长度 实例 1.计算字符 ...
- Vim改装成一个IDE编程环境
1 写在前面 Linux下编程一直被诟病的一点是: 没有一个好用的IDE, 但是听说Linux牛人, 黑客之类的也都不用IDE. 但是对我等从Windows平台转移过来的Coder来说, 一个 ...
- Netbeans8的中文乱码
Netbeans8的中文乱码 前提: 不是编码的问题,统一改成UTF-8,之后文字还是显示方块.使用以下方式解决: 菜单 -> 工具 -> 选项 -> 字体和颜色 -> 语法 ...