VB 2010 copiare DB nella directory di output?

di il
9 risposte

VB 2010 copiare DB nella directory di output?

Salve ragazzi,
come al solito sono alle prese con problemi, che per voi saranno problemini, che non mi consentono di proseguire lo sviluppo della mia applicazione.
Nella mia applicazione windows form ho implementato un Db con Sql Compact 3.5 e in un form ho impostato vari controlli, tra cui un bindingNavigator, effettuando il binding sui dati di una tabella specifica.
Tutto funziona correttamente ma se voglio effettuare modifiche a questa tabella devo per forza impostare, nelle proprietà del file del database la voce "Non copiare" e contestualmente devo copiare il file del db nella cartella di debug. Questo mi crea il problema che nel server explorer non posso vedere i dati aggiornati nella tabella in questione, perchè il file del db a cui punta il server explorer, di fatto, non è quello della cartella di debug.
Con le altre 2 opzioni di quella proprietà (Copia sempre e Copia se più recente) il database non viene minimamente aggiornato.
Quale impostazione devo modificare per lavorare sul file del db originale?
In poche parole non ho capito bene come lavora quella proprietà del db.

9 Risposte

  • Re: VB 2010 copiare DB nella directory di output?

    Ciao alsa,
    una soluzione è fare il contrario, inviare l' output nella cartella del DB. Per farlo vai nelle proprietà del progetto Compile\Build output Path.
    Usare bin\Debug e/o bin\Release non è obbligatorio, anzi a volte è decisamente scomodo, specie quando il programma manipola db o file.
  • Re: VB 2010 copiare DB nella directory di output?

    Grazie mille Barba, è la fine di un incubo per me
    Ma a questo punto mi sorge un dubbio, quando vorrò provare l' applicazione su un altro pc, dopo aver fatto il build del progetto, quale eseguibile dovrò copiarmi? E inoltre, dovrò copiarmi anche il file del Db?
  • Re: VB 2010 copiare DB nella directory di output?

    Ciao alsa,
    Dipende da tante cose, comunque da quello che ho capito stai facendo una applicazione che si collega a un db che risiede nella stessa cartella in cui si trova l' applicazione. In questo caso per installare il programma è sufficiente creare una cartella metterci l' eseguibile e il db (a meno che il db non lo crei l' applicazione stessa all' avvio).

    Poi ovviamnente nel sistema deve essere stato installato l' Sql Compact (però se non vuoi installarlo è sufficiente che ti porti dietro 5/6 dll).

    P.S. Sull' argomento non sono ferratissimo per cui prendi quello che ti dico con qualche riserva.
  • Re: VB 2010 copiare DB nella directory di output?

    Ecco, questa è un altra nota dolente, come faccio a far creare il database con le tabelle vuote alla prima esecuzione del programma? Nel senso che io adesso sulla macchina che sto utilizzando per lo sviluppo ovviamente sto facendo un pò di prove, come faccio ad evitare che nel db del cliente risultino i miei record di prova? VB ne genera uno nuovo quando faccio il build dell' applicazione?
  • Re: VB 2010 copiare DB nella directory di output?

    Ciao alsa,
    ti scrivo del codice che dovrebbe andarti bene, non ho avuto il tempo di provarlo, è scritto in C# ma tanto cambia poco:
    
           string fileName = ...; // path del file
           if (File.Exists(fileName))
               return;
    
           string connectionString = "Data Source='" + fileName + "'";
           using (SqlCeEngine engine = new SqlCeEngine(connectionString))
           {
                 engine.CreateDatabase();
           }
    
    In pratica con la classe SqlCeEngine puoi creare un database vuoto. Poi se con delle query "CREATE TABLE ..." puoi creare le tabelle:
    
    using (SqlCeConnection con = ... ) // crei la connessione
    {
         con.Open();
    
         string query = "CREATE TABLE Logs (Id INT IDENTITY NOT NULL PRIMARY KEY, ... ecc ...  
         using (SqlCeCommand com = new SqlCeCommand(query, con))
         {
               com.ExecuteNonQuery();
         }
     
    bisogna fare lo using di using System.Data.SqlServerCe;
  • Re: VB 2010 copiare DB nella directory di output?

    Grazie mille Barba, avevo immaginato una cosa del genere, appena ho 10 minuti implemento questo codice e provo.
    Nel frattempo ti chiedo un ultima cosa (per ora ) volendo far girare l' applicazione su più di un pc contemporaneamente posso creare una cartella condivisa sul server che collego come unità di rete su tutti i pc, con la stessa lettera di unità (es. R:\), e al cui interno inserisco il file del db?
    Se non sbaglio sql compact riesce a gestire fino a 256 connessioni, mi confermi questa cosa o mi sbaglio?
  • Re: VB 2010 copiare DB nella directory di output?

    Si certo, se hai una cartella condivisa in rete più client possono usare lo stesso db.
  • Re: VB 2010 copiare DB nella directory di output?

    Ciao Barba,
    riprendo questa discussione per chiederti un ulteriore informazione, sto provando a far girare la mia applicazione su un altro pc ma ovviamente si porta dietro la connectionstring al file che uso durante la compilazione, come faccio a cambiare il percorso in cui deve trovare il database?
    Anche se copio lo stesso DB usato per le prove non mi interessa per il momento, voglio solo capire se gira su un altro pc.

    Grazie
  • Re: VB 2010 copiare DB nella directory di output?

    Se usi una cartella condivisa il rete (come dicevi in un post precedente) il problema non si pone, il path è sempre lo stesso, ad esemipo R:\MyFolder\db.sdf (se colleghi l' unità sempre con la stessa lettera), oppure usi il percorso di rete, ad es. \\192.168.0.1\MyFoleder\db.sdf oppure \\MyComuter\MyFolder\db.sdf.

    Se invece il programma accede al database semplicemente cercandolo nella stessa cartella in cui si trova l' eseguibile o in una sua sottocartella basta usare Application.StartupPath o AppDomain. Ad esempio:
    
    string myFolder = AppDomain.CurrentDomain.BaseDirectory; // oppure Application.StartupPath
    string dbPath = Path.Combine(myFolder, "db.sdf");
    
    string connectionString = "Data Source='" + dbPath + "'";
    SqlCeConnection con = new SqlCeConnection(connectionString);
    
    Anche se sposti la cartella contenente l' eseguibile e il db altrove, anche su un altro pc, continua a funzionare.

    Se poi per qualche motivo i percorsi devono essere diversi su pc differenti, puoi sempre leggere il path da un file di configurazione, su un pc scriverai 'c:\folder1\db.sdf e su un altro pc scriverai un path differente.
Devi accedere o registrarti per scrivere nel forum
9 risposte