这篇文章是使用SQLite C/C++接口的一个概要介绍和入门指南。
由于早期的SQLite只支持5个C/C++接口,因而非常容易学习和使用,但是随着SQLite功能的增强,新的C/C++接口
不断的增加进来,到现在有超过150个不同的API接口。这往往使初学者望而却步。幸运的是,大多数SQLite中的C/C++接口是专用的,因而很少被
使用到。尽管有这么多的调用接口,核心的API仍然相对简单和便于调用。本片文章的目的就是为了能够更易于理解SQLite的运作提供基础的知识。
另一篇独立的文档《The SQLite C/C++
Interface》对SQLite中的所有C/C++接口提供了详细的使用说明。一旦读者理解了SQLite的基本操作原理,这篇文档就应当作为一本参
考手册。本篇文章仅仅是SQLite的一个入门介绍,而不是完整和权威性的SQLite API参考指南。
1.0 核心对象和接口
SQL数据库引擎的最主要任务是解析SQL语句。为了达成这个目的,开发者需要了解两个对象:
* 数据库连接对象:sqlite3
* 预处理语句对象:sqlite3_stmt
严格来讲,预处理语句对象并不是必须的,因为能够使用sqlite_exec或者sqlite3_get_table这些便于使用的封装接口,而这些接口封装并隐藏了预处理语句对象。尽管如此,对预处理对象的理解有助 ......
这篇文章是使用SQLite C/C++接口的一个概要介绍和入门指南。
由于早期的SQLite只支持5个C/C++接口,因而非常容易学习和使用,但是随着SQLite功能的增强,新的C/C++接口
不断的增加进来,到现在有超过150个不同的API接口。这往往使初学者望而却步。幸运的是,大多数SQLite中的C/C++接口是专用的,因而很少被
使用到。尽管有这么多的调用接口,核心的API仍然相对简单和便于调用。本片文章的目的就是为了能够更易于理解SQLite的运作提供基础的知识。
另一篇独立的文档《The SQLite C/C++
Interface》对SQLite中的所有C/C++接口提供了详细的使用说明。一旦读者理解了SQLite的基本操作原理,这篇文档就应当作为一本参
考手册。本篇文章仅仅是SQLite的一个入门介绍,而不是完整和权威性的SQLite API参考指南。
1.0 核心对象和接口
SQL数据库引擎的最主要任务是解析SQL语句。为了达成这个目的,开发者需要了解两个对象:
* 数据库连接对象:sqlite3
* 预处理语句对象:sqlite3_stmt
严格来讲,预处理语句对象并不是必须的,因为能够使用sqlite_exec或者sqlite3_get_table这些便于使用的封装接口,而这些接口封装并隐藏了预处理语句对象。尽管如此,对预处理对象的理解有助 ......
这篇文章是使用SQLite C/C++接口的一个概要介绍和入门指南。
由于早期的SQLite只支持5个C/C++接口,因而非常容易学习和使用,但是随着SQLite功能的增强,新的C/C++接口
不断的增加进来,到现在有超过150个不同的API接口。这往往使初学者望而却步。幸运的是,大多数SQLite中的C/C++接口是专用的,因而很少被
使用到。尽管有这么多的调用接口,核心的API仍然相对简单和便于调用。本片文章的目的就是为了能够更易于理解SQLite的运作提供基础的知识。
另一篇独立的文档《The SQLite C/C++
Interface》对SQLite中的所有C/C++接口提供了详细的使用说明。一旦读者理解了SQLite的基本操作原理,这篇文档就应当作为一本参
考手册。本篇文章仅仅是SQLite的一个入门介绍,而不是完整和权威性的SQLite API参考指南。
1.0 核心对象和接口
SQL数据库引擎的最主要任务是解析SQL语句。为了达成这个目的,开发者需要了解两个对象:
* 数据库连接对象:sqlite3
* 预处理语句对象:sqlite3_stmt
严格来讲,预处理语句对象并不是必须的,因为能够使用sqlite_exec或者sqlite3_get_table这些便于使用的封装接口,而这些接口封装并隐藏了预处理语句对象。尽管如此,对预处理对象的理解有助 ......
今天的学习内容是sqlite和PDO mysql。
用自己的话说说两个东西吧:
sqlite算是一种不系统的数据库存储方式,它的存放格式是一个.db后缀的文件,在php中它存放在当前的目录下,貌似不用用户名密码,安全性较低,却比较方便。PHP5中自带的一些系统函数,都是以sqlite_开头的。
PDO全称PHP Data Object,顾名思义就是PHP的一种系统对象?在操作用也是以一个类为开始。类似mysql的方式。
主要摘录一下函数吧:
1. sqlite:
$db = sqlite_open("php100.db");
$sql = "select * from test";
$result = sqlite_query($db,$sql);
$row = sqlite_fetch_array($result);
print_r($row);
2. PDO mysql:
$db = new PDO("mysql:host=localhost;dbname=student",'root','');
$rs = $db->query("SELECT * from testmem");
while($row = $rs->fetch()){
print_r($row);
echo "<hr size=1>";
} ......
今天的学习内容是sqlite和PDO mysql。
用自己的话说说两个东西吧:
sqlite算是一种不系统的数据库存储方式,它的存放格式是一个.db后缀的文件,在php中它存放在当前的目录下,貌似不用用户名密码,安全性较低,却比较方便。PHP5中自带的一些系统函数,都是以sqlite_开头的。
PDO全称PHP Data Object,顾名思义就是PHP的一种系统对象?在操作用也是以一个类为开始。类似mysql的方式。
主要摘录一下函数吧:
1. sqlite:
$db = sqlite_open("php100.db");
$sql = "select * from test";
$result = sqlite_query($db,$sql);
$row = sqlite_fetch_array($result);
print_r($row);
2. PDO mysql:
$db = new PDO("mysql:host=localhost;dbname=student",'root','');
$rs = $db->query("SELECT * from testmem");
while($row = $rs->fetch()){
print_r($row);
echo "<hr size=1>";
} ......
SQLite支持的编译指令(pragma)
PRAGMA命令
是用于修改SQlite库或查询SQLite库内部数据(non-table)的特殊命令。PRAGMA 命令使用与其它SQLite命令(e.g. SELECT, INSERT)相同的接口,但在如下重要方面与其它命令不同:
在未来的SQLite版本中部分pragma可能被删除或添加,小心使用。
当使用未知的pragma语句时不产生报错。未知的pragma仅仅会被忽略,即是说若是打错了pragma语句SQLite不会提示用户。
一些pragma在SQL编译阶段生效而非执行阶段。即是说若使用C语言的sqlite3_compile(),
sqlite3_step(), sqlite3_finalize() API
(或类似的封装接口中),pragma可能在调用sqlite3_compile()期间起作用。
pragma命令不与其它SQL引擎兼容。
可用的pragma命令有如下四个基本类型:
用于察看当前数据库的模式
。
用于修改SQLite库的操作
或查询当前的操作模式。
用于查询或修改两个数据库的版本号
,schema-version和user-version.
用于调试库
和校验数据库文件。
PRAGMA命令语法
sql-statement
::=
PRAGMA
name
[=
value
]
|
PRAGMA
function
(
arg
)
使用整数值value
的pragma也可以使用符号表示,字符串"on
", &q ......
//插入及更新操作
int nRet = 0;
sqlite3 * db = NULL;
CString strFilePath; //数据库存储路径
//路径赋值(省略)
//连接数据库
nRet = sqlite3_open16(strFilePath, &db); //有几个打开函数可供调用,使用WCHAR类型路径用这个
if(nRet != SQLITE_OK)
{
LogD(_Q_D,L"数据库打开失败");
return -4;
}
CString strSQLSentence;
char *szSQLSentence = NULL;
组织SQL语句
**********************
{
//更新操作
strSQLSentence.Format(L"update tbl_ad set AD_TITLE='%s', AD_INFO='%s', BEGIN_TIME='%s', END_TIME='%s' where AD_ID='%s';", strADTitle, strADInfo, strADBeginTime, strADEndTime, strADId);
}
{
//插入操作
strSQLSentence.Format(L"insert into tbl_Advertisement values('%s','%s','%s','%s','%s');", strADId, strADTitle, strADInfo, strADBeginTime, strADEndTime);
}
**********************
//将SQL语句转换成sqlite函数能执行的UTF8格式
......
1 TOP
这是一个大家经常问到的问题,例如在SQLSERVER中可以使用如下语句来取得记录集中的前十条记录:
SELECT TOP 10 * from [index] ORDER BY indexid DESC;
但是这条SQL语句在SQLite中是无法执行的,应该改为:
SELECT * from [index] ORDER BY indexid DESC limit 0,10;
其中limit 0,10表示从第0条记录开始,往后一共读取10条
2 创建视图(Create View)
SQLite在创建多表视图的时候有一个BUG,问题如下:
CREATE VIEW watch_single AS SELECT DISTINCTwatch_item.[watchid],watch_item.[itemid] from watch_item;
上面这条SQL语句执行后会显示成功,但是实际上除了
SELECT COUNT(*) from [watch_single ] WHERE watch_ single.watchid = 1;
能执行之外是无法执行其他任何语句的。其原因在于建立视图的时候指定了字段所在的表名,而SQLite并不能正确地识别它。所以上面的创建语句要改为:
CREATE VIEW watch_single AS SELECT DISTINCT [watchid],[itemid] from watch_item;
但是随之而来的问题是如果是多表的视图,且表间有重名字段的时候该怎么办?
3 COUNT(DISTINCT column)
SQLite在执行如下语句的时候会报错:
SELECT COUNT(DISTINCT watchid) fr ......
1 TOP
这是一个大家经常问到的问题,例如在SQLSERVER中可以使用如下语句来取得记录集中的前十条记录:
SELECT TOP 10 * from [index] ORDER BY indexid DESC;
但是这条SQL语句在SQLite中是无法执行的,应该改为:
SELECT * from [index] ORDER BY indexid DESC limit 0,10;
其中limit 0,10表示从第0条记录开始,往后一共读取10条
2 创建视图(Create View)
SQLite在创建多表视图的时候有一个BUG,问题如下:
CREATE VIEW watch_single AS SELECT DISTINCTwatch_item.[watchid],watch_item.[itemid] from watch_item;
上面这条SQL语句执行后会显示成功,但是实际上除了
SELECT COUNT(*) from [watch_single ] WHERE watch_ single.watchid = 1;
能执行之外是无法执行其他任何语句的。其原因在于建立视图的时候指定了字段所在的表名,而SQLite并不能正确地识别它。所以上面的创建语句要改为:
CREATE VIEW watch_single AS SELECT DISTINCT [watchid],[itemid] from watch_item;
但是随之而来的问题是如果是多表的视图,且表间有重名字段的时候该怎么办?
3 COUNT(DISTINCT column)
SQLite在执行如下语句的时候会报错:
SELECT COUNT(DISTINCT watchid) fr ......
我现在使用的是Datalogic 的memor扫描器(intel XScale PXA255@200MHz,系统内存 64M,系统闪存
128M),操作系统为WinCE
5.0,数据库为Sqlite3,在.net环境下面有没有可内将一个20万行数据的txt文件读出并写到Sqlite数据库中?
我现在的做法是:逐行读出文件内容,分割数据后作为参数,用dc.Parameters.add()方法加入SQLiteCommand的insert语句中,等文件全部读完用一个事务提交,现在最快的速度是7分多钟,哪位高手有没有更加高效的方法,能在5分钟内完成?
我的代码如下:
SQLiteCommand dc = ss.CreateCommand();
dc.CommandText = "insert into tests values (?,?,?,?)";
SQLiteParameter dp1 = dc.CreateParameter();
SQLiteParameter dp2 = dc.CreateParameter();
SQLiteParameter dp3 = dc.CreateParameter() ......