SQLite3API编程手册
前序: (1)
一、版本 (1)
二、基本编译 (2)
三、SQLITE操作入门 (2)
(1)基本流程 (2)
(2)SQL语句操作 (4)
(3)操作二进制 (8)
(4)事务处理 (10)
四、给数据库加密 (10)
五、后记 (25)
前序:
Sqlite3 的确很好用。小巧、速度快。但是因为非微软的产品,帮助文档总觉得不够。这些天再次研究它,又有一些收获,这里把我对sqlite3 的研究列出来,以备忘记。
这里要注明,我是一个跨平台专注者,并不喜欢只用windows 平台。我以前的工作就是为unix 平台写代码。下面我所写的东西,虽然没有验证,但是我已尽量不使用任何windows 的东西,只使用标准 C 或标准C++。但是,我没有尝试过在别的系统、别的编译器下编译,因此下面的叙述如果不正确,则留待以后修改。
下面我的代码仍然用VC 编写,因为我觉得VC是一个很不错的IDE,可以加快代码编写速度(例如配合Vassist )。下面我所说的编译环境,是VC2003。如果读者觉得自己习惯于unix 下用vi 编写代码速度较快,可以不用管我的说明,只需要符合自己习惯即可,因为我用的是标准 C 或C++ 。不会给任何人带来不便。
一、版本
从网站可下载到最新的sqlite 代码和编译版本。我写此文章时,最新代码是版本。
很久没有去下载sqlite 新代码,因此也不知道sqlite 变化这么大。以前很多文件,现在全部合并成一个文件。如果单独用此文件,是挺好的,省去拷贝一堆文件还担心有没有遗漏。但是也带来一个问题:此文件太大,快接近7万行代码,VC开它整个机器都慢下来了。如果不需要改它代码,也就不需要打开文件,机器不会慢。但是,下面我要写通过修改sqlite 代码完成加密功能,那时候就比较痛苦了。如果个人水平较高,建议用些简单的编辑器来编辑,例如UltraEdit 或Notepad 。速度会快很多。
二、基本编译
这个不想多说了,在VC 里新建dos 控制台空白工程,把和添加到工程,再新建一个文件。在里面写:
extern "C"
{
#include "./"
};
int main( int , char** )
{
return 0;
}
为什么要extern “C” 如果问这个问题,我不想说太多,这是C++的基础。要在C++ 里使用一段 C 的代码,必须要用extern “C” 括起来。C++跟C虽然语法上有重叠,但是它们是两个不同的东西,内存里的布局是完全不同的,在C++编译器里不用extern “C”括起C代码,会导致编译器不知道该如何为 C 代码描述内存布局。
可能在里人家已经把整段代码都extern “C” 括起来了,但是你遇到一个.c 文件就自觉的再括一次,也没什么不好。基本工程就这样建立起来了。编译,可以通过。但是有一堆的warning。可以不管它。
三、SQLITE操作入门
sqlite提供的是一些C函数接口,你可以用这些函数操作数据库。通过使用这些接口,传递一些标准sql 语句(以char * 类型)给sqlite 函数,sqlite 就会为你操作数据库。
sqlite 跟MS的access一样是文件型数据库,就是说,一个数据库就是一个文件,此数据库里可以建立很多的表,可以建立索引、触发器等等,但是,它实际上得到的就是一个文件。备份这个文件就备份了整个数据库。
sqlite 不需要任何数据库引擎,这意味着如果你需要sqlite 来保存一些用户数据,甚至都不需要安装数据库(如果你做个小软件还要求人家必须装了sqlserver 才能运行,那也太黑心了)。
下面开始介绍数据库基本操作。
(1)基本流程
关键数据结构
sqlite 里最常用到的是sqlite3 * 类型。从数据库打开开始,sqlite就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型。当数据库打开时开始,这个类型的变量就代表了你要操作的数据库。下面再详细介绍。
打开数据库
int sqlite3_open( 文件名, sqlite3 ** );
用这个函数开始数据库操作。
需要传入两个参数,一是数据库文件名,比如:,如果此文件不存在,sqlite 会自动建立它。如果它存在,就尝试把它当数据库文件来打开。
sqlite3 ** 参数即前面提到的关键数据结构。这个结构底层细节如何,你不要关它。
函数返回值表示操作是否正确,如果是SQLITE_OK 则表示操作正常。相关的返回值sqlite定义了一些宏。具体这些宏的含义可以参考文件。里面有详细定义(顺便说一下,sqlite3 的代码注释率自称是非常高的,实际上也的确很高。只要你会看英文,sqlite 可以让你学到不少东西)。
下面介绍关闭数据库后,再给一段参考代码。
关闭数据库
int sqlite3_close(sqlite3 *);
前面如果用sqlite3_open 开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。
下面给段简单的代码:
extern "C"
{
#include "./"
};
int main( int , char** )
{
sqlite3 * db = NULL; int i;
printf( “记录包含%d 个字段/n”, n_column );
for( i = 0 ; i < n_column; i ++ )
{
printf( “字段名:%s ?> 字段值:%s/n”, column_name[i], column_value[i] );
}
printf( “------------------/n“ );
return 0;
}
int main( int , char ** )
{
sqlite3 * db;
int result;
char * errmsg = NULL;
result = sqlite3_open( “, &db );
if( result != SQLITE_OK )
{
"
#include ""
int My_Encrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key )
{
return 0;
}
int My_DeEncrypt_Func( unsigned char * pData, unsigned int data_len, const char * key, unsigned int len_of_key )
{
return 0;
}
这个文件很容易看,就两函数,一个加密一个解密。传进来的参数分别是待处理的数据、数据长度、密钥、密钥长度。处理时直接把结果作用于pData 指针指向的内容。
你需要定义自己的加解密过程,就改动这两个函数,其它部分不用动。扩展起来很简单。
这里有个特点,data_len 一般总是1024 字节。正因为如此,你可以在你的算法里使用一些特定长度的加密算法,比如AES要求被加密数据一定是128位(16字节)长。这个1024不是碰巧,而是Sqlite 的页定义是1024字节,在文件里有定义:
# define SQLITE_DEFAULT_PAGE_SIZE 1024
你可以改动这个值,不过还是建议没有必要不要去改它。
上面写了两个扩展函数,如何把扩展函数跟Sqlite 挂接起来,这个过程说起来比较麻烦。我直接贴代码。
分3个步骤。
首先,在文件顶部,添加下面内容:
#ifdef SQLITE_HAS_CODEC
#include "./"
void sqlite3pager_free_codecarg(void *pArg);
#endif
这个函数之所以要在开头声明,是因为下面在里面某些函数里要插入这个函数调用。所以要提前声明。
其次,在文件里搜索“sqlite3PagerClose”函数,要找到它的实现代码(而不是声明代码)。
实现代码里一开始是:
#ifdef SQLITE_ENABLE_MEMORY_MANAGEMENT
ThreadData *pTsd = sqlite3ThreadData();
assert( pPager );
assert( pTsd && pTsd->nAlloc );
#endif
需要在这部分后面紧接着插入:
#ifdef SQLITE_HAS_CODEC
sqlite3pager_free_codecarg(pPager->pCodecArg);
#endif
这里要注意,sqlite3PagerClose 函数大概也是版本左右才改名的,以前版本里是叫“sqlite3pager_close”。因此你在老版本sqlite代码里搜索“sqlite3PagerClose”是搜不到的。
类似的还有“sqlite3pager_get”、“sqlite3pager_unref”、“sqlite3pager_write”、“sqlite3pager_pagecount”等都是老版本函数,它们在文件里定义。新版本对应函数是在里定义(因为都合并到和两文件了)。所以,如果你在使用老版本的sqlite,先看看文件,这些函数不是消失了,也不是新蹦出来的,而是老版本函数改名得到的。
最后,往文件下找。找到最后一行:
在这一行后面,接上本文最下面的代码段。
这些代码很长,我不再解释,直接接上去就得了。
唯一要提的是DeriveKey 函数。这个函数是对密钥的扩展。比如,你要求密钥是128位,即是16字节,但是如果用户只输入1个字节呢2个字节呢或输入50个字节呢你得对密钥进行扩展,使之符合16字节的要求。
DeriveKey 函数就是做这个扩展的。有人把接收到的密钥求md5,这也是一个办法,因为md5运算结果固定16字节,不论你有多少字符,最后就是16字节。这是md5算法的特点。但是我不想用md5,因为还得为它添加包含一些md5 的.c 或.cpp文件。我不想这么做。我自己写了一个算法来扩展密钥,很简单的算法。当然,你也可以使用你的扩展方法,也而可以使用md5 算法。只要修改DeriveKey 函数就可以了。
在DeriveKey 函数里,只管申请空间构造所需要的密钥,不需要释放,因为在另一个函数里有释放过程,而那个函数会在数据库关闭时被调用。参考我的DeriveKey 函数来申请内存。
这里我给出我已经修改好的和文件。
如果太懒,就直接使用这两个文件,编译肯定能通过,运行也正常。当然,你必须按我前面提的,新建和文件,而且函数要按我前面定义的要求来做。
加密使用方法:
现在,你代码已经有了加密功能。
你要把加密功能给用上,除了改文件、给你工程添加SQLITE_HAS_CODEC 宏,还得修改你的数据库调用函数。
前面提到过,要开始一个数据库操作,必须先sqlite3_open 。
加解密过程就在sqlite3_open 后面操作。
假设你已经sqlite3_open 成功了,紧接着写下面的代码:
int i;
函数会申请缓冲区.
static LPCryptBlock CreateCryptBlock(unsigned char* hKey, Pager *pager, LPCryptBlock pExisting);
static void DestroyCryptBlock(LPCryptBlock pBlock);
static void * sqlite3pager_get_codecarg(Pager *pPager);
void sqlite3pager_set_codec(Pager *pPager,void *(*xCodec)(void*,void*,Pgno,int),void *pCodecArg );
果改变,就需要调整.
if (nMode != 2)
{
PgHdr *pageHeader;
pageHeader = DATA_TO_PGHDR(data);
if (pageHeader->pPager->pageSize != pBlock->PageSize)
{
CreateCryptBlock(0, pageHeader->pPager, pBlock);
}
}
switch(nMode)
{
case 0:
static void DestroyCryptBlock(LPCryptBlock pBlock)
{
if (pBlock->ReadKey){
sqliteFree(pBlock->ReadKey);
}
if (pBlock->WriteKey && pBlock->WriteKey != pBlock->ReadKey){
sqliteFree(pBlock->WriteKey);
}
if(pBlock->Data){
sqliteFree(pBlock->Data);
}
sqliteFree(pBlock);
}
static void * sqlite3pager_get_codecarg(Pager *pPager)
{
return (pPager->xCodec) pPager->pCodecArg: NULL;
}
函数会申请缓冲区.
static LPCryptBlock CreateCryptBlock(unsigned char* hKey, Pager *pager, LPCryptBlock pExisting) {
LPCryptBlock pBlock;
if (!pExisting) if (!pKey || !nKeyLen)
{
if (!nDb)
{
return SQLITE_OK; }
else {
Bt));
if (!pBlock) return SQLITE_OK; {
hKey = DeriveKey(pKey, nKeyLen);
}
if (hKey)
{
LPCryptBlock pBlock = CreateCryptBlock(hKey, sqlite3BtreePager(db->aDb[nDb].pBt), NULL); sqlite3pager_set_codec(sqlite3BtreePager(db->aDb[nDb].pBt), sqlite3Codec, pBlock);
rc = SQLITE_OK;
}
return rc;
}
int __stdcall sqlite3_rekey_interop(sqlite3 *db, const void *pKey, int nKeySize)
{
Btree *pbt = db->aDb[0].pBt;
Pager *p = sqlite3BtreePager(pbt);
LPCryptBlock pBlock = (LPCryptBlock)sqlite3pager_get_codecarg(p);
unsigned char * hKey = DeriveKey(pKey, nKeySize);
int rc = SQLITE_ERROR;
if (!pBlock && !hKey) return SQLITE_OK;
if (!pBlock) //加密一个未加密的数据库
{
pBlock = CreateCryptBlock(hKey, p, NULL);
pBlock->ReadKey = 0; // 原始数据库未加密
sqlite3pager_set_codec(sqlite3BtreePager(pbt), sqlite3Codec, pBlock);
}
else // 改变已加密数据库的写密钥
{
pBlock->WriteKey = hKey;
}
// 开始一个事务
rc = sqlite3BtreeBeginTrans(pbt, 1);
if (!rc)
{
// 用新密钥重写所有的页到数据库。
Pgno nPage = sqlite3PagerPagecount(p);
Pgno nSkip = PAGER_MJ_PGNO(p);
void *pPage;
Pgno n;
for(n = 1; rc == SQLITE_OK && n <= nPage; n )
{
if (n == nSkip) continue;
rc = sqlite3PagerGet(p, n, &pPage);
if(!rc)
{
rc = sqlite3PagerWrite(pPage);
sqlite3PagerUnref(pPage);
}
}
}
// 如果成功,提交事务。
if (!rc)
{
rc = sqlite3BtreeCommit(pbt);
}
// 如果失败,回滚。
if (rc)
{
sqlite3BtreeRollback(pbt);
}
// 如果成功,销毁先前的读密钥。并使读密钥等于当前的写密钥。if (!rc)
{
if (pBlock->ReadKey)
{
sqliteFree(pBlock->ReadKey);
}
pBlock->ReadKey = pBlock->WriteKey;
}
else// 如果失败,销毁当前的写密钥,并恢复为当前的读密钥。
{
if (pBlock->WriteKey)
{
sqliteFree(pBlock->WriteKey);
}
pBlock->WriteKey = pBlock->ReadKey;
}
// 如果读密钥和写密钥皆为空,就不需要再对页进行编解码。
// 销毁加密块并移除页的编解码器
if (!pBlock->ReadKey && !pBlock->WriteKey)
{
sqlite3pager_set_codec(p, NULL, NULL);
DestroyCryptBlock(pBlock);
}
return rc;
}
int __stdcall sqlite3_key_interop(sqlite3 *db, const void *pKey, int nKeySize) {
return sqlite3CodecAttach(db, 0, pKey, nKeySize);
}
// 释放与一个页相关的加密块
void sqlite3pager_free_codecarg(void *pArg)
{
if (pArg)
DestroyCryptBlock((LPCryptBlock)pArg);
}
#endif //#ifdef SQLITE_HAS_CODEC
https://www.wendangku.net/doc/7517069157.html,/linchunhua/article/details/7184439 sqlite数据库只用一个文件就ok,小巧方便,所以是一个非常不错的嵌入式数据库,SQLite 大量的被用于手机,PDA,MP3播放器以及机顶盒设备。 Mozilla Firefox使用SQLite作为数据库。 Mac计算机中的包含了多份SQLite的拷贝,用于不同的应用。 PHP将SQLite作为内置的数据库。 Skype客户端软件在内部使用SQLite。 SymbianOS(智能手机操作平台的领航)内置SQLite。 AOL邮件客户端绑定了SQLite。 Solaris 10在启动过程中需要使用SQLite。 McAfee杀毒软件使用SQLite。 iPhones使用SQLite。 Symbian和Apple以外的很多手机生产厂商使用SQLite。 下面就sqlite中的常用命令和语法介绍 https://www.wendangku.net/doc/7517069157.html,/download.html可下载不同操作系统的相关版本sqlite gedit 也可以使用火狐中的插件sqlite manager 新建数据库 sqlite3 databasefilename 检查databasefilename是否存在,如果不存在就创建并进入数据库(如果直接退出,数据库文件不会创建)如果已经存在直接进入数据库对数据库进行操作 sqlite中命令: 以.开头,大小写敏感(数据库对象名称是大小写不敏感的) .exit .help 查看帮助针对命令 .database 显示数据库信息;包含当前数据库的位置 .tables 或者.table 显示表名称没有表则不显示 .schema 命令可以查看创建数据对象时的SQL命令; .schema databaseobjectname查看创建该数据库对象时的SQL的命令;如果没有这个数据库对象就不显示内容,不会有错误提示 .read FILENAME 执行指定文件中的SQL语句 .headers on/off 显示表头默认off .mode list|column|insert|line|tabs|tcl|csv 改变输出格式,具体如下 sqlite> .mode list sqlite> select * from emp; 7369|SMITH|CLERK|7902|17-12-1980|800||20 7499|ALLEN|SALESMAN|7698|20-02-1981|1600|300|30 如果字段值为NULL 默认不显示也就是显示空字符串
22104030施工质量控制的内容和方法 复习要点 1.施工质量控制的基本环节和一般方法 (1)施工质量控制的基本环节包括事前、事中和事后质量控制。 (2)施工质量控制的依据分为共同性依据和专门技术法规性依据。 (3)施工质量控制的一般方法包括质量文件审核和现场质量检查。现场质量检查的内容包括开工前的检查;工序交接检查;隐蔽工程的检查;停工后复工的检查;分项、分部工程完工后的检查以及成品保护的检查。检查的方法主要有目测法、实测法和试验法。试验法又分为理化试验和无损检测。 2.施工准备阶段的质量控制 (1)施工质量控制的准备工作包括工程项目划分与编号以及技术准备的质量控制。 (2)现场施工准备的质量控制包括工程定位和标高基准的控制以及施工平面布置的控制。 (3)材料的质量控制要把好采购订货关、进场检验关以及存储和使用关。 (4)施工机械设备的质量控制包括机械设备的选型、主要性能参数指标的确定以及使用操作要求。 3.施工过程的质量控制 (1)技术交底书应由施工项目技术人员编制,并经项目技术负责人批准实施。交底的形式有:书面、口头、会议、挂牌、样板、示范操作等。 (2)项目开工前应编制测量控制方案,经项目技术负责人批准后实施。 (3)施工过程中的计量工作包括施工生产时的投料计量、施工测量、监测计量以及对项目、产品或过程的测试、检验、分析计量等。其主要任务是统一计量单位制度,组织量值传递,保证量值统一。 (4)工序施工质量控制主要包括工序施工条件质量控制和工序施工质量效果控制。 (5)特殊过程是指该施工过程或工序的施工质量不易或不能通过其后的检验和试验而得到充分验证,或万一发生质量事故则难以挽救的施工过程。其质量控制除按一般过程质量控制的规定执行外,还应由专业技术人员编制作业指导书,经项目技术负责人审批后执行。(6)成品保护的措施一般包括防护、包裹、覆盖、封闭等方法。 4.工程施工质量验收的规定和方法 (1)工程施工质量验收的内容包括施工过程的工程质量验收和施工项目竣工质量验收。(2)施工过程的工程质量验收,是在施工过程中、在施工单位自行质量检查评定的基础上,参与建设活动的有关单位共同对检验批、分项、分部、单位工程的质量进行抽样复验,根据相关标准以书面形式对工程质量达到合格与否做出确认。 (3)施工项目竣工验收工作可分为验收的准备、初步验收(预验收)和正式验收。 一单项选择题
Office办公文秘使用技巧_秘书基础 “。接着单击“格式”为数字设置一些特殊格式,比如字体加大、文字加粗以及特殊颜色等。最后单击“全部替换”就可以了。不过要注意,它会让文档中的所有数字都改变的。 查找对话框中的快捷键 执行“编辑-查找”命令,或者按“Ctrl+F”键调出查找对话框,会发现对话框中的许多项目之后都有一个带下划线的字母,这就是此项的快捷键了,不过一定要先按Alt键才能让它们起作用,比如按“Alt+F”,是查找下一处,按“Alt+M”是打开高级选项,按Alt+D/P/G,是在查找、替换、定位这三个选项卡中切换等(本技巧同样适合其它的对话框)。 另外,在office20xx中进行查找/替换时,我们经常会在不关闭查找/替换对话框的情况下,切换到正文中进行修改,然后再回到查找/替换对话框中继续操作,一般都是通过鼠标点击进行切换,其实直接按Ctrl+Tab键就可以了,非常方便。 在最后一次搜索结果中快速浏览 当你搜索完毕,退出查找对话框后,如果想回过头看看刚才的搜索结果,这时不用再打开查找对话框,直接按Ctrl+PageUp键或Ctrl+PageDown键,就可以在上一次的搜索结果中快速浏览了。 高亮显示所有搜索出来的结果 为了让搜索出来的结果更醒目,可以让搜索的结果内容高亮显示出来。操作很简单:在查找对话框中选中“突出显示所有在该范围找出的项目”就可以了。 替换时巧妙保留书签
假设在word中有这么一段文本:This agreement between [John Doel] and [Mary Smith] is entered into freely and without compulsion. 其中括号括起来的部分表示定义了书签,括号是为了让大家看的清楚,真实文本中并没有出现。如果在进行替换操作时,将两个人物名称换成了其它人名,那么书签也会随之丢失。大家在定义书签时,将人名前后的空格都包括进来,如下所示:This agreement between[ John Doel ]and[ Mary Smith ]is entered into freely and without compulsion. 使用图片替换文本 有时我们可能想用图片来替换某些文本,比如,你可能想用公司的Logo图片来替换文档中的所有公司名称,可通过下面的步骤来实现: 第一步:图片插入到文档中,选取它,再按Ctrl+X键剪切把它放到系统的剪贴板中。 第二步:按“Ctrl+H”键调出替换对话框,在“查找内容”中输入要替换的文本,在“替换为”中输入“”(不含引号,下同)。 第三步:可以单击“查找下一处”、“替换”一个一个替换,也可以单击“全部替换”一次性全部替换。这时文档中的被替换的文字,就都会成图论文,会大量出现一些同样的术语或关键词,如果想让这些术语或关键词有一个统一的格式,不用一个一个设置,用替换功能很快就能完成。 第一步:找到要设置格式的第一个术语或关键词(如:“虚拟现实”),设置它的大小、字体、颜色等格式。选中设置好的术语,按“Ctrl+C”键将它复制到剪切板上。 第二步:按“Ctrl+H”键调出替换对话框,在“查找内容”中输入“虚拟
Sqlite3教程 一、基本命令 1、进入命令行环境: 显示版本号,并告诉每一条SQL语句必须用分号;结尾2、命令行帮助:
3、退出命令行环境 或者 二、数据库相关命令 1、创建(或打开)一个新的数据库:文件名 若文件存在,刚打开该文件;若文件不存在,则创建一个*.db数据库文件。 导入SQL语句文件。
、列出所有数据表: 4、显示数据库结构: 用一些SQL语句描述数据库的结构。 5、显示表的结构:表名 6、导入数据:文件名表名 若导入csv文件,设置分隔符为逗号。 、导出数据:文件名 查询结果默认在终端显示,查询表格结构,语句查询表格数据。设置查询目标后,查询结果显示在设置的文件中 文件名 然后输入sql查询语句,查询的结果显示在设置的文件中,不在终端显示 运行恢复导出到终端(标准输出)。 导出数据到excle表格中 设置分隔符为逗号: 设置导出文件名,后缀为csv: 查询语句:表名
三、数据显示命令 运行表名,显示全表的内容 1.设置分隔符:分隔符 默认分隔符是“|”。 2.设置显示模式:模式
默认的是list显示模式,一般使用column模式。 3.显示标题栏: 4.设置每一列的显示宽度: 5.列出当前显示格式设置情况: 四、数据库基本操作 1.数据库定义语言DDL 在关系型数据库中,数据库中的表table、视图、索引、关系和触发器等等,构成了数据库的架构。在SQL语句中,专门有一些语句用来定义数据库架构,这些语句被称为“数据库定义语言”,即DDL。 SQLite数据库引擎支持下列三种DDL语句: ●CREATE:创建 ●ALTER TABLE:改变表的结构 ●DROP:删除
数据库的操作 我们在这个项目中使用的是SQLITE3数据库软件。 通过使用SQLITE3进行创建数据库,创建表,插入记录,查询记录,更新记录,关闭数据库等操作来实现将相应的数据存入数据库中。 1.打开数据库,创建表 1.1sqlite*db;定义一个sqlite*的变量 sqlite3_open(“./link.db”,&db); 在当前目录下打开一个名为link.db的数据库,若是没有则在当前目录下创建一个名为link.db 的数据库。 1.2sql="create table weblink(id integer primary key,domain text,page text,fromdomain text,status integer);" 在已打开的数据库中创建一个名weblink的表。表的属性如下: id integer primary key:ID号(表中黙认包含的) domain text:域名 page text:子网页 fromdomain text:源域名 status integer:状态标志 1.3sqlite3_exec(db,sql,NULL,NULL,NULL); 执行一条sql语句的函数。 函数原型:int sqlite3_exec(sqlite3*,const char*sql,sqlite3_callback,void*,char**errmsg) 第1个参数是前面open函数得到的指针。说了是关键数据结构。 第2个参数const char*sql是一条sql语句,以\0结尾。 第3个参数sqlite3_callback是回调,当这条语句执行之后,sqlite3会去调用你提供的这个函数。(什么是回调函数,自己找别的资料学习) 第4个参数void*是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。等下我们再看回调函数的写法,以及这个参数的使用。 第5个参数char**errmsg是错误信息。注意是指针的指针。sqlite3里面有很多固定的错误信息。执行sqlite3_exec之后,执行失败时可以查阅这个指针(直接printf(“%s\n”,errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。sqlite3_exec函数通过修改你传入的指针的指针,把你提供的指针指向错误提示信息,这样sqlite3_exec函数外面就可以通过这个char*得到具体错误提示。 说明:通常,sqlite3_callback和它后面的void*这两个位置都可以填NULL。填NULL表
sqlite3本地数据库学习 sqlite3只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比mysql还快,专门用于移动设备上进行适量的数据存取,它只是个文件,不需要服务器进程。 常用术语:表(table)、字段(colum,列,属性)、记录(row,record) 关键字:select、insert、updete、delete、from、creat、where、desc、order、by、group、table、alter、view、index等。 1、安装sqlite3 sudo()apt-get()install()sqlite3 2、存储类型 integer 整型:int,shoert,long text 文本字符串:string real 浮点型:float,double blob 二进制 3、字段结束 not null:字段的值不能为空 unique:字段的值必须是唯一的 default:指定字段的默认值 primarykey:主键,用来唯一的标识某条记录,相当于记录的身份证。主键可以是一个或多个字段,应由计算机自动生成和管理。主键字段默认包含了not null和unique两个约束。 autoincrement:当主键是integer类型时,应该增加autoincrement约束,能实现主键值的自动增长。 外键:利用外键可以用来建立表与表之间的联系,一般是一张表的某个字段,引用着另一张表的主键。 4、创建数据库usr.db在当前目录下 sqlite3()usr.db 5、创建表格,表格内容以树状存储 create()table()表名(字段名1()字段类型1,字段名2()字段类型2...) 6、数据库中不能使用关键字命名表和字段,不区分大小写,每条语句后加";"结尾 7、删除表格 drop()table()表名 8、向表格里添加数据 insert()into()表名(字段1,字段2...)values(字段1的值,字段2的值...) 8、修改表中的数据 updata()表名()set()字段1=字段1的值,字段2=字段2的值... //将字段为name全部修改成'Tom' updata()stu()set()name='Tom'; //将字段为id=1001的字段name修改成'Tom' updata()stu()set()name='Tom'()where()id=1001; //将字段为id=1001同时字段name='lisi'的字段name修改成'Tom' updata()stu()set()name='Tom'()where()id=1001()and()name='lisi'; 9、删除表中的数据
全面质量管理的常用方法一 【本讲重点】 排列图 因果分析法 对策表方法 分层法 相关图法 排列图法 什么是排列图 排列图又叫巴雷特图,或主次分析图,它首先是由意大利经济学家巴雷特(Pareto)用于经济分析,后来由美国质量管理专家朱兰(J.M.Juran)将它应用于全面质量管理之中,成为全面质量管理常用的质量分析方法之一。 排列图中有两个纵坐标,一个横坐标,若干个柱状图和一条自左向右逐步上升的折线。左边的纵坐标为频数,右边的纵坐标为频率或称累积占有率。一般说来,横坐标为影响产品质量的各种问题或项目,纵坐标表示影响程度,折线为累计曲线。 排列图法的应用实际上是建立在ABC分析法基础之上的,它将现场中作为问题的废品、缺陷、毛病、事故等,按其现象或者原因进行分类,选取数据,根据废品数量和损失金额多少排列顺序,然后用柱形图表示其大小。因此,排列图法的核心目标是帮助我们找到影响生产质量问题的主要因素。例如,可以将积累出现的频率百分比累加达到70%的因素成为A类因素,它是影响质量的主要因素。 排列图的绘制步骤 排列图能够从任何众多的项目中找出最重要的问题,能清楚地看到问题的大小顺序,能了解该项目在全
体中所占的重要程度,具有较强的说服力,被广泛应用于确定改革的主要目标和效果、调查产生缺陷及故障的原因。因此,企业管理人员必须掌握排列图的绘制,并将其应用到质量过程中去。 一般说来,绘制排列图的步骤如图7-1所示,即:确定调查事项,收集数据,按内容或原因对数据分类,然后进行合计、整理数据,计算累积数,计算累积占有率,作出柱形图,画出累积曲线,填写有关事项。 图7-1 排列图的绘制步骤 排列图的应用实例 某化工机械厂为从事尿素合成的公司生产尿素合成塔,尿素合成塔在生产过程中需要承受一定的压力,上面共有成千上万个焊缝和焊点。由于该厂所生产的十五台尿素合成塔均不同程度地出现了焊缝缺陷,由此对返修所需工时的数据统计如表7-1所示。 表7-1 焊缝缺陷返修工时统计表 序号项目返修工时fi 频率 pi/% 累计频率 fi/% 类别 1焊缝气孔14860.460.4A 2夹渣5120.881.2A 3焊缝成型差208.289.4B 4焊道凹陷15 6.195.5B 5其他11 4.5100C 合计245100 缝成型差、焊道凹陷及其他缺陷,前三个要素累加起来达到了89.4%。根据这些统计数据绘制出如图7-2所示的排列图:横坐标是所列举问题的分类,纵坐标是各类缺陷百分率的频数。
办公软件使用技巧 1.同时保存所有打开的Word文档 有时在同时编辑多个Word文档时,每个文件要逐一保存,既费时又费力,有没有简单的方法呢?在按下Shift键的同时,单击“文件”菜单,大家看,已经多出了“同时保存”和“同时关闭”命令,这可就方便多了 2.巧妙设置文档保护 在用Word 2000/XP打印一份文件时,忽然头儿有要事吩咐,要暂时离开一下,关闭文件吧,既费事又没必要,但又不想辛辛苦苦写的文件被别人破坏了。怎么办呢?执行“工具”菜单中的“保护文档”命令,在弹出的窗口中选择“保护窗体”,然后设上密码。怎么样,光标跑到了文件头,任你怎么移动鼠标、敲击键盘就是无法编辑了,不错吧。等回来时,执行“工具”菜单中的“解除文档保护”命令,一切又正常了。 3.编辑长文件更轻松 相信大家都有这样的经历:在使用Excel、Word编辑长文档时,有时需要将文章开始的多处内容复制到文章末尾。但通过拖动滚动条来回移动非常麻烦,还会出错。其实只要将鼠标移动到滚动条上面的适当位置,发现鼠标指针变成双箭头,此时按住鼠标左键
向下拖动,文档编辑区会被一分为二。你只需在上面编辑区找到文章开头的内容,在下面编辑区找到需要粘贴的位置,这样你就可以复制内容了,而不必来回切换。这种方法特别适合复制相距很远且处数较多的内容。 4.给WPS文档添加水印 先用作图软件(画笔工具等)制作一张色彩非常淡的图片(直接将Word的水印效果图“抓”下来也行),然后打开需要添加水印的WPS文档,执行“格式→页面背景→设置”命令,打开“设置背景”对话框,切换到“图片”标签下,按“选择图片”按钮,选中刚才制作的图片,并进行适当设置后确定,就可以为文档设置上水印了。5.在金山文字中快速打开“页面设置” 在用金山文字2002处理文档时,一个最常用的操作就是设置页面。先执行“视图→标尺→水平(垂直)标尺”命令,展开“水平(垂直)标尺”打开,然后用鼠标在水平(垂直)标尺上双击,即可快速打开“页面设置”对话框,对页面进行设置了。 6.在Excel中插入拼音 在我们使用Excel时,常常会遇到十分孤僻的字,但加上拼音注释就能使人看得更明白。具体的方法是:选中想要加入拼音注释的表格,打开Excel的菜单栏中的“格式”菜单,选中“拼音信息/设置”
这里我们只是演示了一下使用这个框架完成最简单的程序的过程,只起到抛砖引玉的作用。这个框架很复杂,但是功能也很强大,Qt Creator中自带了几个相关的例子(在帮助中查找Graphics View Examples即可),你可以参考一下。因为篇幅问题,我们就只讲这么多,如果以后有机会,我会推出一个相关的专题来讲述这个框架。 分类:Qt系列教程作者: yafeilinux 日期:四月 30th, 2010. 3,006 views Tags: 2D绘图, creator, qt, yafeilinux, 教程
二十一、Qt数据库(一)简介 本文章原创于https://www.wendangku.net/doc/7517069157.html,转载请注明出处。 从今天开始我们学习Qt数据库编程的内容。 先说明:我们以后使用现在最新的基于Qt 4.6.2的Qt Creator 1.3.1 Windows版本,该版本是2010年2月17日发布的。 数据库几乎是每个较大的软件所必须应用的,而在Qt中也使用QtSql模块实现了对数据库的完美支持。我们在Qt Creator的帮助中查找QtSql Module,其内容如下图: 可以看到这个模块是一组类的集合,使用这个模块我们需要加入头文件#include
SQLite数据库的基本操作 main.xml(主布局) android:orientation="vertical">