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使用规则总结---中文乱码的更多相关文章

  1. windows下 qt5&vs2010 在qtCreator下中文乱码

    环境:windows2012下 qt5.3.1 & vs2010 在qtCreator3.1.2下中文乱码 解决方法:在相关文件中加入代码 #ifdef Q_OS_WIN32 #if _MSC ...

  2. QT5中QByteArray转QString中文乱码

    1.添加头文件 #include <QTextCodec> 2.用QTextCodec 设置格式转换 QByteArray barr; barr.insert(0,(char*)(pMsg ...

  3. LocalDB-排序规则:中文乱码; DefaultLanguage

    DefaultLanguage: Set Language 简体中文|us_english SELECT SYSTEM_USER Login SP_DefaultLanguage #Login, 简体 ...

  4. Dapper操作MySQL数据库获取JSON数据中文乱码

    前言 在项目中利用Dapper将JSON数据存储到MySQL数据库,结果发现JSON数据中的中文乱码,特此记录,希望对存储JSON的童鞋能有所帮助,文中若有错误之处,还望批评指正. Dapper获取J ...

  5. SQLite 自定义函数,聚合,排序规则

    SQLite 自定义函数,聚合,排序规则 1.使用自定义函数, 聚合以及排序规则的基本方法是使用回调函数.这些注册的函数的生命周期只存在于应用程序中, 并不存储在数据库文件中, 因此需要在每个连接建立 ...

  6. QT笔记之解决QT5.2.0和VS2012中文乱码 以及在Qt Creator中文报错

    转载:http://bbs.csdn.net/topics/390750169 VS2012 中文乱码 1.方法一: 包含头文件 #include <QTextCodec> ....... ...

  7. Android学习---如何创建数据库,SQLite(onCreate,onUpgrade方法)和SQLiteStudio的使用

    一.android中使用什么数据库? SQLite是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程式庫中.它是D.RichardHipp建立的公有领域项目.SQLite 是一个软件库,实现 ...

  8. python 学习笔记6(数据库 sqlite)

    26. SQLite 轻量级的关系型数据库 SQLite是python自带的数据库,可以搭配python存储数据,开发网站等. 标准库中的 sqlite3 提供该数据库的接口. 1. 基本语法如下 c ...

  9. 解决SQLite数据库中文乱码问题

      关于SQLite中出现中文乱码的分析以及解决方案 我们在使用SQLite数据库时候,可能会发现,向数据库插入数据时候显示的是汉字,但通过SQLite读出来时却显示的乱码,这是因为SQLite数据库 ...

随机推荐

  1. 《FPGA零基础入门到精通视频教程》-第001b讲软件的破解

    高清视频和配套讲义这里下载 http://www.fpgaw.com/thread-68128-1-1.html 优酷视频地址,不是很清楚

  2. Gold Balanced Lineup

    #include<cstdio> #include<cstring> #include<cmath> #include <cstdlib> #defin ...

  3. BZOJ 3065 带插入区间K小值

    http://www.lydsy.com/JudgeOnline/problem.php?id=3065 思路:替罪羊树套权值线段树. 当替罪羊树某个子树大于某个比利(比例)时就暴力重构,本题时间复杂 ...

  4. KeilMDK4.7a下载地址/中文乱码解决/自动关联设置

    推荐地址1,速度更快(确定为4.7a版本,且含注册机):1.http://www.mcuzone.com/software/keil/MDK470.RAR 2.http://kuai.xunlei.c ...

  5. KEIL C51之绝对地址定位

    单片机空间分配看*.M51文件,ARM,DSP空间分配看*.map文件 1.函数定位 假如要把C源文件 tools.c 中的函数 int BIN2HEX(int xx) { ... } 放在CODE ...

  6. 一步一步学习SignalR进行实时通信_7_非代理

    原文:一步一步学习SignalR进行实时通信_7_非代理 一步一步学习SignalR进行实时通信\_7_非代理 SignalR 一步一步学习SignalR进行实时通信_7_非代理 前言 代理与非代理 ...

  7. word页面不对齐,如何解决?

    http://blog.163.com/haibianfeng_yr/blog/static/34572620201157105439516/

  8. HDOJ(HDU) 2083 简易版之最短距离(中位数)

    Problem Description 寒假的时候,ACBOY要去拜访很多朋友,恰巧他所有朋友的家都处在坐标平面的X轴上.ACBOY可以任意选择一个朋友的家开始访问,但是每次访问后他都必须回到出发点, ...

  9. Cgroup - Linux 内存资源管理

    Hi ,我是 Zorro .这是我的微博地址,我会不定期在这里更新文章,如果你有兴趣,可以来关注我呦. 另外,我的其他联系方式: Email: mini.jerry@gmail.com QQ: 300 ...

  10. 共享一个防止脚本重复启动的shell脚本

    项目的一个需求:为防止脚本重复调度,导致同时运行时相互冲突,需要在脚本运行开始前创建一个文件,结束时删除. 脚本启动时判断一下文件是否存在,如果存在则退出. 最开始这样做没发现问题,但跑一段时间后,发 ...