SQLite是一个跨平台,支持多种语言,开源的轻量级数据库,可以
作为Access的一个替代方案。
官方网站:
本文中的简单应用使用Windows下的C++语言。
1.下载SQLite
SQLite command-line Tools:
/sqlite-3_6_22.zip
SQLite library DLL:
/sqlitedll-3_6_22.zip
只有dll和def文件,需要用工具生成.lib文件:
可以使用命令:LIB /DEF:sqlite3.def /machine:IX86
头文件sqlite3.h可以从SQLite的源码中复制过来。
SQLite本身不需要安装,可以直接使用。
源码下载地址:
/sqlite-source-3_6_22.zip
SQLite文档下载地址:
/sqlite_docs_3_6_22.zip
第三方的SQLite管理软件SharpPlus SQLite Developer:
http://www.sqlitedeveloper.com/downloads/SqliteDev361.zip
2.创建一个数据库
可以使用SQLite Developer创建,操作方法如同其他DBMS一致。
表结构如下:
Create TABLE "Users"(
ID integer Primary Key AUTOINCREMENT
,UserName
,NickName
)
3.在C++中操作该数据库
#include
#include "sqlite3.h"
#pragma comment(lib,"sqlite3.lib")
static int _sql_callback(void * notused, int argc,
char ** argv, char ** szColName)
{
for (int i=0; i < argc; i++ )
{
printf( "%s = %s\n", szColName[i],
argv[i] == 0 ? "NULL" : argv[i] );
}
return 0;
}
int main()
{
sqlite3* db=NULL;
//连接数据库
int ret=sqlite3_open("./UserInfo.db",&db);
if(ret!=SQLITE_OK)
{
printf("无法打开数据库:%s.\n",sqlite3_errmsg(db));
return(1);
}
char *pErrMsg=NULL;
char *szSql="Select * from Users";
sqlite3_exec(db,szSql,_sql_callback,0,&pErrMsg);
if(ret!=SQLITE_OK)
{
printf("SQL error:%s\n",pErrMsg);
sqlite3_free(pErrMsg);
}
sqlite3_close(db);
return 0;
}
执行结果:
ID = 1
UserName = dgx_lsyd3
NickName = 淡月清风
ID = 2
UserName = testUserName
NickName = testNickName
4.用.Net操作数据库
需要安装Provider:"System.Data.SQLite"。
下载地址:
|
文件: |
sqlite-3_6_22.zip |
大小: |
254KB |
下载: |
下载 | |
SQLite在VC下的使用(转)
一、SQLite简介
SQLite 是用C语言编写的开源数据库,主要用于嵌入式,你也可以把它集成在自己的桌面程序中,也有人将其替代Access,用作后台数据库。
SQLite 支持多数SQL92标准,例如:索引、限制、触发和查看支持。
支持 NULL、INTEGER、REAL、TEXT 和 BLOB 数据类型,支持事务。
二、下载SQLite
SQLite可以到官方站点下载
/download.html
包括:Linux,Mac OS X, Windows下的已编译文件以及源代码、帮助文档。
VC中使用sqlite
SQLite官方下载只提供给我们一个sqlite3.dll跟一个sqlite3.def文件,并没有提供用于VC++6.0的lib文件,可以利用sqlite3.def文件生成,步骤如下:
1.将sqlite3.h(D:\sqlite-amalgamation-3_6_23.zip)拷贝到C:\Program Files\Microsoft Visual Studio\VC98\Include目录下,这时编译可通过,但链接错误,因为没有LIB文件()
2.启动一个命令行程序,进入VC的安装目录C:\Program Files\Microsoft Visual Studio\VC98\Bin,在这个目录下面有一个LIB.exe文件,使用它就能生成sqlite3.lib文件,将sqlite3.def文件放到相同目录,或者绝对路径也可以, 然后在命令行输入如下命令:
LIB /MACHINE:IX86 /DEF:sqlite3.def
该命令生成两个文件:sqlite3.lib和sqlite3.exp
运行该命令时,如果提示找不到MSPDB60.DLL文件,可从其它目录拷贝至Bin目录下
3.将生成的sqlite3.lib拷贝到Lib目录下,将sqlite3.dll拷贝到C:\WINNT\system32目录下
4.将sqlite3.lib加入到工程链接中,Project->Settings,Link选项卡,Object/library modules最后添入sqlite3.lib
D:\sqlitedll-3_6_23里有.dll和.def文件
生成的lib在bin下
这时以下程序便可通过VC编译链接并运行:
#include
#include
#include
int column_names_printed = 0;
void print_row(int n_values, char** values)
{
int i;
for (i = 0; i < n_values; ++i) {
printf("%10s", values[i]);
}
printf("\n");
}
int print_result(void* data, int n_columns, char** column_values, char** column_names)
{
if (!column_names_printed) {
print_row(n_columns, column_names);
column_names_printed = 1;
}
print_row(n_columns, column_values);
return 0;
}
int main()
{
sqlite3 *db=NULL;
char *errMsg = NULL;
int rc;
rc = sqlite3_open("test.db", &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
exit(1);
}
else printf("open test.db successfully!\n");
rc = sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, NULL);
rc = sqlite3_exec(db, "CREATE TABLE students(number varchar(10), name varchar(10), \
sex varchar(6), age varchar(2));", NULL, NULL, NULL);
rc = sqlite3_exec(db, "INSERT INTO students VALUES('00001', 'Mary', 'female', '15');\
INSERT INTO students VALUES('00002', 'John', 'male', '16');\
INSERT INTO students VALUES('00003', 'Mike', 'male', '15');\
INSERT INTO students VALUES('00004', 'Kevin', 'male', '17');\
INSERT INTO students VALUES('00005', 'Alice', 'female', '14');\
INSERT INTO students VALUES('00006', 'Susan', 'female', '16');\
INSERT INTO students VALUES('00007', 'Christina', 'female', '15');\
INSERT INTO students VALUES('00008', 'Brian', 'male', '16');\
INSERT INTO students VALUES('00009', 'Dennis', 'male', '14');\
INSERT INTO students VALUES('00010', 'Daphne', 'female', '18');",
NULL, NULL, &errMsg);
column_names_printed = 0;
rc = sqlite3_exec(db, "SELECT students.* FROM students WHERE sex='female';", print_result, NULL, &errMsg);
column_names_printed = 1;
printf("\n");
column_names_printed = 0;
rc = sqlite3_exec(db, "SELECT students.* FROM students WHERE sex='male';", print_result, NULL, &errMsg);
column_names_printed = 1;
rc = sqlite3_exec(db, "COMMIT TRANSACTION;", NULL, NULL, NULL);
printf("error code: %d\n", rc);
printf("error message: %s\n", errMsg);
sqlite3_close(db);
return 0;
}
另外,在vc下编译sqlite源代码,出现can not find tcl.h 可以 去掉tclsqlite.c或者在这个文件前面添加#define NO_TCL 去掉tcl的支持
三、SQLite的简单使用
3.1 建立数据库
C:\sqlite-3_6_11> sqlite3.exe dbname.db
sqlite3.exe后面跟数据库文件名,它是进入编译阶段的入口指令
3.2 创建数据表
sqlite> create table users(userid varchar(20) PRIMARY KEY,
...> age int,
...> birthday datetime);
3.3 添加记录
insert into users values('wang',20,'1989-5-4');
insert into users values('li',22,'1987-11-16');
3.4 查询记录
select * from users order by birthday;
3.5 删除记录
delete from users where userid='wang';
3.6 退出sqlite
sqlite> .exit
SQLite数据库的数据结构是存贮在 "sqlite_master" 表中
具体命令可以输入 .help查看或参考帮助文档
四、编译LIB
需要到SQLite网站下载sqlitedll-3_6_11.zip,以VS 2008为例:
在DOS命令行下:
PATH = D:\Program Files\Microsoft Visual Studio 9.0\VC\bin;%PATH%
PATH = D:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;%PATH%
LIB /DEF:sqlite3.def /machine:IX86
by in ,
最近使用较多,这东西现在是越用越着迷,不管是工作或者个人自娱自乐写东西,只要有数据存储首先就想到了,我一直对C/S模式的数据存储很反感,记得在知道之前的很长一段时间里一直用的是xml来存数我的数据,我喜欢将数据存储在单一文件里,我可以随时把数据带在身上,而且它们兼容性够好,拿着数据文件到那里都能用,哪怕是在嵌入式系统里照样玩儿的转…
SQLite特性
- ACID事务
- 零配置 – 无需安装和管理配置
- 储存在单一磁盘文件中的一个完整的数据库
- 数据库文件可以在不同字节顺序的机器间自由的共享
- 支持数据库大小至2TB
- 足够小, 大致3万行C代码, 250K
- 比一些流行的数据库在大部分普通数据库操作要快
- 简单, 轻松的API
- 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定
- 良好注释的源代码, 并且有着90%以上的测试覆盖率
- 独立: 没有额外依赖
- Source完全的Open, 你可以用于任何用途, 包括出售它
- 支持多种开发语言,C, PHP, Perl, Java, ASP.NET,Python
Sqlite安装
现在各大Linux发型版均有现成的软件包可供安装,而且大部份系统都是自带有的,想确认系统里有没有运行下
$sqlite3
非Linux系统到:下载安装
接下来就是sqlite命令行工具的使用
打开或创建数据库
$sqlite3 test.db3
这样就能打开或者创建一个新的数据库文件
$sqlite3 test.db3
SQLite version 3.6.23
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
它看起来就是这个样子
SQlite内置命令
它除了能执行SQL语句以外还提供一组内置的命令,它们是以点.开始,比如说查看帮助信息就是 .help退出是 .exit 跟 .quit
创建表
在命令行里大部份的SQL语句它都是支持的,现在来新建两个表
sqlite>create table Artists (
--->ArtistID INTEGER PRIMARY KEY,
--->ArtistName TEXT);
sqlite 对SQL语句大小写不敏感,所以大写小写随便
sqlite>create table CDs (
--->CDID INTEGER PRIMARY KEY,
--->ArtistID INTEGER NOT NULL,
--->Title TEXT NOT NULL,
--->Date TEXT);
这里注意,除了INTEGER PRIMARY KEY其它字段是都可以是无类型的,也就是不关声明什么或者不声明,这个字段是可以存储任何数据的。
插入数据
sqlite>insert into Artists (ArtistID,ArtistName) values (NULL,'Peter Gabriel');
sqlite>insert into Artists (ArtistID,ArtistName) values (NULL,'Bruce Hornsby');
sqlite>insert into Artists (ArtistID,ArtistName) values (NULL,'Lyle Lovett');
sqlite>insert into Artists (ArtistID,ArtistName) values (NULL,'Beach Boys');
sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,1,'So','1984');
sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,1,'Us','1992');
sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,2,'The Way It Is','1986');
sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,2,'Scenes from the Southside','1990');
sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,1,'Security','1990');
sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,3,'Joshua Judges Ruth','1992');
sqlite>insert into CDs (CDID,ArtistID,Title,Date) values (NULL,4,'Pet Sounds','1966');
sqlite是支持导入sql文件的,只要使用内置命令.read即可,比如说我们将以上的命令建成一个sql文件,命名为insert_table.sql
insert into Artists (ArtistID,ArtistName) values (NULL,’Peter Gabriel’);
insert into Artists (ArtistID,ArtistName) values (NULL,’Bruce Hornsby’);
insert into Artists (ArtistID,ArtistName) values (NULL,’Lyle Lovett’);
insert into Artists (ArtistID,ArtistName) values (NULL,’Beach Boys’);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,1,’So’,’1984′);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,1,’Us’,’1992′);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,2,’The Way It Is’,’1986′);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,2,’Scenes from the Southside’,’1990′);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,1,’Security’,’1990′);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,3,’Joshua Judges Ruth’,’1992′);
insert into CDs (CDID,ArtistID,Title,Date) values (NULL,4,’Pet Sounds’,’1966′);
接着在命令行里运行
sqlite>.read insert_table.sql
表查询
来看看现在这两张表里都有那些内容,执行
sqlite>select * from Artists;
和
sqlite>select * from CDs;
如果要同时看表头,请在运行查询语句前打开headers选项
sqlite>.headers ON
输出结果看起来应该是这样子
ArtisID|ArtistName
1 |Peter Gabriel
2 |Bruce Hornsby
3 |Lyle Lovett
4 |Beach Boys
和
CDID|ArtisID|Title |Date
1 |1 |So |1984
2 |1 |Us |1992
3 |2 |The Way It Is |1986
4 |2 |Scenes from the Southside|1990
5 |1 |Security |1990
6 |3 |Joshua Judges Ruth |1992
7 |4 |Pet Sounds |1966
其它的一些查询语句
sqlite>SELECT Title AS AlbumName FROM CDs;
sqlite>SELECT Title FROM CDs WHERE Date>=1990 ORDER BY Title;
sqlite>SELECT Date FROM CDs;
sqlite>SELECT DISTINCT Date FROM CDs;
sqlite>SELECT Title FROM CDs GROUP BY ArtistID;
多表查询
执行
sqlite>SELECT t1.ArtistName,CDs.Title FROM Artists t1, CDs WHERE t1.ArtistID=CDs.ArtistID
得到的结果
ArtistName |Title
Peter Gabriel|So
Peter Gabriel|Us
Peter Gabriel|Security
Bruce Hornsby|The Way It Is
Bruce Hornsby|Scenes from the Southside
Lyle Lovett |Joshua Judge Ruth
Beach Boys |Pet Sounds
更新字段
插入一条数据
sqlite>insert into Artists (ArtistID,ArtistName) values (NULL,'Supernatural');
如果要更改歌手名字为Santana
sqlite>UPDATE Artists SET ArtistName ='Santana' WHERE ArtistID=5;
即可
删除字段
首先执行
sqlite>select * FROM CDs WHERE Title LIKE 'Super%';
看看是不是想要删除的数据,是的话执行
sqlite>DELETE FROM CDs WHERE Title LIKE 'Super%';
再运行
sqlite>select * FROM CDs WHERE Title LIKE 'Super%';
看看是不是已经删除了?
如果嫌上面的命令行不够直观高效,而你又非常喜欢多用鼠标,那么推荐你安装这个Firefox扩展程序,它真的非常方便。
SQLite 3 导入导出操作
2009-06-09 10:41
SQLite 3 导入导出操作
平时使用官方提供的sqlite3.exe工具来操作 sqlite的数据库 进入管理: sqlite3.exe d:\\test.db //假设数据是 d:\\test.db >.databases //显示所有数据库 和 mysql的 show databases; >.tables //显示当前数据库的表格 和 mysql 的show tables; >.schment tablename; //显示表格结构 和mysql的 SHOW CREATE TABLE tbl_name >.output c:\\\\1.sql //导出当前数据库的 sql语句 和mysql的 mysqldump >.dump >.import c:\\\\1.sql //导入 //mysql 用source =================== 导入 命令: .import sqlite> .import 文件名 表名 注1: 不要忘了开头的点 注2: 这条语句不能用分号结束. 非SQL不需要分号结束. 注3: 需要查看默认的分隔符separator. 必须一致. 如果不一致可能导致sqlite字段分割错误. 查看分隔符使用命令 .show , 如果不一致可直接修改, 比如: sqlite>.separator "," 将分隔符转为逗号. 举例1: 将文件a.csv中的数据导入表 tab_xx. (a.csv中字段以逗号分割) sqlite> .separator "," sqlite> .import a.csv tab_xx sqlite> 导入结束.
导出 实现方式: 将输出重定向至文件. 命令: .output sqlite> .output a.txt 然后输入sql语句, 查询出要导的数据. 查询后,数据不会显示在屏幕上,而直接写入文件. 结束后,输入 sqlite> .output stdout 将输出重定向至屏幕. 举例2: 将 tab_xx 中的数据导出到文件a.txt sqlite> .output a.txt sqlite> select * from tab_xx; sqlite> .output stdout 导出完毕.
//打开mdb数据库 OleDbConnection mdbConn = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:英汉字库.mdb"); mdbConn.Open(); OleDbDataAdapter mdbDa = new OleDbDataAdapter("select * from English",mdbConn); DataSet mdbDs = new DataSet(); mdbDa.Fill(mdbDs,"English"); //打开sqlite数据库 SQLiteConnection sqliteConn = new SQLiteConnection("Data Source=database.db;New=True;Compress=True;Version=3"); sqliteConn.Open(); //建表 SQLiteCommand sqliteCmd = sqliteConn.CreateCommand(); sqliteCmd.CommandText = "CREATE table English (English varchar(50) Primary Key,Chinese varchar(50),Phonetic varchar(50))"; sqliteCmd.ExecuteNonQuery(); //插入数据 SQLiteDataAdapter sqliteDa = new SQLiteDataAdapter("select * from English", sqliteConn); SQLiteCommandBuilder sqliteCb = new SQLiteCommandBuilder(sqliteDa); DataSet sqliteDs = new DataSet(); sqliteDa.Fill(sqliteDs,"English"); Console.WriteLine(sqliteDs.Tables["English"].Rows.Count); Console.WriteLine(mdbDs.Tables["English"].Rows.Count); foreach(DataRow dr in mdbDs.Tables["English"].Rows) { DataRow sqliteDr = sqliteDs.Tables["English"].NewRow(); sqliteDr[0] = dr["english"]; sqliteDr[1] = dr["chinese"]; sqliteDr[2] = dr["phonetic"]; sqliteDs.Tables["English"].Rows.Add(sqliteDr); } sqliteDa.Update(sqliteDs,"English");
2. 用 SqliteManager 或者 SqliteAdmin 工具可以导入分隔符数据或者excel数据。 |
转载自
http://blog.chinaunix.net/u/10686/showart_585970.html 使用sqlite的文件导入导出功能
导入
命令: .import
sqlite> .import 文件名 表名
注1: 不要忘了开头的点
注2: 这条语句不能用分号结束. 非SQL不需要分号结束.
注3: 需要查看默认的分隔符separator. 必须一致. 如果不一致可能导致sqlite字段分割错误.
查看分隔符使用命令 .show , 如果不一致可直接修改, 比如:
sqlite>.separator ","
将分隔符转为逗号.
举例1:
将文件a.csv中的数据导入表 tab_xx. (a.csv中字段以逗号分割)
sqlite> .separator ","
sqlite> .import a.csv tab_xx
sqlite>
导入结束.
导出
实现方式: 将输出重定向至文件.
命令: .output
sqlite> .output a.txt
然后输入sql语句, 查询出要导的数据. 查询后,数据不会显示在屏幕上,而直接写入文件.
结束后,输入
sqlite> .output stdout
将输出重定向至屏幕.
举例2:
将 tab_xx 中的数据导出到文件a.txt
sqlite> .output a.txt
sqlite> select * from tab_xx;
sqlite> .output stdout
导出完毕.
用SQLiteManager修改SQLite表结构的问题及解决 |
|
作者:wuxingblog 来源:Internet 时间:2006-4-28 【 字体: 】 〖 双击滚屏 〗 |
|
|
|
用SQLiteManager在表结构页面做添加列,修改主键,索引,修改默认值一些修改SQLite表结构的操作的时候.不能对表格本有的一些其它信息进行保存。比如主键信息,默认值信息,自动增长等信息都会丢失,因而导致数据插不进去,如果没有及时发现问题,继续操作,甚至会导致数据的损坏。
本文强烈建议,在进行没有把握或者数据表结构变动等动作比较大的的操作的时候,请先备份数据库。难免造成难以挽回的损失。
本文的解决跟前面的对SQLiteManager的中文问题的解决不同,本文没有提供程序上的BUG修复。一是时间上的问题,二是SQLiteManager又发布了新版,我不可能跟在其后来修改程序,我把问题已经提交给了SQLiteManager原作者,希望他能给我们一个很好的解决方案。
本文的方法可以为修改数据表结构提供参考,也可以为对表结构已经损坏(如默认字段丢失,主键丢失,自动增长字段信息丢失)等的数据来进行修复。
方法是用MySQL 的SQL语言格式来新写一个新建表格的查询,生成原有的表结构信息,并加上你想要的字段和关系,MySQL的工具支持比较多(EMS MySQL Manager,PhpMyAdmin都是有名的工具,很好用,功能也很强大),而且SQL语句功能也更加强大,而又能获得SQLiteManager的支持。
示范如下:
CREATE TABLE `lm_content` (
`id` int(10) NOT NULL auto_increment,
`title` varchar(100) NOT NULL default '',
`title_alias` varchar(100) NOT NULL default '',
`introtext` text,
`bodytext` text,
`sectionid` int(11) NOT NULL default '0',
`mask` int(11) NOT NULL default '0',
`catid` int(11) NOT NULL default '0',
`created` varchar(20) NOT NULL default '',
`modified` varchar(20) NOT NULL default '',
`created_by` int(11) NOT NULL default '0',
`created_by_alias` varchar(100) NOT NULL default '',
`published` int(1) NOT NULL default '0',
`frontpage` int(1) NOT NULL default '0',
`ordering` int(11) default NULL,
`metakey` text,
`metadesc` text,
`access` int(11) NOT NULL default '0',
`hits` int(11) NOT NULL default '0',
`image` varchar(100) default NULL,
`image_position` varchar(10) default NULL,
`recorank` int(11) default NULL,
PRIMARY KEY (`id`)
)
SQLiteManager能很好地支持MySQL 的SQL语句。最好不要用SQLiteManager 来新建表格,因为有些信息,如自动增长字段的信息没法设置。然后通过SQLiteManager的Operation下面的复制数据(注意只复制数据,不复制结构!)一项,把原来的数据复制到新表中。
然后确定数据复制成功,表结构无误后,就将原来的表格删除,再将新建好的表格重命名为原来表格的名字,命名操作也在选中表格后的Operation下。
这个小技巧就介绍完了,我的感想是如果能多学点东西,并融会贯通地使用,会为你的工作带来极大的方便! | |