Qt:无法打开包括文件:“QtSql”:没有那个文件或目录。

3
这可能是一个重复的问题,但找到的答案没有解决我的问题。我正在尝试在QT中创建一个客户端服务器应用程序,其中客户端发送一个字符串消息代码给服务器,服务器必须连接到SQL服务器数据库并检索与客户端消息代码相关的数据。 下面是我目前编写的服务器部分。但是我得到了这个错误:无法打开包括文件:'QtSql':没有这样的文件或目录。当我制作独立项目并运行数据库部分时,它工作得很好,但当我将它们放在一起时,它失败了。 有人有一些建议来解决这个问题吗?
ServerSocket.pro
QT       += core
QT       += network
QT       += sql
QT       -= gui

TARGET = ServerSocket
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app


SOURCES += main.cpp \
    server.cpp

HEADERS += \
    server.h

ServerSocket.h

#ifndef SERVER_H
#define SERVER_H

#include <QObject>
#include <QDebug>
#include <QTcpServer>
#include <QTcpSocket>


class Server : public QObject
{
    Q_OBJECT
public:
    explicit Server(QObject *parent = 0);

signals:

public slots:
    void newConnection();
private:
    QTcpServer *server;

};

#endif // SERVER_H

ServerSocket.cpp

#include "server.h"
#include <QtSql>

Server::Server(QObject *parent) :
    QObject(parent)
{
    server = new QTcpServer(this);
    connect(server, SIGNAL(newConnection()),this,SLOT(newConnection()));
    if(!server->listen(QHostAddress::Any,1234)){
        qDebug() << "Server could not start";
    } else {
        qDebug() << "Server started";
    }
}
void Server::newConnection(){
    QTcpSocket *socket = server->nextPendingConnection();
    socket->write("hello client");
    socket->waitForBytesWritten(1000);
    socket->waitForReadyRead(1000);
    QString appCode = socket->readAll();

    QString servername = "LOCALHOST\\SQLEXPRESS";
    QString dbname = "ApplicationsDB";
    QString connectionTemplate = "DRIVER={SQL SERVER};SERVER=%1;DATABASE=%2;";
    QSqlQuery query;
    QStringList results;


    QString connectionString = connectionTemplate.arg(servername).arg(dbname);
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

    db.setDatabaseName(connectionString);

    if (db.open())
    {
        qDebug() << "Opened";
        query = db.exec("select Code from Application a where a.Name = '") + appCode + "';";
        while (query.next())
        {
            QString result = query.record().value(0).toString();
            results.append(result);
        }
        for(QString res : results){
            qDebug() << res;
        }
    }
    else
    {
        qDebug() << "Error = " << db.lastError().text();
    }
    db.close();
}

这是哪个操作系统?使用的编译器是什么?你是否通过VERBOSE=1检查了包含路径? - László Papp
操作系统 - Windows 7;编译器 MSVC 2012 - laura
尝试使用-d选项运行qmake,以查看是否设置了includepath,但我认为你应该尝试进行清理,因为我无法重现此问题。您是否已正确安装SQL,就像通过官方qt安装程序安装其他模块一样? - László Papp
是的,一切都已经正确安装。如果我运行一个单独的项目,在该项目中执行查询到 SQL 数据库时,不会出现任何错误。 - laura
1
@LaszloPapp,我解决了这个问题:右键单击项目/解决方案名称,然后单击“运行qmake”选项,重新构建并运行应用程序。它完美地工作了。你能否给出一个可以接受的答案?谢谢。 - laura
感谢您的回来。现在已经完成了,但是以后参考:您可以自己做。如果您认为这是技术上最好的,甚至可以接受您自己的答案。很高兴现在它正在工作。 - László Papp
1个回答

5

我认为这一切都很顺利。确保正确重新运行qmake。

遗憾的是,必须明确执行此操作,因为当您修改项目文件时,它尚未自动识别需要重新运行qmake的情况。


1
当不确定时,我先执行save-all命令,关闭Qt Creator,并删除所有构建文件和*.user文件,然后重新加载Qt Creator。这几乎可以解决所有问题。但要小心保持已加载脚本环境变量的控制台打开状态。 - kayleeFrye_onDeck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接