QT与SQL(二):数据库中文信息读取乱码

最近,在使用QT的QODBC进行SQL 2008 R2数据库的通信连接时,遇到了一个问题,这里就将该问题进行一下记录。

访问Microsoft SQL Server 2008R2数据库内的一张数据表,表中信息除了数字之外,还有一部分中文信息,中文信息的数据类型设置为nvchar(50),在数据库中的存储情况如下:

尝试对该信息进行读取,读取代码如下:

qDebug()<<"数据库中文字符读取";
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    QSqlQuery *query=new QSqlQuery(db);
    db.setHostName("192.168.1.1");
    db.setDatabaseName(QString("DRIVER={SQL SERVER};SERVER=%1;DATABASE=%2").arg("192.168.1.1").arg("Test"));
    db.setUserName("account");
    db.setPassword("password");
    db.open();
    if(db.isOpen())
    {
        QString cmd=QString("select * from MachAlarmMsg");
        query->exec(cmd);
        while(query->next()) qDebug()<value(3).toString();
    }
    else qDebug()<<("数据库打开失败,失败原因为:"+db.lastError().text());

 

使用上述代码读取数据库,通信成功,但是读出的中文信息却是乱码。

QT与SQL(二):数据库中文信息读取乱码_第1张图片

对上述代码进行分析,QT正常显示中文字符(由提示输出信息可以看出),则问题出在QT对sql数据库中文信息的解码上,但是nvchar对应Unicode编码集,而qt也已设定了UTF-8编码,故问题较难处理。

之前已编写过类似功能,中文字符无乱码现象,将今次代码与之前代码比较,发现有一不同之处,根据不同修改已有代码:

 qDebug()<<"数据库中文字符读取";
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    QSqlQuery *query=new QSqlQuery(db);
    db.setHostName("192.168.1.1");
    db.setDatabaseName(QString("DRIVER={SQL SERVER};SERVER=%1;DATABASE=%2").arg("192.168.1.1").arg("Test"));
    db.setUserName("account");
    db.setPassword("password");
    db.open();
    if(db.isOpen())
    {
        //新增语句
        query->clear();
        QString cmd=QString("select * from MachAlarmMsg");
        query->exec(cmd);
        while(query->next()) qDebug()<value(3).toString();
    }
    else qDebug()<<("数据库打开失败,失败原因为:"+db.lastError().text());

只是在query执行查询指令之前,新增query的清除指令,即query->clear(),中文字符的读取即恢复正常,如下:

QT与SQL(二):数据库中文信息读取乱码_第2张图片

QT对该函数的解释如下:

清除结果集,并释放其持有的资源。设置query状态为不活跃状态。如非必要,不应使用该函数。

从QT的说明上,无法看出其与中文字符有什么关联,希望有高手可以予以说明。

你可能感兴趣的:(数据库)