数据库SQLite在Qt5+VS2012使用规则总结---中文乱码
VS2012默认格式为 "GB2312-80",而有时我们用到字符串需要显示中文时,就会出现乱码。下面仅就Qt5和VS2012中使用数据库SQLite时,做一个简单的备忘录
#include <QtWidgets/QApplication>
#include <QtCore>
#include <QTextCodec>
#include <QSqlDatabase>
#include <QMessageBox>
#include <QSqlQuery>
#include <QTime>
#include <QSqlError>
#include <QSqlDriver>
#include <QSqlRecord>
#include <QtDebug> int main(int argc, char *argv[])
{
QApplication a(argc, argv); QFile::remove("qtDB.db"); //it's very necessary to testing many times! QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setHostName("easybook-3313b0"); //设置数据库主机名
db.setDatabaseName("qtDB.db"); //设置数据库名,setHostName/setDatabaseName/setUserName/setPassword是非必须的
//因为在Qt中,由于QSQLITE数据库驱动对应的SQLite数据库是一种进程内的本地数据库,无需数据库名、用户名、密码、主机名和端口等特性
db.setUserName("zhouhejun"); //设置数据库用户名
db.setPassword(""); //设置数据库密码
db.open(); //打开连接 //创建数据库表automobile1------一个数据库中可以创建多个互不重名的数据库表
QSqlQuery query1;
bool success1 = query1.exec("create table automobile1(id int primary key,attribute varchar(100),type varchar(100),kind varchar(100),nation int,carnumber int,elevaltor int,distance int,oil int,temperature int)"); if (success1)
qDebug() <<"Create automobile1 Successful";
else
qDebug() <<"Create automobiles1 Fail"; //创建数据库表automobile
QSqlQuery query;
bool success = query.exec("create table automobile(id int primary key,attribute varchar(100),type varchar(100),kind varchar(100),nation int,carnumber int,elevaltor int,distance int,oil int,temperature int)"); if (success)
qDebug() << "Create automobile Successful";
else
qDebug() << "Create automobiles Fail"; //查询
query.exec("select * from automobile");
QSqlRecord rec = query.record();
qDebug() << "automobile records' num:" << rec.count(); //插入记录
QTime t;
t.start(); //像这种带有string类型的table,进行插入元组时,应带有QString::fromLocal8Bit("insert into...")才能保证正确显示.
//元组0中因为没有加QString::fromLocal8Bit(...),所以string类型显示不全或乱码
success = query.exec(("insert into automobile values( 0, '四轮','轿车','富康',123,123,123,123,123,123)"));
if (!success)
{
QSqlError lastError = query.lastError();
qDebug() << lastError.driverText() << "insert row 0 failed";
} //元组1中的string类型均可显示成功
//值得注意的是,如果直接使用这种query.exec(...)进行插入元组时,里面所有的列元素必须是确定的,可以带有计算,但不能带入函数
success = query.exec(QString::fromLocal8Bit("insert into automobile values( 1, '四轮','轿车','富康',(6+6)*12/3,123,123,123,123,123)"));
if (!success)
{
QSqlError lastError = query.lastError();
qDebug() << lastError.driverText() << "insert row 1 Failed";
} //元组2插入失败
success = query.exec(QString::fromLocal8Bit("insert into automobile values( 2, '四轮','轿车','富康',rand() % 100 ,123,123,123,123,123)"));
if (!success)
{
QSqlError lastError = query.lastError();
qDebug() << lastError.driverText() << "insert row 2 Failed";
} //如果直接使用这种query.exec(...)进行插入元组时,id/nation等int类型的数据,则必须是具体已确定的数值,而不能用变量进行替代;
//元组3插入失败
int fourthRowId = ;
success = query.exec(QString::fromLocal8Bit("insert into automobile values(fourthRowId, '四轮','轿车','富康',123,123,123,123,123,123)"));
if (!success)
{
QSqlError lastError = query.lastError();
qDebug() << lastError.driverText() << "insert row 3 Failed";
} //同上,元组4插入失败
int thirdRowNation = rand() % ;
success = query.exec(QString::fromLocal8Bit("insert into automobile values( 4, '四轮','轿车','富康',thirdRowNation,123,123,123,123,123)"));
if (!success)
{
QSqlError lastError = query.lastError();
qDebug() << lastError.driverText() << "insert row 4 Failed";
} //另外一种query.exec();可以通过query.prepare()进行预插值,然后通过query.bindValue(...)进行数据绑定,
//这种方式更加随性一些,因为插入元组的列元素可以是变量,也可以是符合条件的函数
query.prepare(QString::fromLocal8Bit("insert into automobile values(?,?,?,?,?,?,?,?,?,?)"));
int records1 = ;
for (int i = ; i < records1; i++)
{ query.bindValue(, i+); ////ok, 可以正确显示
query.bindValue(, "四轮"); //完全显示不出来
query.bindValue(, QString::fromLocal8Bit("轿车")); //ok,可以正确显示
query.bindValue(, '富康'); //单引号,可以显示,但是显示错误
query.bindValue(, (+)*/); //显示42,ok,可以正确显示
query.bindValue(, rand() % ); //ok, 可以正确显示
query.bindValue(, rand() % );
query.bindValue(, rand() % );
query.bindValue(, rand() % );
query.bindValue(, rand() % ); success = query.exec();
if (!success)
{
QSqlError lastError = query.lastError();
qDebug() << lastError.driverText() << "insert row " << i + << "Failed";
}
}
qDebug() << "first insert " << records1 << " records, time:" << t.elapsed() << " ms"; //query.prepare(QString::fromLocal8Bit("insert into automobile values(?,?,?,?,?,?,?,?,?,?)"))中的QString::fromLocal8Bit在此没有作用,可以不加
query.prepare(("insert into automobile values(?,?,?,?,?,?,?,?,?,?)")); long records2 = ;
for (int i = ; i < records2; i++)
{ query.bindValue(, i + records1 + );
query.bindValue(, QString::fromLocal8Bit("四轮"));
query.bindValue(, QString::fromLocal8Bit("轿车"));
query.bindValue(, QString::fromLocal8Bit("富康")); //结合以上可以看出,在当前环境下,使用字符串显示中文,需在中文字符的外面加上QString::fromLocal8Bit
query.bindValue(, rand() % );
query.bindValue(, rand() % );
query.bindValue(, rand() % );
query.bindValue(, rand() % );
query.bindValue(, rand() % );
query.bindValue(, rand() % ); success = query.exec();
if (!success)
{
QSqlError lastError = query.lastError();
qDebug() << lastError.driverText() << "insert row" << i + records1 + << "Failed";
}
} qDebug() << "second insert " << records2 << " records, time:" << t.elapsed() << " ms"; db.close(); return a.exec();
}
输出消息为:

可以看到行号为2、3、4的插入元组的操作失败。
上述操作在数据库中的显示如下:

在上述的L156行的qDebug() << "second insert " << records2 << " records, time:" << t.elapsed() << " ms";下方添加如下代码:
//更新记录
t.restart();
for (int i = ; i < +records1; i++)
{
query.clear();
query.prepare(QString("update automobile set attribute=?,type=?,"
"kind=?,nation=?,"
"carnumber=?,elevaltor=?,"
"distance=?,oil=?,"
"temperature=? where id=%1").arg(i)); query.bindValue(, QString::fromLocal8Bit("四轮"));
query.bindValue(, QString::fromLocal8Bit("轿车"));
query.bindValue(, QString::fromLocal8Bit("富康"));
query.bindValue(, rand() % );
query.bindValue(, rand() % );
query.bindValue(, rand() % );
query.bindValue(, rand() % );
query.bindValue(, rand() % );
query.bindValue(, rand() % ); success = query.exec();
if (!success)
{
QSqlError lastError = query.lastError();
qDebug() << lastError.driverText() <<"update Failed";
}
}
qDebug() << "update " << + records1 << " records,elapsed time:" << t.elapsed() << " ms"; //排序
t.restart();
success = query.exec("select * from automobile order by id desc");
if (success)
qDebug() << "Sort " << + records1 + records2 << " records, time:" << t.elapsed() << " ms";
else
qDebug() << "Sort Failed!"; //删除
t.restart();
query.exec("delete from automobile where id=15");
qDebug() << "delete one record, elapsed time: " << t.elapsed() << " ms";
则上述所有操作在数据库中的最终显示如下:
可以看出,前15行经过更新,可以正常显示;id=15的元组也已经被删除。
数据库SQLite在Qt5+VS2012使用规则总结---中文乱码的更多相关文章
- windows下 qt5&vs2010 在qtCreator下中文乱码
环境:windows2012下 qt5.3.1 & vs2010 在qtCreator3.1.2下中文乱码 解决方法:在相关文件中加入代码 #ifdef Q_OS_WIN32 #if _MSC ...
- QT5中QByteArray转QString中文乱码
1.添加头文件 #include <QTextCodec> 2.用QTextCodec 设置格式转换 QByteArray barr; barr.insert(0,(char*)(pMsg ...
- LocalDB-排序规则:中文乱码; DefaultLanguage
DefaultLanguage: Set Language 简体中文|us_english SELECT SYSTEM_USER Login SP_DefaultLanguage #Login, 简体 ...
- Dapper操作MySQL数据库获取JSON数据中文乱码
前言 在项目中利用Dapper将JSON数据存储到MySQL数据库,结果发现JSON数据中的中文乱码,特此记录,希望对存储JSON的童鞋能有所帮助,文中若有错误之处,还望批评指正. Dapper获取J ...
- SQLite 自定义函数,聚合,排序规则
SQLite 自定义函数,聚合,排序规则 1.使用自定义函数, 聚合以及排序规则的基本方法是使用回调函数.这些注册的函数的生命周期只存在于应用程序中, 并不存储在数据库文件中, 因此需要在每个连接建立 ...
- QT笔记之解决QT5.2.0和VS2012中文乱码 以及在Qt Creator中文报错
转载:http://bbs.csdn.net/topics/390750169 VS2012 中文乱码 1.方法一: 包含头文件 #include <QTextCodec> ....... ...
- Android学习---如何创建数据库,SQLite(onCreate,onUpgrade方法)和SQLiteStudio的使用
一.android中使用什么数据库? SQLite是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程式庫中.它是D.RichardHipp建立的公有领域项目.SQLite 是一个软件库,实现 ...
- python 学习笔记6(数据库 sqlite)
26. SQLite 轻量级的关系型数据库 SQLite是python自带的数据库,可以搭配python存储数据,开发网站等. 标准库中的 sqlite3 提供该数据库的接口. 1. 基本语法如下 c ...
- 解决SQLite数据库中文乱码问题
关于SQLite中出现中文乱码的分析以及解决方案 我们在使用SQLite数据库时候,可能会发现,向数据库插入数据时候显示的是汉字,但通过SQLite读出来时却显示的乱码,这是因为SQLite数据库 ...
随机推荐
- linux kernel
first step. http://www.cyberciti.biz/faq/howto-install-kernel-headers-package/ http://uliweb.clkg.or ...
- new Thread的弊端(转)
new Thread的弊端如下: a. 每次new Thread新建对象性能差.b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom.c. 缺乏更多功能,如 ...
- 学渣上手 LaTeX 完成毕业论文
学渣上手 LaTeX 完成毕业论文 作为一个标准的学渣,虽然经历了一系列变故但最终还是使用 LaTeX 完成了我的毕业论文.要问我感想的话,就是——如果没有做好迎接比较陡峭的学习曲线以及各种打击人的小 ...
- 深入JS系列学习4
深入JS系列学习4 Javascript 装载和执行 明白了JS的装载和执行,没有给出很好的解决方案,在IE下可用defer属性: 浏览器对于Javascript的运行有两大特性:1)载入后马上执行, ...
- HDOJ 2200 Eddy's AC难题(数学组合概率题)
Problem Description Eddy是个ACMer,他不仅喜欢做ACM题,而且对于Ranklist中每个人的ac数量也有一定的研究,他在无聊时经常在纸上把Ranklist上每个人的ac题目 ...
- 把struts2-convention-plugin丢进太平洋
struts2-convention-plugin是一个插件,通过这个插件可以实现对于struts2的零配置,基本用法可以参考这个博客(http://javeye.iteye.com/blog/358 ...
- python模块之bsddb: bdb高性能嵌入式数据库 1.基础知识
转自:http://blog.csdn.net/zhaoweikid/article/details/1665741 bsddb模块是用来操作bdb的模块,bdb是著名的Berkeley DB,它的性 ...
- linux内核--自旋锁的理解
http://blog.chinaunix.net/uid-20543672-id-3252604.html 自旋锁:如果内核配置为SMP系统,自旋锁就按SMP系统上的要求来实现真正的自旋等待,但是对 ...
- VC —— 笔记汇总
导读 本文仅用于记录在个人在使用VC++过程中的遇到一些的问题和相关概念. 目录 开发环境 实践记录 MFC相关 windows编程相关 1.开发环境 1.Visual C++ 官方网站 主要内容:V ...
- Oralce新建数据库、新建远程登录用户全过程
Oracle安装完后,其中有一个缺省的数据库,除了这个缺省的数据库外,我们还可以创建自己的数据库. 对于初学者来说,为了避免麻烦,可以用'Database Configuration Assi ...