13 messaggi dal 27 giugno 2002
Buongiorno a tutti.

Mi stavo studiando la tecnologia Clickonce e mi sembra particolarmente interessante.

Un aspetto che però mi è ancora oscuro è questo: sto sviluppando un applicazione in Visual Basic 2005 Express Edition con DB Acces (ma vorrei che questa discussione vertesse anche su altri db).

Quando 'Pubblico' l'applicazione mi genere correttamente tutti i file del progetto e l'installer funziona eregiamente anche in aggiornamento.

Vorrei però fare in modo che, almeno per il database, venisse chiesto all'utente (durante la prima installazione o al primo avvio dell'applicazione) dove lo vuole mettere (supponiamo che abbia un ambiente LAN client/server) o dove si trova (nel caso per esempio di server SQL/ORACLE). Nei successivi aggiornamenti vorrei che questa impostazione venisse conservata.

Ho cercato un po' in giro ma non ho trovato niente che facesse al caso mio.

Grazie.
501 messaggi dal 09 giugno 2006
Contributi
Ciao.
ClickOnce è davvero interessante ma ti invito a verificarne bene le caratteristiche leggendo la tabella di comparazione con Windows Installer che puoi trovare al seguente link: http://msdn2.microsoft.com/en-us/library/142dbbz4.aspx

Ci sono alcuni limiti che potrebbero essere vincolanti come, a titolo di esempio, la necessità di eseguire l'installazione per ogni singolo utente (non puoi installare l'installazione nel computer e farla usare a tutti gli account - questo limite, a dir la verità, implica un vantaggio ossia non è necessario essere amministratori del computer per installare il programma), accesso limitato al registry di sistema in fase di installazione (è possibile accedere solo alla chiave HKEY_LOCAL_MACHINE), impossibilità di personalizzare l'interfaccia utente di installazione (che forse è quello di cui hai bisogno) e, infine, alcuni possibili limiti di sicurezza. Questo ultimo argomento non va sottovalutato se hai bisogno di accedere ad un database. Se si tratta infatti di database su file (es. Access) dovrai richiedere esplicitamente il permesso FileIOPermission, se usi SQL Server, invece, dovrai richiedere il permesso SqlClientPermission (oppure OleDbPermission se usi System.Data.OleDb). Vedi: http://msdn2.microsoft.com/en-us/library/d8saf4wy.aspx

Il mio personale suggerimento è quello di gestire tutti gli aspetti di configurazione del database (percorso, tipo, ecc.) come funzione di amministrazione del tuo programma e non come step di installazione. Questa soluzione ti permette, tra le altre cose, di modificare la configurazione di una workstation senza necessità di eseguire nuovamente la procedura di installazione. A tale proposito usando ClickOnce dovrai stare particolarmente attento anche al metodo di gestione dei Settings dell'applicazione (vedi http://msdn2.microsoft.com/en-us/library/ms228995.aspx).

Ciao.

.:. Marcello Rutter .:.
13 messaggi dal 27 giugno 2002
Ciao mrdev.

Innanzitutto grazie per la risposta.
La tabella che mi hai sottoposto l'avevo già vista.

Devo dire che quello che dici è ragionevole.
Clickonce lo trovo particolarmente interessante per la facilità di distribuzione degli aggiornamenti (la possibilità di aggiornare il pc senza l'intervento dell'amministratore di rete).

Il dover installare l'applicazione su ogni utente invece sinceramente è un po' scomoda, ma... non si può avere tutto!

Tornando a noi: sono d'accordo sull'opportunità di creare una sezione amministrativa nel programma per configurare le connessioni ai db, ma dove e come le scrivo nei file di configurazione...? E come faccio perchè mi rimangano invariati nei successivi aggiornamenti?

Pensavo al caso in cui ci sia un sistemista (o chi per lui) che fa una prima installazione e configurazione) e poi gli aggiornamenti siano effettuabili da chiunque.

Stavo quindi crecando esempi o soluzioni di chi aveva già smanettato in questa situazione.

Ciao.
501 messaggi dal 09 giugno 2006
Contributi
Beh, direi che puoi tranquillamente utilizzare gli Application Settings (http://msdn2.microsoft.com/en-us/library/k4s6c3a0(VS.80).aspx e http://msdn2.microsoft.com/en-us/library/8eyb2ct1(VS.80).aspx) creando i diversi parametri di configurazione con scopo "User" (questo perché i parametri con scopo User possono essere modificati/salvati mentre quelli con scopo Application possono essere solo letti ma non salvati).

Se usi questa tecnica, ClickOnce è in grado di mantenere aggiornati i file di configurazione anche a seguito di aggiornamenti secondo le regole descritte in http://msdn2.microsoft.com/en-us/library/ms228995(vs.80).aspx.

In alternativa (ed io ho usato spesso questa tecnica) puoi utilizzare gli IsoltaedStorage. Qualche esempio pratico:
http://www.codeproject.com/dotnet/IsolatedStorageMadeEasy.asp
http://www.codeproject.com/dotnet/appdata.asp
ma puoi trovare molto altro ancora su questo argomento. Il vantaggio principale degli IsolatedStorage è il fatto che non richiedono nessun privilegio specifico tant'è che vengono utilizzati molto in applicazioni Silverlight. Basta prestare attenzione alla dimensione massima disponibile per i tuoi dati (http://msdn2.microsoft.com/en-us/library/4fzedtyx(vs.80).aspx) che in .NET dipende dalle Permission Set assegnate alla tua applicazione oppure configurate appositamente dall'Amministratore di sistema (in Silverlight la quota disponibile è di 1 Mb).

Ciao.

.:. Marcello Rutter .:.
13 messaggi dal 27 giugno 2002
Sigh, sob..!!! Sto scornato con Application Settigs e IsolatedStorage e non ci cavo i piedi...

Allora: ricapitolo quello che vorrei fare.
Ho un applicazione che punta a un db Access che non è nella cartella |Data Directory|..., ma sta su un'unità di rete L:\Cartella\database.mdb.

Ho creato un form nell'applicazione dove chiedo il percorso del db e lo salvo nel file di configurazione app.exe.config in questo modo
<applicationSettings>
<NomeApp.My.MySettings>
<setting name="OleDBConnString" serializeAs="String">
<value>Provider=Microsoft.Jet.OLEDB.4.0;Data Source=L:\Cartella\database.mdb</value>
</setting>
</NomeApp.My.MySettings>
</applicationSettings>

e in un IsolatedStorage nella cartella ..\NomeApp\NomeApp.set

Il mio intento era quello di, all'avvio dell'applicazione, leggere il file NomeApp.set che contine il percorso del db e scriverlo nel file app.exe.config per essere sicuro che in seguito ad aggiornamenti non mi venisse resettato al valore di default...

Il problema è che quando faccio un aggioramento mi si crea un'altra struttura di cartelle nell'IsolatedStorage e quindi l'applicazione non trova più il file NomeApp.set... e così sono di nuovo da capo!!

Vorrei semplicemente che, in seguito, ad aggiornamenti non mi venissero persi i paramentri di connessione al db... E così difficile o sono io che mi sto complicando la vita?!?
501 messaggi dal 09 giugno 2006
Contributi
Ciao.

Prima di andare troppo avanti con la discussione, puoi scrivere in quale modo apri lo store (parametri di GetStore) ossia quale enumeratore IsolatedStorageScope hai specificato?

.:. Marcello Rutter .:.
13 messaggi dal 27 giugno 2002
Questo è il codice che eseguo all'evento Load del form di avvio:

Dim strSubDirectory As String = "NomeApp"
Dim strFileName As String = "NomeApp.set"

Try
Dim store As IO.IsolatedStorage.IsolatedStorageFile = _ IO.IsolatedStorage.IsolatedStorageFile.GetUserStoreForAssembly

'Verifica che la directory specificata esista
Dim directories() As String = store.GetDirectoryNames(strSubDirectory)

'Se non esiste, mostra un messaggio ed esce
If directories.Length = 0 Then
MsgBox("La cartella non esiste.", MsgBoxStyle.Critical)
Exit Sub
End If

Dim files() As String = store.GetFileNames(strSubDirectory & "\" & strFileName)

If files.Length = 0 Then
MsgBox("Il file non esiste.", MsgBoxStyle.Critical)
Exit Sub
End If

Dim storeFile As New IO.IsolatedStorage.IsolatedStorageFileStream(strSubDirectory & "\" & strFileName, IO.FileMode.Open, store)

Dim storeReader As New IO.StreamReader(storeFile)
'Scrive la strina di connessione nel file di configurazione
Dim config As Configuration
config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)

Dim grpApp As ConfigurationSectionGroup
grpApp = config.GetSectionGroup("applicationSettings")

Dim secPropSet As ClientSettingsSection
secPropSet = CType(grpApp.Sections("NomeApp.My.MySettings"), ClientSettingsSection)

secPropSet.SectionInformation.ForceSave = True

Dim elm As SettingElement
elm = secPropSet.Settings.Get("OleDBConnString")
elm.Value.ValueXml.InnerText = storeReader.ReadLine

config.Save()

storeReader.Close()
storeFile.Close()
store.Close()

Catch ex As IO.IsolatedStorage.IsolatedStorageException
MsgBox("Lettura fallita dall'Isolated Storage" & Environment.NewLine & _
ex.ToString, MsgBoxStyle.Critical)
Catch ex As IO.FileNotFoundException
MsgBox("File non trovato:" & Environment.NewLine & ex.ToString, MsgBoxStyle.Critical)
Catch ex As IO.IOException
MsgBox("Errore di I/O: " & ex.ToString, MsgBoxStyle.Critical)
Catch ex As Exception
MsgBox(ex.ToString, MsgBoxStyle.Critical)
End Try

Dopo un aggiornamento mi compare il messaggio "La cartella non esiste." perchè contestualmente all'aggionamento dell'applicazione si è creato un altro albero di cartelle all'interno di IsolatedStorage, ma senza il file che avevo salvato prima...
501 messaggi dal 09 giugno 2006
Contributi
Scusa, cerco ancora di capire bene lo scenario.

Per quale ragione hai deciso di utilizzare sia l'una che l'altra soluzione? Mi spiego: personalmente avrei impiegato gli IsolatedStorage in alternativa ad altre tecniche ma dal momento che usi il file di configurazione non vale la pena impiegare gli IsolatedStorage anche solo per fare una copia dei parametri (semmai, a questo punto, consenti all'utente di esportare/importare i parametri così questa funzione potrebbe tornarti utile per impiegare gli stessi parametri su più PC).

Ora, premesso che vado a memoria quindi potrei sbagliarmi, ClickOnce non dovrebbe sovrascrivere la configurazione dell'applicazione bensì fare il merge (questo vale sempre con riferimento a quanto poi precisato nei documenti MSDN che ti ho segnalato).

Per quanto riguarda la perdita della directory (IsolatedStorage) credo che il motivo dipenda, come hai intuito, da ClickOnce che installa l'aggiornamento ogni volta in una posizione diversa (in quanto nel percorso locale viene inclusa anche la versione). Su questo problema avevo letto, tempo fa, alcune possibili soluzioni che però non ho mai testato personalmente. Semmai nei prossimo post possiamo tornare sopra questo argomento se lo riterrai ancora utile.

Alla prossima.

.:. Marcello Rutter .:.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.