#c #sql #qt #ms-access #odbc
Вопрос:
Я использую Qt 5.15.2 и в настоящее время пишу адресное приложение. (Замена старого инструмента mfc). Мы храним адресные данные в базе данных ms access.
Вчера я написал код для добавления столбца для хранения значка компании. Это сработало идеально. Я тестирую его несколько раз. В то время никаких проблем не было. После работы я закрыл свой блокнот. Сегодня я попробовал это еще раз, и вдруг это больше не работает.
Вот некоторые подробности:
openDatabase(); int iFind = kkp::DaoFindField(m_pDb, "Adressen", "Icon"); if (iFind lt; 0) { kkp::CDaoTableDef td(m_pDb); td.Open("Adressen"); td.CreateField("Icon", kkp::DataTypeEnum::dbText, 0); td.Close(); }
Функция openDatabase выглядит следующим образом:
void KKP_Adressen::openDatabase() { QString sFilename = m_sAppPath "/Adressen/Adressen.mdb"; m_pDb = new kkp::CDaoDatabase(); bool bOpen = m_pDb-gt;Open(sFilename.toStdWString().c_str()); Q_ASSERT_X(bOpen , "KKP_Adressen::openDatabase()" , "unable to open database"); }
Не смущайтесь всеми этими названиями Dao, исходящими из mfc. План состоит в том, чтобы не переписывать все системы, использующие инструмент адреса, а только изменять внутреннюю функцию этой библиотеки. Я попробовал даже это, и это работает. И пусть вас не смущают эти преобразования строк. Это потому, что это библиотека, которая экспортирует функции и классы, пригодные для стандартного (нейтрального) c , чтобы ее могли использовать mfc и qt. Но внутренне я должен сделать несколько преобразований, поэтому.
Создание столбца на самом деле довольно просто: создайте QSqlQuery и выполните инструкцию
QSqlQuery q(*db); QString sQuery = "ALTER TABLE " QString::fromStdWString(m_sTblName) " ADD COLUMN "; std::wstring sColDefinition = m_cols.at(i); sQuery = QString::fromStdWString(sColDefinition); if (!q.exec(sQuery)) { QString sErr = q.lastError().text(); Q_ASSERT_X(false, QString::fromStdWString(__FUNCTIONW__).toStdString().data(), sErr.toStdString().data()); }
Утверждение на самом деле выглядит так (скопировано из отладчика):
ALTER TABLE Adressen ADD COLUMN Icon LONGTEXT
сообщение об ошибке выглядит следующим образом (также скопировано):
[Microsoft][ODBC Microsoft Access Driver] Das Datenbankmodul konnte die Tabelle 'Adressen' nicht sperren, da sie bereits von einem anderen Benutzer oder Vorgang bearbeitet wird. QODBC3: Unable to execute statement
Что означает примерно следующее: я не могу открыть базу данных для изменения, потому что она уже используется кем-то другим.
Я не менял код между рабочим статусом и статусом сбоя. Я могу удалить фактический файл mdb и вернуть его из subversion. Я могу открыть его с помощью доступа и изменить его. Не было никакого центра обновления Windows или чего-то еще. У меня совершенно нет идей, что там может быть не так…
У кого-нибудь есть идеи?
Комментарии:
1. Зачем вообще беспокоиться о коде для добавления полей? Откройте доступ, откройте таблицу в режиме конструктора, добавьте поле.
2. этого нельзя сделать. Эта база данных поставляется путем установки каждому клиенту. Он может ввести там свои собственные адреса. Поэтому я не могу заменить файл mdb, но должен его изменить. и выполнение этого вручную примерно для 3000 клиентов может стать «сложной задачей».
3. Я только что понял, что делать то же самое с другой таблицей в базе данных полностью работает. Иногда я действительно впадаю в отчаяние из-за того, что не понимаю технологий Microsoft.
4. Как часто вы вызываете openDatabase() и когда вы его закрываете?
5. Это я тоже проверил. Я открываю его один раз, а затем сразу же пытаюсь добавить эту колонку. Ни один другой процесс не использует это. Как это странно. Выполнение этого с помощью mfc работает. Добавление столбца с другим именем работает. Добавление новой таблицы с «Значком» может сработать. И это сработало, когда я впервые попробовал это сделать. Я никогда не видел такого странного поведения.