SQLite数据操作
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,SQLite引擎不是个程序与之通讯的独立进程,而是连接到程序中成为它的一个主要部分,其主要的通信协议是在编程语言内的直接API调用。这在消耗总量、延迟时间和整体简单性上有着积极的作用。
1.Qt操作SQLite数据库
Qt提供了与平台以及数据库种类无关的访问数据库接口,支持类型和描述分别有:
Driver Type Description
QDB2 IBM DB2
QIBASE Borland InterBase Driver
QMYSQL MySQL Driver
QOCI Oracle Call Interface Driver
QODBC ODBC Driver (includes Microsoft SQL Server)
QPSQL PostgreSQL Driver
QSQLITE SQLite version 3 or above
QSQLITE2 SQLite version 2
QTDS Sybase Adaptive Server
涉及操作注意点:
<1>.创建Qt项目,数据库放置与工程同一个目录下,添加头文件【include <QtSql>】,Qt工程文件(xxx.pro)添加涉及库【QT +=sql】;
<2>.SQLite数据库主要操作
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); //声明数据库类型
db.setDatabaseName("demo.db"); //关联数据库
db.open(); //连接打开数据库【只有通过open激活到数据库的物理连接,否则不可用】
QSqlQuery sqlQuery(db); //数据库操作
sqlQuery.exec("select * from 数据表"); //通过exec执行sql相关操作
db.close(); //用完,关闭数据库
<3>.简单例子
#include <QtCore/QCoreApplication>
#include <QtSql>
#include <qDebug>
int main(int argc,char *argv[])
{
QApplication app(argc,argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName((char *)"demo.db");
//db.setUserName("用户名");
//db.setPassword("密码");
if(!db.open())
{
//连接数据库失败
return -1;
}
QSqlQuery sqlQuery;
//插入数据
sqlQuery.prepare("insert into employee(id, name, salary) values(:id, :name, :salary)");
bool bInsert = sqlQuery.exec("insert into employee(id, name, salary) values(1001, ‘张三‘, 6500)";
//sqlQuery.bindValue(":id", 1001);
//sqlQuery.bindValue(":name", "张三");
//sqlQuery.bindValue(":salary", "6500");
//bool bInsert = sqlQuery.exec();
if (!bInsert)
{
//插入数据失败
}
//查询数据
sqlQuery.exec("select * from employee");
while (sqlQuery.next())
{
int id = sqlQuery.value(0).toInt();
QString name = sqlQuery.value(1).toString();
QString salary = sqlQuery.value(2).toString();
//获取相关数据处理
}
//更新数据
sqlQuery.exec("update employee set salary= \"7000\" where id=\"1001\"");
app.exec();
return 0;
}
2.C/C++接口操作SQLite数据库
SQLite本身提供了对应的API函数接口供C/C++程序调用,主要有:sqlite3_open(),sqlite3_exec()和sqlite3_close()。
<1>.核心对象
SQLite中主要的核心对象分别为:database_connection和prepared_statement
database_connection对象是由sqlite3_open()接口函数创建并返回的,在应用程序使用任何其他SQLite接口函数之前,必须先调用该函数以便获得database_connnection对象,在随后的其他调用中,都需要该对象作为输入参数以完成相应的工作;
prepare_statement可以把它视为编译后的SQL语句,作为涉及操作调用接口参数;
<2>.核心接口
sqlite3_open是操作SQLite数据库的入口函数,该函数返回database_connection对象,作为句柄参数供其他接口调用;
sqlite3_prepare将相关的SQL语句转换为prepared_statement对象,并在函数执行后返回对象指针,相当于一种操作初始化准备;
sqlite3_step用于评估sqlite3_prepare函数返回的prepared_statement对象,执行完将对象内部指针指向结果的数据行首,对于insert/update/delete等dml语句,该函数只需执行一次,其他需要访问其他数据行,需重复调用;
sqlite3_column获取当前行指定列的数据,由相关的接口完成该功能:
sqlite3_column_blob
sqlite3_column_bytes
sqlite3_column_bytes16
sqlite3_column_double
sqlite3_column_int
sqlite3_column_int64
sqlite3_column_text
sqlite3_column_text16
sqlite3_column_type
sqlite3_column_value
sqlite3_column_count
其中sqlite3_column_count函数用于获取当前结果集中的字段数据;
sqlite3_finalize用于销毁prepared statement对象,避免内存泄露;
sqlite3_close用于关闭之前打开的database_connection对象;
<3>.简单例子
#include <stdio.h>
#include <sqlite3.h>
int main()
{
int iRet;
sqlite3 *db=NULL;
iRet = sqlite3_open("demo.db", &db)
if (SQLITE_OK != iRet)
{
//打开数据库失败
return -1;
}
char *ErrMsg;
//sqlite3_exec:参数1(数据库指针)/参数2(sql语句)/参数3(回调函数)/参数4(回调函数参数)/参数5(返回错误信息)
iRet = sqlite3_exec(db, "insert into employee(id, name, salary) values(1001,\"张三\",\"6500\")", NULL, NULL, &ErrMsg);
if (SQLITE_OK != iRet)
{
//插入数据失败
}
//int sqlite3_prepare(
// sqlite3 *db, /* Database handle */
// const char *zSql, /* SQL statement, UTF-8 encoded */
// int nByte, /* Maximum length of zSql in bytes. */
// sqlite3_stmt **ppStmt, /* OUT: Statement handle */
// const char **pzTail /* OUT: Pointer to unused portion of zSql */
// );
sqlite3_stmt *ppStmt;
iRet = sqlite3_prepare(db,"select id,name,salary from employee", -1, &ppStmt, NULL);
if (SQLITE_OK != iRet)
{
//读取数据失败
}
else
{
while(sqlite3_step(ppStmt) == SQLITE_ROW)
{
printf("id: %s\t", sqlite3_column_text(ppStmt, 0));
printf("name: %s\t", sqlite3_column_text(ppStmt, 1));
printf("salary: %s\n", sqlite3_column_text(ppStmt, 2));
}
sqlite3_finalize(ppStmt);
}
sqlite3_close(db);
return 0;
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。