Qt之操作数据库(SQLite)
SQLite
简介
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至今已经有12个年头,SQLite也迎来了一个版本SQLite3已经发布。
SQLite的功能
SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库,它支持的SQL包括:
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
COPY
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INSERT
ON CONFLICT clause
PRAGMA
REPLACE
ROLLBACK TRANSACTION
SELECT
UPDATE
同时它还支持事务处理功能等等。也有人说它象Microsoft的Access,有时候真的觉得有点像,但是事实上它们区别很大。比如SQLite 支持跨平台,操作简单,能够使用很多语言直接创建数据库,而不象Access一样需要Office的支持。如果你是个很小型的应用,或者你想做嵌入式开发,没有合适的数据库系统,那么现在你可以考虑使用SQLite。目前它的最新版本是3.7.8。它的官方网站是:http://www.sqlite.org或者http://www.sqlite .com .cn,能在上面获得源代码和文档。同时因为数据库结构简单,系统源代码也不是很多,也适合想研究数据库系统开发的专业人士。
SQLite的特性
下面是访问SQLite官方网站: http://www.sqlite. org/ 时第一眼看到关于SQLite的特性.
1. ACID事务
2. 零配置 – 无需安装和管理配置
3. 储存在单一磁盘文件中的一个完整的数据库
4. 数据库文件可以在不同字节顺序的机器间自由的共享
5. 支持数据库大小至2TB
6. 足够小,大致3万行C代码,250K
7. 比一些流行的数据库在大部分普通数据库操作要快
8. 简单,轻松的API
9. 包含TCL绑定,同时通过Wrapper支持其他语言的绑定
10. 良好注释的源代码, 并且有着90%以上的测试覆盖率
11. 独立: 没有额外依赖
12. Source完全的Open,你可以用于任何用途,包括出售它
13. 支持多种开发语言,C、PHP、Perl、Java、C#、Python
SQLite类型
SQLite的数据类型
首先你会接触到一个让你惊讶的名词:Typelessness(无类型).对! SQLite是无类型的.这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中,无论这列声明的数据类型是什么(只有在一种情况下不是, 稍后解释).对于SQLite来说对字段不指定类型是完全有效的. 如:
Create Table ex1(a, b, c);
诚然SQLite允许忽略数据类型,但是仍然建议在你的Create Table语句中指定数据类型.因为数据类型对于你和其他的程序员交流,或者你准备换掉你的数据库引擎时能起到一个提示或帮助的作用.SQLite支持常见的数据类型,如:
CREATE TABLE ex2(
a VARCHAR(10),
b NVARCHAR(15),
c TEXT,
d INTEGER,
e FLOAT,
f BOOLEAN,
g CLOB,
h BLOB,
i TIMESTAMP,
j NUMERIC(10,5)
k VARYING CHARACTER (24),
l NATIONAL VARYING CHARACTER(16)
);
前面提到在某种情况下,SQLite的字段并不是无类型的.即在字段类型为”Integer Primary Key”时.
如何连接SQLite?
用PHP操作sqlite数据库
a、 如何连接sqlite数据库?
if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
select * from sqlite_master;
echo "数据库连接成功!n
";
} else {
die($sqliteerror);
}
b、 如何列出数据库中所有的表?
if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
$result = sqlite_array_query($db, 'select * from sqlite_master;');
foreach ($result as $entry) {
echo 'talbe name='.$entry['name']."
n";
echo 'sql='.$entry['sql']."
n";
echo "
--------------------------------------------------------------------------------
";
}
sqlite_close($db);
} else {
die($sqliteerror);
}}
c、 对sqlite数据库的查询,以及结果集的显示
if ($db = sqlite_open('mysqlitedb', 0666, $sqliteerror)) {
$result = sqlite_array_query($db, 'select name, email from user ', SQLITE_ASSOC);
echo "user表查询结果:
n";
echo " n name email
n";
foreach ($result as $entry) {
echo ' '.$entry['name']." " $entry['email']."
n";
}
echo ' ';
sqlite_close($db);
} else {
die($sqliteerror);
}
d、 数据库对象记录的增加、删除、修改
sqlite_query($db, "INSERT INTO user VALUES('user".$i."'" ",'user".$i."@ hichina. com')");
sqlite_query($db, "delete from user where user=’user99’");
sqlite_query($db, 'UPDATE user SET email="lilz@ hichina .com" where name="user1"');
用JAVA操作SQLite
开发所需依赖
先下载SQLite数据库的驱动包
将下载到的包解压后得到jar包sqlitejdbc-v033-nested.jar放到%JAVA_HOME%\lib 下,并且将其添加到classpath系统环境变量中,我的classpath系统环境变量现在为:
.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\lib\sqlitejdbc-v033-nested.jar
在你的代码中引用这个驱动:
Class.forName("org.sqlite.JDBC");
Connection conn = DriverManager.getConnection("jdbc:sqlite:filename");//filename为你的SQLite数据名称
// ... use the database ...
conn.close();
或者在编写代码的时候进行外部jar包的导入。步骤:右击工程->Build Path->Config Build Path->Libraries->Add External Jars选择你要导入的SQLite的jar包
示例代码
package wang.liang;
import java.sql.*;
public class TestSQLite {
public static void main(String[] args) {
try {
Class.forName("org.sqlite.JDBC");//连接SQLite的JDBC
//建立一个数据库名testSQLite.db的连接,如果不存在就目录下创建之
Connection conn =DriverManager.getConnection("jdbc:sqlite://E:/Program code/SQLite code/testSQLite.db");
Statement stat = conn.createStatement();
//创建一个表,两列
stat.executeUpdate("create table table1(name varchar(20), salary int);");
//插入数据
stat.executeUpdate("insert into table1 values('ZhangSan',6000);"); stat.executeUpdate("insert into table1 values('LiSi',7800);");
stat.executeUpdate("insert into table1 values('WangWu',8800);");
stat.executeUpdate("insert into table1 values('ZhaoLiu',9000);");
ResultSet rs = stat.executeQuery("select * from table1;");//查询数据
while(rs.next()){//将查询到的数据打印出来
System.out.print("name = "+ rs.getString("name")+" ");//列属性一
System.out.println("salary = "+ rs.getString("salary"));//列属性二
}
rs.close();
conn.close();//结束数据库的连接
}
catch(Exception e ) {
e.printStackTrace();
}
}
}
总结:本文介绍了嵌入式数据库SQLite在Java中的应用,通过创建表、插入数据、查询等操作介绍了在Java中对数据库的操纵。
用C、C++操作SQLite
核心对象和接口
SQL数据库引擎的最主要任务是解析SQL语句。为了达成这个目的,开发者需要了解两个对象:
* 数据库连接对象:sqlite3
* 预处理语句对象:sqlite3_stmt
严格来讲,预处理语句对象并不是必须的,因为能够使用sqlite_exec或者sqlite3_get_table这些便于使用的封装接口,而这些接口封装并隐藏了预处理语句对象。尽管如此,对预处理对象的理解有助于我们更充分的使用SQLite。
数据库连接对象和预处理对象是由下列的一组C/C++接口调用操纵的:
* sqlite3_open()
* sqlite3_prepare()
* sqlite3_step()
* sqlite3_column()
* sqlite3_finalize()
* sqlite3_close()
这6个C/C++接口例程和上述的两个对象构成了SQLite的核心功能。开发者对于它们的理解能够更好的使用SQLite。
注意,这个接口例程列表更多是概念上的意义而不是实际的接口。许多这些接口都出现在各个版本之中。例如,上述列表中的sqlite3_open()例程实际上有三个不同的接口以略微不同的方式实现相同的功能:slqite3_open(),sqlite3_open16()和sqlite3_open_v2()。列表中的实际上并不存在sqlite3_column()这个接口。显示在列表中的“sqlite3_column()”仅仅是一个占位,表示一整套用于从表中查询出各种数据类型的列记录接口。
这里说明下核心接口的主要功能:
sqlite3_open() 该接口打开与一个SQLite数据库文件的连接并返回一个数据库连接对象。这通常是应用程序调用的第一个SQLite API接口而且也是调用其他SQLite API接口前需要调用的接口。许多SQLite接口需要一个指向数据库连接对象的指针作为它们的第一个参数,因而这些接口也可以理解成是数据库连接对象的操作接口。该接口就是创建了这样一个数据库连接对象。
sqlite3_prepare() 该接口把一个SQL语句文本转换成一个预处理语句对象并返回一个指向该对象的指针。这个接口需要一个由先前调用sqlite3_open()返回的数据库连接对象指针以及一个预处理的SQL语句文本字符串为参数。这个API并不实际解析SQL语句,仅仅是为后续的解析而对SQL语句进行的预处理。
注意:新的应用中不建议使用sqlite3_prepare(),应该使用另一个接口sqlite3_prepare_v2()。
sqlite3_step() 该接口用于解析一个由先前通过sqlite3_prepare()接口创建的预处理语句,直至返回第一列结果为止。通过再次调用sqlite3_step()可以返回下一列的结果,继续不断地调用sqlite3_step()直至整个语句完成为止。对于那些并不返回结果的语句(例如:INSERT,UPDATE,DELETE语句)一次调用sqlite3_step()就完成了语句的处理。
sqlite3_column() 该接口返回一个由sqlite3_step()解析的预处理语句结果集中当前行某一列数据。每次执行sqlite3_step()都返回一个新结果集中的一行。可以多次调用sqlite3_column()接口返回那一行中所有列的数据。就像上面所说的那样,SQLite API中并没有sqlite3_column()这样的接口。取而代之的是一组用于从结果集中查询出各个列项各种数据类型数据的函数接口。在这组函数接口中,有些接口返回结果集的大小,有些返回结果集的列数。
*sqlite3_column_blob()
*sqlite3_column_bytes()
*sqlite3_column_bytes16()
*sqlite3_column_count()
*sqlite3_column_double()
*sqlite3_column_int()
*sqlite3_column_int64()
*sqlite3_column_text()
*sqlite3_column_text16()
*sqlite3_column_type()
*sqlite3_column_value()
sqlite3_finalize() 该接口销毁之前调用sqlite3_prepare()创建的预处理语句。每一个预处理语句都必须调用这个接口进行销毁以避免内存泄漏。
sqlite3_close() 该接口关闭一个由之前调用sqlite3_open()创建的数据库连接。所有与该连接相关的预处理语句都必须在关闭连接之前销毁。
开发所需依赖
下载地址:http://www.sqlite.org/download.html
在该页面上下载Source Code中的sqlite-amalgamation-3071300.zip,该包有含有两个头文件,两个实现文件。
下载Precompiled Binaries For Windows中的sqlite-dll-win32-x86-3071300.zip,该包中含有一个def文件,一个dll文件。
新建一个win32控制台应用程序sqlite,选择空项目。
方法一:将所得dll、sqlite3.h、sqlite3.lib文件拷贝到../工程/sqlite/下,点击头文件,选择添加现有项,选择拷贝的sqlite.h文件,选择工程->属性->链接器->输入->附加依赖项,填写sqlite3.lib,再在原文件中编写自己的主程序。
方法二:将sqlite3.h、sqlite3.c、sqlite3.lib文件拷贝../工程/sqlite/下,点击头文件,选择添加现有项,选择拷贝的sqlite3.h文件。点击源文件添加现有项,选择拷贝的sqlite3.c文件,选择工程->属性->链接器->输入->附加依赖项,填写sqlite3.lib,然后便携自己的主程序。
示例代码
示例代码一:
#include
#include "sqlite3.h"
using namespace std;
int main( )
{
sqlite3 *db=NULL; //定义SQLite的连接
const char *zErrMsg = 0;//错误信息
int rc;
rc = sqlite3_open("E:/Program code/SQLite code/testSQLite.db", &db);
if(rc != SQLITE_OK) //如果打开数据库失败
{
zErrMsg = sqlite3_errmsg(db); //获取错误信息
cout<<zErrMsg<<endl;
sqlite3_close(db); //关闭数据库连接
return -1;
}
cout<<"open testSQLite.db successfully!"<<endl;
sqlite3_close(db);
return 0;
}
示例代码二:
头文件:my_db.h、sqlite3.h
源文件:sqlitedb.cpp、main.cpp
My_db.h代码:
#ifndef MY_DB_H
#define MY_DB_H
int open_db();
int create_table();
int drop_table();
int insert_data(int id,char *name,int age);
int search_data(int id);
int search_data(char *name);
int delete_data(int age);
#endif
Sqlitedb.cpp代码:
#include "sqlite3.h"
#include "my_db.h"
#include
using namespace std;
sqlite3 *db = NULL; //定义数据库连接
const char *errMsg = 0; //定义错误信息
char *zerrMsg = 0; //定义错误信息
//打开数据库
int open_db()
{
int rc = sqlite3_open("E:/Program code/SQLite code/sqlitejdbc.db",&db); //打开数据库
if(rc != SQLITE_OK) //数据库打开失败
{
errMsg = sqlite3_errmsg(db); //获取错误信息
cout<<errMsg<<endl;
sqlite3_close(db); //关闭数据库连接
return -1;
}
cout<<"open database successfully!"<<endl;
return 0;
}
//创建表
int create_table()
{
if(open_db() != 0)
{
open_db();
}
char *sql = "create table tab(id int primary key ,name varchar(20) ,age int)";
int rc = sqlite3_exec(db,sql,NULL,NULL,&zerrMsg);
if(rc != SQLITE_OK)
{
errMsg = sqlite3_errmsg(db);
cout<<errMsg<<endl; // cout<<zerrMsg<<endl;
sqlite3_close(db);
return -1;
}
cout<<"创建表成功!"<<endl;
return 0;
}
//删除表
int drop_table()
{
if(open_db() != 0)
{
open_db();
}
char *sql = "drop table tab";
int rc = sqlite3_exec(db,sql,NULL,NULL,&zerrMsg);
if(rc != SQLITE_OK)
{
errMsg = sqlite3_errmsg(db);
cout<<errMsg<<endl; // cout<<zerrMsg<<endl;
sqlite3_close(db);
return -1;
}
cout<<"删除表成功"<<endl;
return 0;
}
//数据添加
int insert_data(int id,char *name,int age)
{
if(open_db() != 0)
{
open_db();
}
sqlite3_stmt *stmt = NULL; //准备语句对象
char *sql = "insert into tab(id,name,age) values(?,?,?)";
int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);
if(rc != SQLITE_OK)
{
errMsg = sqlite3_errmsg(db);
cout<<errMsg<<endl;
if(stmt)
{
sqlite3_finalize(stmt);
}
sqlite3_close(db);
return -1;
}
sqlite3_bind_int(stmt,1,id);
//参数一:准备语句对象参数二:序号(从开始)参数三:字符串值参数四:字符串长度参数五:函数指针,SQLITE3执行完操作后回调此函数,通常用于释放字符串占用的内存。(这个函数指针参数具体怎么使用,我现在还不清楚
sqlite3_bind_text(stmt,2,name,strlen(name),NULL);
sqlite3_bind_int(stmt,3,age);
if(sqlite3_step(stmt) != SQLITE_DONE)
{
sqlite3_finalize(stmt);
sqlite3_close(db);
return -1;
}
cout<<"数据插入成功!"<<endl;
sqlite3_reset(stmt);
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
//数据查询根据id唯一性查询
int search_data(int id)
{
if(open_db() != 0)
{
open_db();
}
char *sql = "select * from tab where id = ?";
sqlite3_stmt *stmt = NULL;
int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);
if(rc != SQLITE_OK)
{
errMsg = sqlite3_errmsg(db);
cout<<errMsg<<endl;
if(stmt)
{
sqlite3_finalize(stmt);
}
sqlite3_close(db);
return -1;
}
sqlite3_bind_int(stmt,1,id);
int nColumn = sqlite3_column_count(stmt); //获取数据库表的列数
int type; //表字段所对应的类型
rc = sqlite3_step(stmt);
if(rc == SQLITE_ROW)
{
for(int i=0;i
{
type = sqlite3_column_type(stmt,i);
if(type == SQLITE_INTEGER)
{
cout<<sqlite3_column_name(stmt,i)<<"\t"<<sqlite3_column_int(stmt,i)<<endl;
}
if(type == SQLITE_TEXT)
{
cout<<sqlite3_column_name(stmt,i)<<"\t"<<sqlite3_column_text(stmt,i)<<endl;
}
else if(type == SQLITE_NULL)
{
cout<<"no value"<<endl;
}
}
}
else if(rc == SQLITE_DONE)
{
cout<<"select finish!"<<endl;
}
else
{
cout<<"select fail"<<endl;
sqlite3_finalize(stmt);
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
//数据查询根据姓名批量查询
int search_data(char *name)
{
if(open_db() != 0)
{
open_db();
}
char *sql = "select * from tab where name = ?";
sqlite3_stmt *stmt = NULL;
int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);
if(rc != SQLITE_OK)
{
errMsg = sqlite3_errmsg(db);
cout<<errMsg<<endl;
if(stmt)
{
sqlite3_finalize(stmt);
}
sqlite3_close(db);
return -1;
}
sqlite3_bind_text(stmt,1,name,strlen(name),NULL);
int nColumn = sqlite3_column_count(stmt);
int type;
rc = sqlite3_step(stmt);//如果是select语句,且有还有记录,则应该返回SQLITE_ROW
while(true) {
if(rc == SQLITE_ROW)
{
cout<<"--------------"<<endl;
for(int i=0;i
{
type = sqlite3_column_type(stmt,i);
if(type == SQLITE_INTEGER)
{
cout<<sqlite3_column_name(stmt,i)<<"\t"<< sqlite3_column_int(stmt,i)<<endl;
}
if(type == SQLITE_TEXT)
{
cout<<sqlite3_column_name(stmt,i)<<"\t"<< sqlite3_column_text(stmt,i)<<endl;
}
else if(type == SQLITE_NULL)
{
cout<<"no value"<<endl;
}
}
}
else if(rc == SQLITE_DONE)
{
cout<<"select finish!"<<endl;
}
else
{
cout<<"select fail"<<endl;
sqlite3_finalize(stmt);
}
if (sqlite3_step(stmt) != SQLITE_ROW)
break;
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
//删除数据
int delete_data(int age)
{
if(open_db() != 0)
{
open_db();
}
char *sql = "delete from tab where age = ?";
sqlite3_stmt *stmt = NULL;
int rc = sqlite3_prepare_v2(db,sql,strlen(sql),&stmt,NULL);
if(rc != SQLITE_OK)
{
errMsg = sqlite3_errmsg(db);
cout<<errMsg<<endl;
if(stmt)
{
sqlite3_finalize(stmt);
}
sqlite3_close(db);
return -1;
}
sqlite3_bind_int(stmt,1,age);
rc = sqlite3_step(stmt);//如果是update, delete, insert等语句,正常应该返回SQLITE_DONE
if(rc == SQLITE_DONE)//SQLITE_DONE意味着已成功完成执行该语句
{
cout<<"删除数据成功"<<endl;
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
main.cpp代码:
#include "my_db.h"
#include
using namespace std;
int main()
{
//open_db();
//create_table();
//drop_table();
//insert_data(3,"wang",25);
//search_data(1);
//search_data("wang");
//delete_data(28);
return 0;
}
SQLite加密解密
对数据库而言,加密无非是必不可少了一个环节,如何才能让自己更安全更放心的使用SQLite呢?加密!但是在这里还是很不好意思的说,如果是面向公众开放的开源性SQLite,他是不能实现加密的,当然,除非你付款。此前我也很想研究下加密部分,当看到资料上存在可以加密、解密的方法时,很兴奋的试了试,结果却很让人很纠结。
进入sqlite3.h头文件当中,搜索sqlite3_key(sqlite3 *db,const void *pKey,int nKey)加密方法、sqlite3_rekey(sqlite3 *db,const void *pKey,int nKey)解密方法时,可以看到主要的注释——The code to implement this API is not available in the public release of SQLite.
虽然加密解密方法对于开源用户来说不能使用,但是我们毕竟也了解到SQLite本身是提供加密、解密方法的。所以先了解一下加密、解密方法的使用吧。
加密:
给一个未加密的数据库添加密码:如果想要添加密码,则可以在打开数据库文件之后,关闭数据库文件之前的任何时刻调用sqlite3_key函数即可,
该函数有三个参数,其中参数一:数据库对象 参数二:要设定的密码 参数三:密码的长度。例:sqlite3_key(db,"123456",6);
解密:
sqlite3_rekey是变更密码或给没有加密的数据库添加密码或清空密码,变更密码或清空密码前必须先正确执行sqlite3_key。
在正确执行sqlite3_rekey之后在sqlite3_close关闭数据库之前可以正常操作数据库,不需要再执行sqlite3_key。
sqlite3_rekey( sqlite3 *db, const void *pKey, int nKey),参数同上。清空密钥为sqlite3_rekey( db, NULL, 0)。
如果实在是想进行加密解密的话,那么我也不妨提出自己的两个建议吧!
建议一:掏钱购买吧!没什么可说的。
建议二:自己实现加密解密方法。对即将存入数据库的数据进行加密之后再进行保存,取数据的时候先进行解密再进行获取。
SQLite的管理
管理工具也有不少,这里介绍几款:
1、SQLite Manager是开放源代码的SQLite管理工具,用来管理本地电脑上的SQLite数据库,可以独立运行(以XULRunner方式),也可以作为Firefox、Thunderbird、Seamonkey、Songbird、Komodo、Gecko等的插件。
2、SQLite Administrator是一个用来管理 SQLite 数据库文件的图形化工具,可进行创建、设计和管理操作。提供代码编辑器具有自动完成和语法着色,支持中文,适合初学者。
3、SQLite Database browser是一个 SQLite 数据库的轻量级GUI客户端,基于Qt库开发,界面清洁,操作简单,主要是为非技术用户创建、修改和编辑SQLite数据库的工具,使用向导方式实现。
QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型视图结构将数据库与用户界面集成的一套类来支持。
驱动程序 | 数据库 |
QDB2 | IBM DB2 7.1版以及更新的版本 |
QIBASE | Borland InterBase |
QMYSQL | MySql |
QOCI | 甲骨文公司(Oracle Call Interface) |
QODBC | ODBC(包括微软公司的QSL服务) |
QPSQL | PostgreSQL的7.3版以及更高版本 |
QSQLITE | QSLite第3版 |
QSQLITE2 | QSLite第2版 |
QTDS | Qybase自适应服务器 |
//添加数据库驱动、设置数据库名称、数据库登录用户名、密码
QSqlDatabase database = QSqlDatabase::addDatabase("QSQLITE");
database.setDatabaseName("database.db");
database.setUserName("root");
database.setPassword(""); //打开数据库
if(!database.open())
{
qDebug()<<database.lastError();
qFatal("failed to connect.") ;
}
else
{
//QSqlQuery类提供执行和操作的SQL语句的方法。
//可以用来执行DML(数据操作语言)语句,如SELECT、INSERT、UPDATE、DELETE,
//以及DDL(数据定义语言)语句,例如CREATE TABLE。
//也可以用来执行那些不是标准的SQL的数据库特定的命令。
QSqlQuery sql_query; QString create_sql = "create table student (id int primary key, name varchar(30), age int)";
QString select_max_sql = "select max(id) from student";
QString insert_sql = "insert into student values (?, ?, ?)";
QString update_sql = "update student set name = :name where id = :id";
QString select_sql = "select id, name from student";
QString select_all_sql = "select * from student";
QString delete_sql = "delete from student where id = ?";
QString clear_sql = "delete from student"; sql_query.prepare(create_sql);
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError();
}
else
{
qDebug()<<"table created!";
} //查询最大id
int max_id = ;
sql_query.prepare(select_max_sql);
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError();
}
else
{
while(sql_query.next())
{
max_id = sql_query.value().toInt();
qDebug()<<QString("max id:%1").arg(max_id);
}
}
//插入数据
sql_query.prepare(insert_sql);
sql_query.addBindValue(max_id+);
sql_query.addBindValue("name");
sql_query.addBindValue();
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError();
}
else
{
qDebug()<<"inserted!";
} //更新数据
sql_query.prepare(update_sql);
sql_query.bindValue(":name", "Qt");
sql_query.bindValue(":id", );
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError();
}
else
{
qDebug()<<"updated!";
} //查询部分数据
if(!sql_query.exec(select_sql))
{
qDebug()<<sql_query.lastError();
}
else
{
while(sql_query.next())
{
int id = sql_query.value("id").toInt();
QString name = sql_query.value("name").toString(); qDebug()<<QString("id:%1 name:%2").arg(id).arg(name);
}
} //查询所有数据
sql_query.prepare(select_all_sql);
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError();
}
else
{
while(sql_query.next())
{
int id = sql_query.value().toInt();
QString name = sql_query.value().toString();
int age = sql_query.value().toInt(); qDebug()<<QString("id:%1 name:%2 age:%3").arg(id).arg(name).arg(age);
}
} //删除数据
sql_query.prepare(delete_sql);
sql_query.addBindValue(max_id);
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError();
}
else
{
qDebug()<<"deleted!";
} //清空表
sql_query.prepare(clear_sql);
if(!sql_query.exec())
{
qDebug()<<sql_query.lastError();
}
else
{
qDebug()<<"cleared";
}
} //关闭数据库
database.close(); //删除数据库
QFile::remove("database.db");
- SQLite Manager:开放源代码的SQLite管理工具,用来管理本地电脑上的SQLite数据库,可以独立运行(以XULRunner方式),也可以作为Firefox、Thunderbird、Seamonkey、Songbird、Komodo、Gecko等的插件。
- SQLite Administrator:一个用来管理SQLite数据库文件的图形化工具,可进行创建、设计和管理操作。提供代码编辑器具有自动完成和语法着色,支持中文,适合初学者。
- SQLite Database browser:一个SQLite数据库的轻量级GUI客户端,基于Qt库开发,界面清洁,操作简单,主要是为非技术用户创建、修改和编辑SQLite数据库的工具,使用向导方式实现。
Qt之操作数据库(SQLite)的更多相关文章
- Qt之操作数据库(SQLite)实例
QtSql模块提供了与平台以及数据库种类无关的访问SQL数据库的接口,这个接口由利用Qt的模型视图结构将数据库与用户界面集成的一套类来支持.QSqlDatabase对象象征了数据库的关联.Qt使用驱动 ...
- QT 操作数据库SQLite实例
#include "widget.h" #include <QApplication> #include <QtSql> #include <QTex ...
- QT 创建本地数据库(SQLite数据库)存储数据
注意:QT自带SQLITE数据库,不需要再安装 1.创建一个包含创建.查询.修改和删除数据库的数据库类(DataBase) DataBase.h头文件 #pragma once #include &l ...
- websql的使用/phonegap操作数据库 sqlite
对websql的常用操作进行了一个封装,项目是基于phonegap的,不过phonegap默认已经集成了数据库操作的插件,所以无需再配置什么,直接用就可以了: /** *数据库操作辅助类,定义对象.数 ...
- iOS - SQLite Database 操作数据库
iOS - SQLite Database 操作数据库 Sqlite 能被用在ios上做数据处理用,只要你懂得一点sql 就很容易使用sqlite 1:创建一个简单的View based appl ...
- iOS基础 - 数据库-SQLite
一.iOS应用数据存取的常用方式 XML属性列表 —— PList NSKeyedArchiver 归档 Preference(偏好设置) SQLite3 Core Data(以面向对象的方式操作数据 ...
- 数据库-SQLite
技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong 数据库-SQLite 技术博客http:// ...
- Qt for Android 打包 SQLite 数据库
Qt for Android 调用 SQLite 数据库时, 怎样将已经存在的数据库附加到 APK 中? 直接在你项目里面的Android源码的根目录下新建一个文件夹assets, 数据库就可以放里面 ...
- sqlite:多线程操作数据库“database is locked”解决方法(二)
上一篇博客<sqlite:多线程操作数据库“database is locked”解决方法>通过注册延时函数的方法来处理数据库被锁的问题.此方法固然能解决问题,但是在多个线程向数据库写入大 ...
随机推荐
- RPC简介及原理
简介 RPC(Remote Procedure Call,远程过程调用)是建立在Socket之上的,在一台机器上运行的主程序,可以调用另一台机器上准备好的子程序,就像LPC(本地过程调用). 越底层, ...
- Google 镜像站大集合
没有了google的日子是相当难受,下面推荐一些google的镜像站,感谢原文博主的无私奉献,同时也欢迎大家总结科研上的小技巧,心得等来本平台投稿,好东西当然要拿出来共同分享! 以下镜像站分原版和非原 ...
- 360每日自动签到,领取积分 (java httpclient4.x)
如何登陆360,并每日自动签到这次的难点主要集中在登陆这里了,开始抓包发现360登陆验证很麻烦,但是后来发现一个简单的方法.因为我安装了360安全卫士,发现点击那个金币的按钮能直接验证登陆,哈哈~所以 ...
- 用xshell操作linux系统的常用命令
(1)命令ls——列出文件 ls -la 给出当前目录下所有文件的一个长列表,包括以句点开头的“隐藏”文件 ls a* 列出当前目录下以字母a开头的所有文件 ls -l *.doc 给出当前目录下以. ...
- [原]最短路专题【基础篇】(updating...)
hud1548 a strange lift 最短路/bfs 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 题意:一个奇怪的电梯,每层楼的 ...
- YTU 2610: A改错题--体检情况分析
2610: A改错题--体检情况分析 时间限制: 1 Sec 内存限制: 128 MB 提交: 233 解决: 161 题目描述 注:本题只需要提交标记为修改部分之间的代码,请按照C++方式提交. ...
- datagridview中combobox类型的cell选中一个下拉列表之后,立即生效的事件
public event EventHandler CurrentCellDirtyStateChanged 当单元格的内容已更改,但更改尚未保存时,该单元格将标记为已修改. 此事件通常会在以下情况下 ...
- js判断页面放大缩小
项目中,经常会碰到页面被放大或者缩小,导致页面显示错误,js可以判断页面放大缩小. // 若返回100则为默认无缩放,如果大于100则是放大,否则缩小 function detectZoom (){ ...
- Headfirst JSP 01 (概述)
HTTP 协议 http 是tcp/ip上层协议, 如果你对这些网络协议还不是太熟悉, 下面提供一个非常简单的解释, tcp负责确保从一个网络节点向另一个网络节点发送文件能作为一个完整的文件到达目的地 ...
- 【干货】国外程序员整理的 C++ 资源大全
关于 C++ 框架.库和资源的一些汇总列表,由 fffaraz发起和维护. 内容包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等. 标准库 C++ Standard ...