database - 在 Linux 中打开 MS Access 文件

标签 database linux qt odbc

我正在尝试在 Linux 中使用 QT 打开 MS Access 数据库文件。

所以,我已经使用 unixODBC 安装了 Easysoft MS Access ODBC 驱动程序。这是我的 odbc.ini 文件:

[Easysoft ODBC-ACCESS]
Description = MS Acess db driver
Driver = /usr/local/easysoft/access/lib/libesmdb.so
Setup = /usr/local/easysoft/access/lib/libesmdbS.so

并且有 odbcinst.ini 文件:

[ACCESS_SAMPLE]
Driver = Easysoft ODBC-ACCESS
mdbfile = /home/user/personal_base.mdb

此外,我还为 qt 安装了 odbc 插件:

sudo apt-get install libqt4-sql-odbc

现在如何在 Linux 中使用 Qt 打开 mdb 文件?

在 MS Windows 中我这样做:

bool createConnection()
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
    db.setDatabaseName("Driver={Microsoft Access Driver (*.mdb, *.accdb)};DSN='';DBQ=C:/personal_base.mdb");
    if (!db.open()) {
        QMessageBox::warning(0, QObject::tr("Database Error"), db.lastError().text());
        return false;
    }
    return true;
}

我尝试将 db.setDataBaseName 更改为

...
db.setDatabaseName("Driver={Easysoft ODBC-ACCESS};DSN='ACCESS_SAMPLE'");
...

但它返回一个错误:

[unixODBC][Driver Manager]Data source name not found, and no default driver specified QODBC3: Unale to connect 

怎么了?

最佳答案

下面是我用来构建正确的 DSN 的一些代码,以便从 Mac、Linux 和 Windows 连接到 SQL Server。我相信您的代码中的连接字符串不正确。也许它会帮助您入门。

QString SQLServerProvider::buildDSN(QString server, QString database, QString username, QString password)
{
#ifdef Q_WS_MACX
    QString dsn = QString("DRIVER=/usr/local/lib/libtdsodbc.so;SERVER=%1;TDS_VERSION=8pClient;DATABASE=%2;PORT=1433;UID=%3;PWD=%4;").arg(server).arg(database).arg(username).arg(password);
#endif

#ifdef Q_WS_X11
    QString dsn = QString("DRIVER={FreeTDS};SERVER=%1;TDS_VERSION=8.0;PORT=1433;DATABASE=%2;UID=%3;PWD=%4;").arg(server).arg(database).arg(username).arg(password);
#endif

#ifdef Q_WS_WIN
    QString dsn = QString("DRIVER={SQL SERVER};SERVER=%1;DATABASE=%2;UID=%3;PWD=%4;").arg(server).arg(database).arg(username).arg(password);
#endif
    return dsn;
}

我知道您正在尝试连接到 Microsoft Access 数据库,但如果您替换 Q_WS_X11 部分中的 FreeTDS 和其他一些参数,也许这对您有用。我以前没有使用过 Easysoft ODBC-ACCESS,所以我不能 100% 确定应该如何为此驱动程序格式化 DSN。读一读here如果您还没有这样做,因为它解释了如何使用 isql 测试 ODBC DSN 连接。如果您需要进一步的帮助,请告诉我,我会尽力提供帮助。

关于database - 在 Linux 中打开 MS Access 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15576840/

相关文章:

php - 调用未定义的方法 Illuminate\Auth\GenericUser::fill()::when update

linux - 这个 shell 命令是什么意思 "exec 3>&1 >>(logger -t "OKOK")"

c++ - 用鼠标移动 QGraphicsRectItem

linux - linux 内核支持多少个 vrf,哪些系统资源限制了 vrf 数量?

c - 仅在可继承集中拥有能力意味着什么?

c++ - Qt - 建立一个项目

c# - .NET中是否有类似于Qt::QueuedConnection的东西?

mysql - 使用 where 类中的相同表更新表

php - 更改后刷新页面而不重置搜索查询

database - Oracle ALL_UPDATABLE_COLUMNS 内容