数据库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数据库 ...
随机推荐
- Xcode can't verify the identity of the server
当升级了苹果系统到 OS X El Captain 之后 ,打开Xcode 有时候会报错 如图 而且打开 svn 也会出类似错误 点击continue 了 下次 还会 出现 .这个很好解决 ...
- HIVE json格式数据的处理
今天要处理一个以json格式存储的数据,想要直接把json的各个项的数据存入HIVE表中. HIVE直接读入json的函数有两个: (1)get_json_object(string json_str ...
- Ratchet(WebSockets for PHP)的官方TUTORIALS 的实践
前几天稍微看了一下Ratchet,并且实践了一下它官方例子.所以现在就将实践的过程记录下来. 在具体实践之前先将Ratchet是什么东东,要先说明一下.以下的英文是从官方copy过来的 Ratchet ...
- 《FPGA零基础入门到精通视频教程》-第001b讲软件的破解
高清视频和配套讲义这里下载 http://www.fpgaw.com/thread-68128-1-1.html 优酷视频地址,不是很清楚
- 【手机安全卫士01】项目Splash页面的开发与设计
首先建立一个安卓的项目,然后修改manifest.xml文件,修改应用程序的logo和显示名称,效果图如下: 对应的代码如下: <?xml version="1.0" enc ...
- Excel进行项目规划的好处
1.表格的方式 2.多个工作表 3.插入图片 4.清晰的规划 5.大众都能看得懂 6.辅助一些数据表设计,其他的流程设计 7.对项目该做什么,进度等等有一个明确的认识 8.项目管理,吃透需求,对进度把 ...
- 第一个Windows程序讲解
上次,我们一起写了第一个Windows程序,虽然程序非常简单,但是它却可以帮助大家建立学好windows开发的信心. 今天,就让我帮助大家分析一下这个程序的内容.首先,我们的程序包含了一个头文件:wi ...
- 【递归】Vijos P1132 求二叉树的先序序列(NOIP2001普及组第三题)
题目链接: https://vijos.org/p/1132 题目大意: 给定二叉树的中序和后序遍历,求该二叉树先序遍历. 题目思路: [递归] 这题妥妥递归. 二叉树先序根左右,中序左根右,后序左右 ...
- 《Ruby语言入门教程v1.0》学习笔记-01
<Ruby语言入门教程v1.0> 编著:张开川 邮箱:kaichuan_zhang@126.com 想要学习ruby是因为公司的自动化测试使用到了ruby语言,但是公司关于ruby只给了一 ...
- hdu 4499 Cannon(暴力)
题目链接:hdu 4499 Cannon 题目大意:给出一个n*m的棋盘,上面已经存在了k个棋子,给出棋子的位置,然后求能够在这种棋盘上放多少个炮,要求后放置上去的炮相互之间不能攻击. 解题思路:枚举 ...