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. H.264 Transform

    变换是视频.图像编码的核心部分.目前所采用的变换算法都是从傅里叶变换演变而来.单纯的变换并不会导致视频(图像)的码率变小,反而会增大.但是非常巧妙的一点是:变换把图像从空域转换成的时域,把由色块组成的 ...

  2. C51 延时程序

    一.相关换算 1.1s=10^3ms(毫秒)=10^6μs(微秒)=10^9ns(纳秒)=10^12ps(皮秒)=10^15fs(飞秒)=10^18as(阿秒)=10^21zm(仄秒)=10^24ym ...

  3. Wi-Fi定位,AP定位

    Wi-Fi实时定位系统 基于Wi-Fi的无线局域网实时定位系统(Wi-Fi RTLS)结合无线局域网络(WLAN).射频识别(RFID)和实时定位等多种技术,广泛地应用在有无线局域网覆盖的区域,实现复 ...

  4. 王学长的LCT标程

    善良的王学长竟然亲自打了一遍QAQ好感动QAQ #include<iostream> #include<cstdio> #include<cmath> #inclu ...

  5. Windows 7 中未能从程序集System.ServiceModel

    Windows 7 中未能从程序集System.ServiceModel   “/”应用程序中的服务器错误.   未能从程序集“System.ServiceModel, Version=3.0.0.0 ...

  6. 在linux下文件转码

    在linux下转码命令: iconv  -f utf-8 a.txt > b.txt

  7. 利用PyQt4写的小工具软件

    应公司文职工作人员需求,写一个车间人员工作时间的统计软件,输入开始工作时间1,再输入结束工作时间2,计算两个时间的差值. 根据需求,初步构想的UI界面如下: 下面开始干活. 分析后觉得利用PyQt4来 ...

  8. javascript获取对应页面的代码

    window.onload = function () { function getUrls(url) {//核心代码是url2这行代码,通过.replace()方法将对应的字符串替换成其他方式 va ...

  9. lesson4:使用锁Lock来解决重复下单的问题

    demo源码:https://github.com/mantuliu/javaAdvance 中的类Lesson4IndependentLock 在上一节中,我们分析了Lock的源代码并一起实践了粗粒 ...

  10. Runtime.getRuntime().addShutdownHook(shutdownHook);

    今天在阅读Tomcat源码的时候,catalina这个类中使用了下边的代码,不是很了解,所以google了一下,然后测试下方法,Tomcat中的相关代码如下: Runtime.getRuntime() ...