2013-06-25 11 views
10

Ho utilizzato il codice seguente per aprire un file di database SQLite che si trova su un computer di rete da più di un anno ormai quasi quotidianamente. All'improvviso, stamattina, non sono in grado di aprire il file a livello di programmazione.SQLite: impossibile aprire il file di rete in modo programmatico, anche se funzionava prima dello

private Boolean Connect(String strPathFile) 
{ 
    // Initialize the connection object. 
    this.DbConnection = null; 

    try 
    { 
     // DATABASE: Create the connection string and set the settings. 
     String strConnection = @"Data Source=" + strPathFile + @";Version=3;"; 

     // DATABASE: Connect to the database. 
     this.DbConnection = new SQLiteConnection(strConnection); 
     this.DbConnection.Open(); 

     return true; 
    } 

    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 

    return false; 
} 

Il file è una risorsa di rete nella forma "\ Server \ ShareName \ filename.db" (meno le virgolette).

Ecco la cosa interessante. SQLite Administrator non ha problemi ad aprire il file del database di rete, nessuno e più volte. Posso anche aprire il file localmente. Ho copiato il file sul mio disco locale e ho semplicemente modificato il percorso all'interno di Visual Studio 2012 (VS2012).

Il server sembrava soddisfacente. Era passato attraverso un riavvio ad un certo punto dall'ultima volta che l'ho controllato. Presumo un aggiornamento di Microsoft. File Explorer non ha problemi a sfogliare la cartella e, come ho detto, SQLite Administrator può aprire il file di rete.

Ho controllato ancora una volta le autorizzazioni e tutti hanno il controllo completo e gli utenti del server hanno il controllo completo, sia sulle autorizzazioni di sicurezza che sulle autorizzazioni di condivisione. Ho controllato la cartella e il file, e le autorizzazioni sono le stesse. Mi aspettavo tanto, perché SQLite Administrator può aprire il file. Il server non ha un firewall configurato, Windows Firewall o altro. Ho ricontrollato anche stamattina. Di nuovo, l'amministratore di SQLite si sarebbe lamentato di ciò.

Ho verificato la scrittura eseguendo una copia del file sull'unità di rete utilizzando Esplora file. Questo non ha avuto problemi.

Il server è un Windows Server 2003. Utilizzo Windows 7 Professional a 64 bit.

Ho anche provato ad aprire il database in modalità di sola lettura, ma anche questo ha avuto esito negativo. Mi aspettavo questo comportamento. SQLite Administrator funziona ancora bene.

ho provato varie altre stringhe di connessione, tra cui SQLiteConnectionStringBuilder() solo per vedere cosa succede, e tutte le strade portano a Roma, e cioè:

System.Data.SQLite.SQLiteException occurred 
    HResult=-2147467259 
    Message=unable to open database file 
    Source=System.Data.SQLite 
    ErrorCode=14 
    StackTrace: 
     at System.Data.SQLite.SQLite3.Open(String strFilename, SQLiteConnectionFlags connectionFlags, SQLiteOpenFlagsEnum openFlags, Int32 maxPoolSize, Boolean usePool) 
     at System.Data.SQLite.SQLiteConnection.Open() 
     at SQL.cSQL.Connect(String strPathFile) in C:\<Path to source file>:line 367 
    InnerException: 

Pensieri?

+0

La stessa cosa mi è successa dopo l'aggiornamento da .net3.5 a .net4. Nessuna soluzione trovata ancora. :( – henon

+0

Mi ero dimenticato di questo problema, ho fatto qualcosa, purtroppo non ricordo cosa al momento, e il problema è andato via.Non ho fatto nulla di programmatico per risolvere il problema.La risoluzione era qualcosa che ho fatto sul server Si potrebbe voler provare a riavviare il server.Il problema aveva qualcosa a che fare con il blocco dei file o simili –

risposta

-3

Ho appena lasciato un commento che indica quello che ricordo. Non volevo lasciare questo thread senza risposta, quindi ecco cosa ho scritto su ciò che ho ricordato.

Ho fatto qualcosa, purtroppo non ricordo cosa al momento, e il problema è andato via. Non ho fatto nulla di programmatico per risolvere il problema. La risoluzione era qualcosa che ho fatto sul server. Potresti provare a riavviare il server. Il problema aveva qualcosa a che fare con il blocco dei file o simili.

36

nella versione> 1.0.82.0

  1. doppio principali due barre rovesciate nel nome del file (ad esempio "\\\\network\share\file.db").

  2. Utilizzare una lettera di unità mappata.

  3. Utilizzare il costruttore SQLiteConnection che prende l'argomento booleano parseViaFramework e passa 'true' per quell'argomento.

vedere il post di SQL here

+0

Grazie per i pensieri, tuttavia non sarò in grado di provare la risposta fino a quando torno il mio lavoro. temporaneamente, licenziato.Il problema è accaduto sulla mia macchina, ma ha funzionato su altre macchine, quindi non penso che il raddoppio delle barre posteriori funzionerebbe.Sono abbastanza sicuro che ho usato la rete. –

+0

@ranmoro Perché è 2. importante? Ho un problema che quando provo ad accedere a un database senza di esso (il tuo punto 1.) ottengo il "Impossibile aprire il file di database", ma quando provo ad aprire lo stesso database usando la lettera di unità (l'unità è mappato per tutto il tempo, quindi nessuna modifica lì) funziona bene. – gajo357

+1

Grazie, funziona! quindi con la notazione di escape in C# è necessario scrivere 8 backslash: \\\\\\ network \\ share \\ file.db – LoC

1

ho avuto un problema simile. La sostituzione di UNC (\ server \ share \ folder \ file.db) con un percorso di unità mappato (S: \ folder \ file.db) risolve il problema nella mia istanza.

0

Il messaggio di errore è molto fuorviante + irritante. Le applicazioni che funzionano correttamente nell'ambiente locale non vengono avviate all'avvio nella situazione del server client.

Ha principalmente che si accontenta di fare con il codice. Relativo al lato server.

  • Verificare che l'accesso Write sia disponibile per la cartella del server che contiene il file.

  • UNC [percorso server basato su IP] non è ancora supportato, il percorso/cartella di rete deve essere mappato per risolvere questo problema.

  • Alcuni siti + utenti stanno dicendo di menzionare il numero di versione nella stringa di connessione. Tutte le mie applicazioni funzionano perfettamente senza lo.

stringa di connessione:

Data Source=[Mapped Server Location]\[SubFolders]\[FileName].db; 

Aggiornamento:

ho cercato di anteporre \\ al percorso UNC e ha funzionato (ha aggiunto ulteriore \\ nel solo l'inizio, non in-between).

Data Source=\\[UNC]\[SubFolders]\[FileName].db; 
Problemi correlati