2014-11-19 2 views
0

У меня есть два отдельных приложения, один размещенных на производство другой в офисе, и мне нужно, чтобы получить копиюSQLite базы данных генерироваться и обновляться на стороне производства.базы данных Импорт SQLite с использованием Qt/QSqlDatabase

До сих пор я пытался два approches:

  1. Скопируйте весь SQLite файл из продакшн-приложения и «переориентировать» мои QSqlDatabase-ручки к этому файлу (не в состоянии заставить его работать, многие соединения уже открыты и не все закрываются)
  2. Получите доступ к sqlite-db по сети, запросите все данные и вставьте отсутствующие данные с помощью sql (работает, но поскольку много данных требуется слишком много времени)

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

Использование: Qt 4.8, SQLite, Windows 7, VS2010

+0

Скопируйте файл в локальный каталог temp, а затем используйте API-интерфейс резервного копирования для замены базы данных. –

+0

Файл уже скопирован по резерв-ископаемым.................................... Thanks – Robert

+0

@CL. работает как шарм! Спасибо за ваш совет. Добавьте его в качестве ответа, и я подниму его и соглашусь с ним :-) – Robert

ответ

0

Итак, наконец, я смог достичь своей цели с помощью SQLite резервного копирования (API, который распространяется в .h и .c с большинством версий Qt). На странице документации SQLite Backup есть несколько примеров, где база данных копируется либо из файла в оперативную память, либо из встроенной памяти в файл. В моем случае я использовал следующую функцию (1: 1 с док страницы, только несколько комментариев удалены):

int loadOrSaveDb(sqlite3 *pInMemory, const char *zFilename, int isSave){ 
    int rc;     /* Function return code */ 
    sqlite3 *pFile;   /* Database connection opened on zFilename */ 
    sqlite3_backup *pBackup; /* Backup object used to copy data */ 
    sqlite3 *pTo;    /* Database to copy to (pFile or pInMemory) */ 
    sqlite3 *pFrom;   /* Database to copy from (pFile or pInMemory) */ 

    /* Open the database file identified by zFilename. Exit early if this fails 
    ** for any reason. */ 
    rc = sqlite3_open(zFilename, &pFile); 
    if(rc==SQLITE_OK){ 

    pFrom = (isSave ? pInMemory : pFile); 
    pTo = (isSave ? pFile  : pInMemory); 

    pBackup = sqlite3_backup_init(pTo, "main", pFrom, "main"); 
    if(pBackup){ 
     (void)sqlite3_backup_step(pBackup, -1); 
     (void)sqlite3_backup_finish(pBackup); 
    } 
    rc = sqlite3_errcode(pTo); 
    } 

    (void)sqlite3_close(pFile); 
    return rc; 
} 

Единственные дополнительные шаги, чтобы получить ручку, необходимую в приведенной выше функции были:

1. Получить SQLITE-ручку с QSqlDatabase

QVariant destVar = database.driver()->handle(); 

2.check ручка для действия и приведение к sqlite3 *

if(destVar.isValid() && qstrcmp(destVar.typeName(), "sqlite3*") == 0) 
{ 
    sqlite3* destination = *static_cast<sqlite3 **>(destVar.data()); 
    ... 
} 

Благодаря CL. (который указывал в правильном направлении).

Смежные вопросы