You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

重装QT后QSqlDatabase数据库连接失败求助

重装Qt后ODBC数据库连接失败问题

我因调试器故障重装了Qt,未修改任何数据库连接器相关代码,但现在无法连接SQL Server数据库,报错提示驱动未找到。

头文件(databaseconnector.h)

// databaseconnector.h
#ifndef DATABASECONNECTOR_H
#define DATABASECONNECTOR_H

#include <QObject>
#include <QSqlDatabase>
#include <QSqlQuery>

class DatabaseConnector : public QObject
{
    Q_OBJECT

public:
    explicit DatabaseConnector(QObject *parent = nullptr);
    ~DatabaseConnector();

    bool connectToDatabase(const QString &serverName, const QString &dbName);
    void disconnectFromDatabase();
    QSqlDatabase getDatabase(){return m_database;};
private:
    QSqlDatabase m_database;

    bool openConnection();
    void closeConnection();
};

#endif // DATABASECONNECTOR_H

源文件(databaseconnector.cpp)

// databaseconnector.cpp
#include "databaseconnector.h"
#include <QDebug>
#include<QSqlError>

DatabaseConnector::DatabaseConnector(QObject *parent) : QObject(parent)
{
}

DatabaseConnector::~DatabaseConnector()
{
    disconnectFromDatabase();
}

bool DatabaseConnector::connectToDatabase(const QString &serverName, const QString &dbName)
{
    qDebug()<<serverName;
    qDebug()<<dbName;
    m_database = QSqlDatabase::addDatabase("QODBC");
    QString dsn = QString("DRIVER={SQL Server};SERVER=%1;DATABASE=%2;Trusted_Connection=Yes;").arg(serverName).arg(dbName);
    m_database.setDatabaseName(dsn);

    return openConnection();
}

void DatabaseConnector::disconnectFromDatabase()
{
    closeConnection();
}

bool DatabaseConnector::openConnection()
{
    if (m_database.isOpen())
        return true;

    if (m_database.open()) {
        qDebug() << "Connected to database successfully!";
        return true;
    } else {
        qDebug() << "Error connecting to database:" << m_database.lastError().text();
        return false;
    }
}

void DatabaseConnector::closeConnection()
{
    if (m_database.isOpen()) {
        m_database.close();
        qDebug() << "Disconnected from database";
    }
}

数据库连接实例化代码

MainWindow::MainWindow(C_User* user, QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    // 尝试连接数据库
    if (m_dbConnector.connectToDatabase(R"(DESKTOP-RTLB2TI\SQLEXPRESS)", "Formula1nou")) {
        qDebug() << "Connected to database successfully!";
    } else {
        qDebug() << "Failed to connect to database!";
    }

    // 初始化用户界面
    ui->setupUi(this);
    this->user = user;

    // 额外配置
    ui->toolBar->setMovable(false);

    centerWindow(this);
}

报错信息

Error connecting to database: "[Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified [Microsoft][ODBC Driver Manager] Invalid connection string attribute, IM002;01S00 QODBC: Unable to connect"

解决方法

  • 匹配Qt架构与ODBC驱动版本:重装Qt后,确认Qt的位数(32/64位)和系统安装的SQL Server ODBC驱动位数一致。可通过控制面板→管理工具→ODBC数据源查看已安装驱动版本,若不匹配则安装对应位数的驱动。
  • 更新连接字符串驱动名称:旧的{SQL Server}驱动已被弃用,改用微软推荐的驱动标识,例如{ODBC Driver 17 for SQL Server},修改DSN字符串为:
    QString dsn = QString("DRIVER={ODBC Driver 17 for SQL Server};SERVER=%1;DATABASE=%2;Trusted_Connection=Yes;").arg(serverName).arg(dbName);
    
  • 验证Qt ODBC插件:检查Qt安装目录下plugins/sqldrivers文件夹是否存在qsqlodbc.dll(Windows),同时在代码中添加qDebug() << QSqlDatabase::drivers();,若输出无QODBC,则需重新安装Qt并勾选SQL Drivers组件中的ODBC选项。
  • 手动测试数据库连通性:通过ODBC数据源管理器创建DSN并测试连接,排除数据库服务未启动、权限不足等服务器端问题。

内容的提问来源于stack exchange,提问作者Valentin Axinescu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 17:16:19