Сегодня внезапно я не могу добавить столбец через драйвер odbc в qt в своей базе данных access

#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 работает. Добавление столбца с другим именем работает. Добавление новой таблицы с «Значком» может сработать. И это сработало, когда я впервые попробовал это сделать. Я никогда не видел такого странного поведения.