PDA

Visualizza la versione completa : [C++] SQLite e creazione DB read-only


DEPY
06-05-2012, 18:39
Vediamo se qualcuno mi sa aiutare, se no butto nel cesso Sqlite e ritorno ai vecchi sistemi.
Dunque sto scrivendo un software in C++. I dati li tengo dentro un file sqlite, che interfaccio con la classe CppSQLite3. Quando creo un nuovo file, lo apro senza problemi, ci creo le tabelle con le istruzioni DML, e ci posso mettere tutto quello che voglio, nessun problema. quando finisco, il software esegue la close tranquillamente e tutto si chiude senza problemi. Poi rilancio il software, apro il file appena creato lo leggo e ci trovo tutto quanto vi ho messo nella sessione precedente ma..... se tento di scrivere un nuovo record mi da errore di File in ReadOnly. Ora assicuro che la open viene fatta in modalit ReadWrite, non da errore in fase di apertura, e non ci sono altri processi che hanno il file aperto. L'unica altra spiegazione sarebbe che la directory dove si trova il file sia Readonly essa stessa, ma allora come possibile che se ricreo il file (delete e open in modo Create) me lo fa fare? Specifico questo perche lavoro in windows 7 (maledetta la volta che ho lasciato il mio fido XP) e come sapete marchia di default tutte le directory in readonly (va a sapere perche) ho provato anche a creare una nuova directory ma anche se non mi risulta read only, non c' verso di aprire in write questo benedetto file. Inoltre io uso "SQLite manager" per controllare che i files siano scritti correttamente dal mio software, e dal manager il file si scrive tranquillamente. Chi sa darmi qualche suggerimento a riguardo? :messner:
Ringrazio per ogni suggerimento che mi metta sulla buona strada. Ho allegato uno dei files incriminati.... non si sa mai

denis76
07-05-2012, 20:39
Uso sqlite da anni e problemi del genere mai avuti.
Dove lo tieni il file? In c:\programmi ?

DEPY
07-05-2012, 21:49
si in effetti non me lo so spiegare, allora alcuni dati, si tratta di una applicazione MFC compilata con il Visual Studio 2010. l'archivio ovunque si trova da lo stesso problema. Il programma, viceversa si trova in una path del disco C:, C:\Users\Spock\Documents\Visual Studio 2010\Projects\PlanBuilder\Debug.

questo quanto. sarebbe interessante vedere se sul tuo PC, dando l'exe e un file da lo stesso problema.....

denis76
07-05-2012, 22:16
L'altro giorno ho avuto un problema molto strano con un programma che ha un suo database (non sqlite) con WIndows 7, installato in c:\programmi.
Ebbene, il programma non girava.
Se apri i file da quella cartella ne vedi il contenuto.
Se copi i file da qualche altra parte e poi li apri i file sono vuoti.
Sembra che Windows 7 si tenga a mente le versioni dei file (ne fa il backup) per cui quando li copi in verit ti d una copia dei file all'atto dell'installazione cio vuoti.
Ho risolto ricollocando il tutto in c:\cartella. Il programma ha cominciato a funzionare.

DEPY
07-05-2012, 23:00
grazie per il suggerimento, ci provo, tanto a sto punto, prova piu prova meno..... ma sono scettico. ma no, adesso che ci penso ho gi provato anche quella prova e niente, viceversa mi viene in mente che in un'altra applicazione l'apertura del file rompeva se la path era troppo lunga... adesso provo.
Pensa che volevo compilare sqlite come libreria statica, e andarci dentro a vedere dove si bloccava ma, indovina un po, il compilatore da degli errori strani, per cui non posso compilare la libreria......

DEPY
07-05-2012, 23:05
anche questa prova fallisce...... :bh: :dh:

denis76
07-05-2012, 23:09
Non possibile sai. sqlite da una vita che funziona. Non che hai qualche antivirus che ti combina qualcosa?

DEPY
07-05-2012, 23:40
ma no... se no non me lo farebbe creare il file.... o non me lo farebbe aprire in lettura! Guarda sto tentando di fare un progetto nuovo, con tre bottoni Crea, Open scrivi. Ma sto imprecando perche linkando la libreria di sqlite mi dice:

nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj)
1>C:\Users\Spock\Documents\Visual Studio 2010\Projects\PlanBuilder\Debug\sqltest.exe : fatal error LNK1169: one or more multiply defined symbols found
1>
1>Build FAILED.
1>
1>Time Elapsed 00:00:00.60
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

mentre nel progetto originale nessun problema. Ma mi sovviene una cosa. Per potere linkare la DLL in modo diretto, mi sono creato da solo il file .lib... funziona tutto ma.... che dici? mi sembra strano, in genere se il lib non giusto il programma va in crash!

denis76
08-05-2012, 10:10
Prova ad andare nel mio sito. Trovi un programmino minimale che si chiama CroceBoss. Esso gestisce un database sqlite dove si trova l'eseguibile. Prova a copiarlo qua e l e prova a vedere se ti funziona.
Su Xp si lascia usare in qualsiasi punto del disco si possa leggere e scrivere.

DEPY
08-05-2012, 14:09
ti ringrazio ma ho fatto la stessa cosa anche io e.... allora facendo un programma a bottoni, quindi aprendo chiudendo e scrivendo con bottoni differenti funziona. allora ho incluso il codice nel programma origonale, che da problemi, mettendo un menu con le varie voci... funziona ma.... un passo indietro, si tratta di una applicazione mdi dove ogni documento apre un file differente. se apro il documento mfc, e quindi apro il file associato e poi tento di scrivere mi da errore di read only ma se con il bottone lo chiudo e poi lo riapro sempre dal menu... magicamente funziona...... ci sto girando intorno ma, a parte circoscrivere il problema non ho capito cosa . adesso tento invece di tenere il file aperto, lo apro e lo chiudo solo quando serve. ora sono in aereoporto se ne parla domani quando sar arrivato a Pechino.....

Loading