LINUX.ORG.RU

Как открыть dbf Qt?

 , , , ,


0

1

Пытаюсь открыть name_dbf.dbf в qt выдает ошибку с ниже приведенным кодом

...
QSqlDatabase db_ODBC = QSqlDatabase::addDatabase("QODBC", "name_dbf");
    db_ODBC.setConnectOptions();
    db_ODBC.setDatabaseName("name_dbf");
    if (!db_ODBC.open()) {
        if (QMessageBox::warning(&w, "Не найден ODBC-источник данных","text"))
        {
            return -1;
        }
    }
...



Последнее исправление: bad_master (всего исправлений: 1)

bool QSqlDatabase::open()

Opens the database connection using the current connection values. Returns true on success; otherwise returns false. Error information can be retrieved using lastError().

QSqlError QSqlDatabase::lastError() const

Returns information about the last error that occurred on the database

Надеюсь, дальше догадаешься

XMs ★★★★★
()
Ответ на: комментарий от XMs

Ну да, но опять же драйвер есть, а вот насчет имени базы данных в dbf я не уверен https://imgur.com/a/r4R1YzQ

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 1)
Ответ на: комментарий от bad_master

Судя по документации, в setDatabaseName():

void QSqlDatabase::setDatabaseName(const QString &name)

Sets the connection's database name to name. To have effect, the database name must be set before the connection is opened. Alternatively, you can close() the connection, set the database name, and call open() again.

Note: The database name is not the connection name. The connection name must be passed to addDatabase() at connection object create time.

For the QSQLITE driver, if the database name specified does not exist, then it will create the file for you unless the QSQLITE_OPEN_READONLY option is set.

Additionally, name can be set to ":memory:" which will create a temporary database which is only available for the lifetime of the application.

For the QOCI (Oracle) driver, the database name is the TNS Service Name.

For the QODBC driver, the name can either be a DSN, a DSN filename (in which case the file must have a .dsn extension), or a connection string.

For example, Microsoft Access users can use the following connection string to open an .mdb file directly, instead of having to create a DSN entry in the ODBC manager:

// ...
QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};DBQ=myaccessfile.mdb");
if (db.open()) {
    // success!
}
// ...

There is no default value.

XMs ★★★★★
()
Ответ на: комментарий от XMs

у меня этот дбф файл открывается в libreoffice нормально, я вот не знаю как называется имя бд этого файла и правильно ли я его разместил в проекте qt creatore чтобы его видно было программе

bad_master
() автор топика
Ответ на: комментарий от XMs

при том что я не пойму он видит из папки билда файл или из папки проекта или еще откуда-то(настраеваемо)

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 1)
Ответ на: комментарий от superuser

ёпт я взял драйвер и кусок кода из работающего проекта(не из туториала qt), но файл не открывается, но он файл дбф другой немного, и файл называется по другому и имя базы данных в нем похоже тоже другое

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 2)
Ответ на: комментарий от bad_master

Используй QCoreApplication::applicationDirPath, ну либо как уже подсказали используй абсолютный путь. Относительный путь начинается с QDir::currentPath, а он меняется в зависимости откуда запускается программа.

Dr64h ★★★
()
Ответ на: комментарий от Dr64h

да я понял что никто не знает структуру этих двух методов QSqlDatabase::addDatabase(«QODBC», «name_dbf»); db_ODBC.setDatabaseName(«name_dbf»); как и я

bad_master
() автор топика
Последнее исправление: bad_master (всего исправлений: 1)
Ответ на: комментарий от bad_master

Отладка запускается из папки билда конечно. Хотя ты в Projects-Run можешь указать и любой другой Working directory.

И ещё, проверь, что у тебя кути собраны(в генте это qtbase для qt6 и qtsql для qt5) с поддержкой odbc. А то я на днях переводил проект на Qt6 и пол часа потерял из-за того что по умолчанию dev-qt/qtbase был собран без поддержки mysql.

Если не принципиально использование именно ODBC, то вот что нашел

https://github.com/IvanPinezhaninov/QDbf

Loki13 ★★★★★
()
Последнее исправление: Loki13 (всего исправлений: 1)
Ответ на: комментарий от bad_master

Открытие базы через ODBC производится драйвером ODBC. Сам Qt к этому отношения не имеет, и задавать имя базы нужно в форме Connection string как указано в документации к ODBC-драйверу. Более того, если открываем базу по ODBC в винде, то нужно сначала зарегистрировать эту базу как источник данных в специальной тулзе, доступной через панель управления. Там уже назначишь имя своей базе, и можно будет к ней через ODBC обращаться.

static_lab ★★★★★
()