Dostęp do bazy z kilku programów jednocześnie

0

Witam.

Mam aplikację/bazę danych stworzoną w środowisku Ms Access, z której na co dzień korzystają pracownicy, jednak aplikacja ta ma swoje wady które niepotrzebnie wydłużają czas pracy na niej. Z uwagi na powyższe postanowiłem stworzyć program, który przyśpieszałby pracę z ww. aplikacją i docelowo być może ją zastąpił, udostępniając przy okazji nowe funkcjonalności.

Wykorzystując sterownik ODBC udało mi się połączyć z bazą danych i podejrzeć tabele oraz dane w niej przechowywane i wszystko byłoby cacy gdyby nie kilka problemów, z czego pierwszym i najbardziej uciążliwym, na chwilę obecną, jest ten polegający na tym, że gdy najpierw uruchomiona zostanie aplikacja stworzona w MsAccess na której pracują pracownicy, to nie można się połączyć z bazą danych z mojego programu --> pojawia się błąd:

QSqlError("1", "QODBC3: Unable to connect", "[Microsoft][Sterownik ODBC Microsoft Access ] Nie można użyć pliku '(nieznane)'; plik jest już w użyciu. [Microsoft][Sterownik ODBC Microsoft Access ]Ostrzeżenie ogólne Nie można otworzyć klucza rejestru 'Temporary (volatile) Jet DSN for process 0x1f50 Thread 0x10f8 DBC 0x76af8c Jet'.")

Natomiast gdy najpierw połączę się z bazą danych, a dopiero później zostanie uruchomiona aplikacja, to wszystko działa jak należy, mało tego --> można później uruchamiać kolejne instancje mojego programu i łączyć się z nich z bazą danych bez żadnych problemów.

Po kilkudniowym bezskutecznym przeszukiwaniu google'a polsko i anglojęzycznego, znalazłem jedynie informację, że zapewne chodzi o to, że program nie ma dostępu do jakiegoś klucza rejestru, przy czym nic więcej na ten temat nie było (jak np. tego jak się uporać z tym problemem).

Pewno to do niczego nie potrzebne, ale poniżej podaję metodę łączącą się z bazą danych:

bool MDBDatabase::connect(QString userName, QString password, QString databaseName, QString hostName)
{
    db = QSqlDatabase::addDatabase("QODBC", QString("MDB%1Connection%2").arg(databaseName).arg(this->databaseName[databaseName]));
    db.setDatabaseName("DRIVER={Microsoft Access Driver (*.mdb)};FIL={MS Access};DBQ="+this->file);
    db.setHostName( hostName );
    db.setUserName( userName );
    db.setPassword( password );

    bool ok = db.open();

    if ( ok ) {
        ++(this->databaseName[databaseName]);
    }

    qDebug() << '\n' << db.lastError() << " -- db open: " << db.isOpen() << " -- connectionName: " << QString("MDB%1Connection%2").arg(databaseName).arg(this->databaseName[databaseName]);

    QSqlQueryModel *model = new QSqlQueryModel();

    for (size_t i=0; i<db.tables().size(); ++i) {
        qDebug() << "\n" << db.tables()[i];

        model->setQuery("select * from "+db.tables()[i], db);
        for (size_t j=0; j<model->rowCount(); ++j) {
            qDebug() << model->record(j);
        }

    }

    return ok;
}

Więc --> co zrobić aby mieć możliwość łączenia się z bazą gdy uruchomiona jest już zewnętrzna aplikacja operująca na tej bazie danych?

//-------------------------------------------------------------

Dodatkowe obserwacje: gdy z bazą łączy się mój program jako pierwszy, to zawartość tworzonego pliku *.ldb wygląda jak chińskie 'znaczki'. Natomiast zarówno po uprzednim lub późniejszym połączeniu z bazą poprzez istniejącą aplikację, zawartość pliku zmienia się i zawiera w sobie nazwę komputera oraz użytkownika. Tak jakby mój program łączył się z bazą danych w jakiś dziwny sposób. Nie wiem czy ma to jakiś związek ze sprawą, bo Accessa za bardzo nie znam.

Ps. Nie, nie jest możliwe (przynajmniej na chwilę obecną) aby uruchamiać tworzony przeze mnie program jako pierwszy -- zresztą trudno byłoby tego wymagać gdyż dostęp do bazy danych odbywa się z kilku lokalizacji w Polsce o różnych porach dnia i nocy.

Ps.2. Nie mam możliwości modyfikowania kodu aplikacji stworzonej w MsAccessie (a przynajmniej nic mi o tym nie wiadomo..).

W razie pytań proszę pytać, w razie pomysłów proszę śmiało pisać gdyż jestem otwarty na wszystkie.

0

baza accessowa nie jest zbyt dobrym rozwiązaniem dla aplikacji wielostanowiskowych.
Zawsze możesz spróbować http://support.microsoft.com/kb/304932

1 użytkowników online, w tym zalogowanych: 0, gości: 1