Gestire un database in rete

giovedì 17 aprile 2008 - 10.05

jtpsala Profilo | Senior Member

Un saluto a tutti gli utenti di questo Forum.
Vorrei porre una domanda.
L'applicazione che ho creato in vb2008 si interfaccia con un database .mdb collocato sul disco "C:" del mio computer. Vorrei mettere però questo database su un server così potrei acceredervi dai vari client. Come posso fare a scrivere nell'applicativo il percorso del database che si trova sul server?
O magari, ho visto dei programmi che al termine della loro installazione sui client appare una finestra nella quale si può andare a cercare il percorso del database, ovunque lui si trovi posizionato e dopo salva la stringa di connessione?

Premetto che per poter accedere ai dati del database, ho utilizzato l'autocomposizione di vb2008, il quale al termine della procedura ha creato automaticamente il BindingSource e i vari componenti per l'aggiornamento e l'esplorazione dei dati.

Ringrazio in anticipo.

Alnath Profilo | Newbie

Ciao, metti il DB sul server e poi nel tuo programma gli dai come percorso al posto di "C:\..." il percorso di rete
"//Nome_del_server/cartella_condivisa/Data_Base.mdb"
Spero di esserti stato utile.

jtpsala Profilo | Senior Member

Grazie per avermi risposto.
Il problema è che io non so come si chiama il server. Volevo creare all'interno dell'applicazione .exe una finestra dal quale cercare il database sul servere ed infine salvare la stringa di connessione nello stesso .exe, ma il problema è che non so come fare. Tu puoi aiutarmi?
Ringrazio in anticipo.

Alnath Profilo | Newbie

Scusa il ritardo ma ho visto solo ora...
ti spiego come ho risolto in una mia applicazione:
ho prima di tutto utilizzato una OpenDialogBox per selezionare il file e passato la stringa del percorso intero del file stesso in una chiave all'interno di un file .ini che, quest'ultimo, viene letto all'apertura dell'applicazione.
E' più complicato a dirsi che a farsi, credimi.
Se vuoi ti posso postare il codice, potrebbe servirti come esempio di partenza, ma ora sono fuori casa e quindi devi portare un pò di pazienza...

jtpsala Profilo | Senior Member

Si grazie mille. Attendo il tuo esempio.

Alnath Profilo | Newbie

Ecco l'esempio :-))

Nel modulo modINI questo codice...
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

e nella form quest'altro...
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Spero che l'esempio ti sia d'aiuto.

jtpsala Profilo | Senior Member

Grazie mille per l'esempio. Sei stato gentilissimo.
Ciao.

Mau67 Profilo | Expert

Salve ho letto questo post è mi interessa la risposta che è stata data, io a differenza di jptsala 78 ho l'appicazione in vs2005 che si interfaccia con un database.mdf (SQLServer 2005) anche io ho utilizzato l'autocomposizione di vs2005 il quale ha creato il BindingSource e i vari componenti per l'aggiornamento.

Ho provato il codice inserito nel modulo di classe


Imports System.IO

Public Class modIni

#Region " Dichiarazione API "

Private Declare Auto Function GetPrivateProfileString Lib "kernel32.dll" _
(ByVal lpApplicationName As String, ByVal lpKeyName As String, _
ByVal lpDefault As String, ByVal lpReturnedString As String, _
ByVal nSize As Integer, ByVal lpFileName As String) As Integer

Private Declare Auto Function WritePrivateProfileString Lib "kernel32.dll" _
(ByVal lpApplicationName As String, ByVal lpKeyName As String, _
ByVal lpString As String, ByVal lpFileName As String) As Integer

#End Region

Friend Shared Sub CreaFile(ByVal FileName As String)
If Not (File.Exists(FileName)) Then File.Create(FileName)
End Sub

Friend Shared Function Leggi(ByVal FileName As String, ByVal Section As String, ByVal Key As String)
Dim Result As String
Dim RetVal As String = New String(" ", 255)
Dim LenResult As Integer

LenResult = GetPrivateProfileString(Section, Key, "", RetVal, RetVal.Length, FileName)

If LenResult = 0 Then
Dim ErrString As String

'Qui vengono incapsulati gli errori
If Not (File.Exists(FileName)) Then
ErrString = "Impossibile trovare il file " & FileName & "."
Else
ErrString = "Impossibile eseguire l'operazione: sezione o chiave errate oppure accesso al file non consentito."
End If
End If

Result = RetVal.Substring(0, LenResult)
Return Result
End Function

Friend Shared Sub Scrivi(ByVal FileName As String, ByVal Section As String, ByVal Key As String, ByVal Value As String)
Dim LenResult As Integer

LenResult = WritePrivateProfileString(Section, Key, Value, FileName)

If LenResult = 0 Then
Dim ErrString As String

'Qui vengono incapsulati gli errori
If Not (File.Exists(FileName)) Then
ErrString = "Impossibile trovare il file " & FileName & "."
Else
ErrString = "Impossibile eseguire l'operazione: accesso al file non consentito."
End If
End If
End Sub

End Class


Qui tutto bene

Poi ho costruito un form è ho inserito il seguente codice che hai postato

Public Class frmConfig

Private Sub frmConfig_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

updateFrmControls()
End Sub

Private Sub updateFrmControls()
Try '<----------------------------------------------
lblDBfilename.Text = IO.Path.GetFileName(sDBfile)
lblDBpercorso.Text = sDBfile 'IO.Path.GetFullPath(sDBfile)

Catch ex As Exception
'Non mostra nessun errore
lblDBfilename.Text = ""
lblDBpercorso.Text = ""
End Try '<------------------------------------------
End Sub


#Region " Azioni pulsanti "

Private Sub btn_SelectDB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn_SelectDB.Click
Try
With OpenFileDialog
.Reset()
.CheckFileExists = True
.Title = sApplicazione
.Filter = "Database Access|*.mdb"
.ShowDialog()
End With

If Not OpenFileDialog.FileName = "" Then
sDBfile = OpenFileDialog.FileName
lblDBfilename.Text = IO.Path.GetFileName(sDBfile)
lblDBpercorso.Text = sDBfile
End If

Catch ex As Exception
MsgBox(ex.Source & vbCrLf & ex.Source & vbCrLf & ex.Message)
sDBfile = ""
lblDBpercorso.Text = sDBfile
End Try
End Sub

Private Sub btnSalvaImpostazioni_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvaImpostazioni.Click
SetIniFile()

'Refresha la form di configurazione
updateFrmControls()
End Sub

#End Region


#Region " Creazione / Lettura / Salvataggio / Default files .ini "

Private Sub CreateIniFiles()
modIni.CreaFile(sdotInfoPath)
modIni.CreaFile(sDBxPath)

'Assegna i valoridi default
DefaultIniFile()
End Sub

Private Sub LoadIniFiles()
Try
'* Legge il file .ini
sDBfile = modIni.Leggi(sDBxPath, "Generale", "file")

Catch ex As Exception
CreateIniFiles()
End Try
End Sub

Private Sub SetIniFile()
'* Setta il file .ini
modIni.Scrivi(sDBxPath, "Generale", "file", sDBfile)
End Sub

Private Sub DefaultIniFile()
'* Scrive il file .ini di default
modIni.Scrivi(sDBxPath, "Generale", "file", "")

LoadIniFiles()
End Sub

#End Region

End Class


qui ho i seguenti problemi e li evidenzia come errori:

sApplicazione
sDBfile
sDBxPath

Come posso adattare al mio progetto questo codice?

Grazie in anticipo

Mau67

Alnath Profilo | Newbie

Ciao e scusa, non avevo specificato nell'esempio la dichiarazione delle variabili generali del mio progetto:
sApplicazione
sDBfile
sDBxPath
Sono tutte variabili string, quindi:
Public sApplicazione As String = "mia applicazione"
Public sDBfile As String 'Nome del file
Public sDBxPath As String 'Percorso dove risiede il file .ini

Mau67 Profilo | Expert

Ciao
Ho inserito le variabili

Public sApplicazione As String = "mia applicazione"
Public sDBfile As String 'Nome del file
Public sDBxPath As String 'Percorso dove risiede il file .ini
Public sdotInfoPath As String

Spiegami bene
Public sApplicazione As String = "mia applicazione" per mia applicazione cosa intendi il nome del progetto?

Public sDBfile As String 'Nome del file Per nome file cosa intendi?

Public sDBxPath As String 'Percorso dove risiede il file .ini qui ho inserito il percorso del classe

Quando è tutto funzionante dove salva la stringa di percorso delle tabelle?
Grazie



Mau67

Alnath Profilo | Newbie

Ricapitoliamo:

Public sApplicazione As String = My.Application.Info.productName.ToString
Public sDBxPath As String = Path.GetDirectoryName(Application.ExecutablePath) & "\DBx.ini" 'Percorso del file .ini
Public sDBfile As String 'Stringa di percorso del file database

praticamente il file di configurazione DBx.ini viene salvato e cercato nella directory della tua applicazione; la stringa sApplicazione serve per dare la stessa intestazione alle MsgBox mentre sDBfile è la stringa di percorso del database selezionato che viene salvata all'interno del file di configurazione DBx.ini.

Spero ora sia più chiaro di prima...

Mau67 Profilo | Expert

Ok adesso mi genera il file DBx dove all'interno è salvata la stringa di connessione.

Adesso per fargli leggere la stringa di connessione come faccio?

Visto che Visual studio 2005 quando fai il percorso guidato del collegamento al database ti apre una maschera dall'ide per la selezione (ti allego il file per farti capire cosa intendo), e successivamente genera un file app.config dove scrive il seguente codice che serve per la connessione al database:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="TRATECO.My.MySettings.TabelleConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Programmi\TRATECO\Tabelle.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
<system.diagnostics>
<sources>
<!-- Questa sezione definisce la configurazione di registrazione per My.Application.Log -->
<source name="DefaultSource" switchName="DefaultSwitch">
<listeners>
<add name="FileLog"/>
<!-- Per scrivere nel log eventi dell'applicazione, rimuovere il commento dalla sezione sottostante -->
<!--<add name="EventLog"/>-->
</listeners>
</source>
</sources>
<switches>
<add name="DefaultSwitch" value="Information" />
</switches>
<sharedListeners>
<add name="FileLog"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
initializeData="FileLogWriter"/>
<!-- Per scrivere nel log eventi dell'applicazione, rimuovere il commento dalla sezione sottostante e sostituire APPLICATION_NAME con il nome dell'applicazione -->
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
</configuration>

a questo puno come faccio a fargli leggere il percorso generato nel file DBx?

Scusa ma è la prima volta che mi inbatto in questo e che programmo da poco

Ciao e grazie

Mau67

Alnath Profilo | Newbie

Ciao, hai provato ad inserire nell'evento OnLoad della form

sDBfile = modIni.Leggi(sDBxPath, "Generale", "file")
nome_controllo_al_quale_associare_il_DB.Souce = sDBfile

se le tabelle non cambiano ed é solo una questione di percorso dove risiede il DB, dovrebbe funzionare...
al limite si potrebbero generare i componenti a te necessari direttamente via codice, senza appoggiarsi ai componenti generati dalla procedura guidata...

Mau67 Profilo | Expert

avendo in un file config inserito nel progetto con questa struttura:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="TRATECO.My.MySettings.TabelleConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Programmi\TRATECO\Tabelle.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
<system.diagnostics>
<sources>
<!-- Questa sezione definisce la configurazione di registrazione per My.Application.Log -->
<source name="DefaultSource" switchName="DefaultSwitch">
<listeners>
<add name="FileLog"/>
<!-- Per scrivere nel log eventi dell'applicazione, rimuovere il commento dalla sezione sottostante -->
<!--<add name="EventLog"/>-->
</listeners>
</source>
</sources>
<switches>
<add name="DefaultSwitch" value="Information" />
</switches>
<sharedListeners>
<add name="FileLog"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
initializeData="FileLogWriter"/>
<!-- Per scrivere nel log eventi dell'applicazione, rimuovere il commento dalla sezione sottostante e sostituire APPLICATION_NAME con il nome dell'applicazione -->
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
</configuration>


ho la necessità di modificare solo questa stringa:

<add name="TRATECO.My.MySettings.TabelleConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=C:\Programmi\TRATECO\Tabelle.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True"
providerName="System.Data.SqlClient" />

con il sistema del file ini come faccio?

Grazie
Mau67
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5