QT += sql
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {
qDebug()<<"add sql error";
}
static QSqlDatabase addDatabase(const QString& type,/*要连接的数据库驱动名称*/
const QString& connectionName = QLatin1String(defaultConnection));/*数据库连接名称*/
如果要连接多个数据库,那么connectionName就要自己指定
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName(":memory:");
if (!db.open()) {
qDebug()<<"add sql error";
}
QSqlDatabase db2 = QSqlDatabase::addDatabase("QSQLITE" , "hqd_test");
db2.setDatabaseName(":memory:");
if (!db2.open()) {
qDebug()<<"add sql error";
}
QSqlDatabase db = QSqlDatabase::addDatabase(“QSQLITE”);只要数据连接并且打开,后期可以在Qt工程中任意位置都可以使用(单例),在创建执行对象QSqlQuery会自动去绑定对应的数据
QSqlQuery query;//默认绑定默认连接名的数据库
query.exec("insert into test values(1)");
//可以通过connectionName获取数据库"hqd_test"
QSqlQuery queryHqd(QSqlDatabase::database("hqd_test"));
queryHqd.exec("insert into test values(100)");
QSqlQuery query;
query.exec(创建表格/更新/删除/等sql语句);
例:
QString value = ui->lineEdit->text();
QSqlQuery query;//默认绑定默认连接名的数据库
QString sqlStr = QString("insert into test values(%1)").arg(value);
if(!query.exec(sqlStr))
{
qDebug()<<"insert error";
qDebug()<<query.lastError().text();//获取最后一条错误记录
}
在QSqlQuery类中提供了多个函数来操作这个集合,需要注意这个集合中的记录是从0开始编号的。最常用的操作有:
seek(int n) :query指向结果集的第n条记录;
first() :query指向结果集的第一条记录;
last() :query指向结果集的最后一条记录;
next() :query指向下一条记录,每执行一次该函数,便指向相邻的下一条记录;
previous() :query指向上一条记录,每执行一次该函数,便指向相邻的上一条记录;
record() :获得现在指向的记录;
value(int n) :获得属性的值。其中n表示你查询的第n个属性,
at() :获得现在query指向的记录在结果集中的编号。
例:
QString select = "select * from password";
QString select_where = QString("select * from password where username='%1' and password='%2'")
.arg(ui->userEdit->text()).arg(ui->passEdit->text());
QSqlQuery query;
if(!query.exec(select_where))
{
qDebug()<<query.lastError().text();
}
//获取查询的数据
if(query.next())
{
qDebug()<<"有数据";
ui->label->setText("验证通过");
}else {
qDebug()<<"无数据";
ui->label->setText("验证失败");
}
while(query.next())
{
QSqlRecord record = query.record();
qDebug()<<record.value(1).toString()<<record.value(2).toString();
}
QSqlQuery query;
//这里的(:id,:name)可以用(?,?)) 代替)
//注意与sqlte3 API接口里面的绑定区别
query.prepare("insert into student (id, name) values (:id, :name)");
query.bindValue(0, 5); //序号从0开始,API接口里面的绑定区别1开始 sqlite3_bind_int
query.bindValue(1, "sixth");//sqlite3_bind_text
query.exec();
QSqlQuery q;
query.prepare("insert into student values (?, ?)");
QVariantList ints;
ints << 10 << 11 << 12 << 13;
query.addBindValue(ints);
QVariantList names;
names << "AAAA" << "BBBB" << "CCCC" << QVariant(QVariant::String);//这里加个空,与前面个数一致
query.addBindValue(names);
query.execBatch()) //进行批处理,如果出错就输出错误
Qt中数据库QSqlDataBase不能跨线程
QSqlDatabase::transaction() 创建事务 BEGIN
QSqlDatabase::database().transaction(); //开启事务
QSqlDatabase::commit() 提交事务 COMMIT
QSqlDatabase::database().commit();
QSqlDatabase::rollback() 事务回滚 ROLLBACK
文件传输–>生成文件MD5码,与文件同时发送
密码加密—>生成MD5, sha1, sha256, sha512
MD5码是一个32位的十六进制数
QCryptographicHash
QCryptographicHash mdHash(加密方式);
mdHash.addData(要加密的数据)
QByteArray array = mdHash.result();
QString pwd = array.toHex();
static QByteArray hash(const QByteArray &data, Algorithm method);
参数:data --- 要加密的数据
method --- 加密方式
返回值:加密后的数据