Visual Basic Simple
Creare un DSN via codice o con una Wizard
Sincronizza Indice
Sincronizza Indice
Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Ricerca personalizzata

Richiesta di: Gianni Rondinini - 23 Marzo 2000
Difficoltà: 3 / 5

Come si crea un DSN mediante codice Visual Basic?


In un altra richiesta è stato visto come configurare manualmente un DSN mediante il pannello di controllo. A volte può essere molto utile creare un DSN all'interno di un programma, evitando all'amministatore della rete di effettuare quest'operazione.

In questa richiesta saranno mostrate due soluzioni, sebbene ne esista anche una terza, leggermente più complessa, che consiste nel manipolare i valori del registro di Windows.

Per effettuare l'operazione utilizzeremo due funzioni API della libreria ODBCCP32 ovvero la libreria del Pannello di Controllo ODBC. Le due funzioni in questione sono SQLConfigDataSource (per creare il DSN via codice) e SQLCreateDataSource (per richiamare la finestra Wizard guidata).

Figura 1Cominciamo a definire il nostro form che permetterà di creare il DSN voluto.

Inseriremo una serie di coppie di Labele TextBox come mostrato nella figura. Ad ogni Label corrisponde a fianco una TextBox.

Abbiamo inserito anche un Frameper raggruppare visivamente i parametri del DSN.
Al suo interno, oltre le Label e le TextBox abbiamo anche un array (vettore) di due OptionButtondi nome TipoDSN, con indici 0 e 1. Essi serviranno per specificare il tipo di DSN da creare.

In fondo al form abbiamo una CheckBoxdi nome WizardCheck. Per ultimo inseriamo un CommandButtondi nome PulsanteOK.

Prima di vedere il codice cambiamo le proprietà Caption e Text corrispondenti nella maniera visibile nella figura sotto.

Figura 2
Figura 2

La CheckBox in basso determina la modalità di creazione del DSN.
Quando essa è attivata (checked) il DSN sarà creato mediante finestra Wizard guidata, provveduta dal Pannello di Controllo.

Pertanto, l'attivazione della CheckBox andrà a bloccare tutti i controlli riguardanti i parametri del DSN.

Se invece la CheckBox è disattivata il DSN sarà creato mediante codice, leggendo i valori dalle TextBox.

  1. Option Explicit
  2. Private Declare Function SQLConfigDataSource Lib "ODBCCP32.DLL" (ByVal hwndParent As Long, ByVal fRequest As Integer, ByVal lpszDriver As String, ByVal lpszAttributes As String) As Long
  3. Private Declare Function SQLCreateDataSource Lib "ODBCCP32.DLL" (ByVal hwndParent As Long, ByVal lpszDSN As String) As Long
  4. Private Const ODBC_ADD_DSN = 1
  5. Private Const ODBC_ADD_SYS_DSN = 4

Alla riga 2 vediamo la dichiarazione della funzione SQLConfigDataSource che richiede il passaggio di quattro parametri. Il primo parametro (hwndParent) identifica l'handle di una finestra: esso servirà se volessimo richiamare la finestra di dialogo di configurazione del DSN; il secondo parametro (fRequest) è un numero indicante l'operazione da svolgere: in questo nostro esempio indicherà se aggiungere un DSN utente oppure di sistema; il terzo parametro (lpszDriver) indica la stringa contenente il Driver da utilizzare; l'ultimo parametro (lpszAttributes) è una stringa contenente la lista degli attributi da assegnare al DSN, quale il nome utente, la password ed altri.

La dichiarazione della riga 3 identifica la funzione SQLCreateDataSource che verrà utilizzata per richiamare la finestra di dialogo di creazione di un DSN.

La differenza tra le due finestre di dialogo che è possibile richiamare mediante le due funzioni è che la seconda permette di definire in maniera grafica il tipo di DSN da creare ed il driver da utilizzare. In sostanza, la SQLCreateDataSource, dopo aver richiesto tali dati, richiama la funzione SQLConfigDataSource con il driver corrispondente.

Alle righe 4 e 5 abbiamo definito due costanti API, di nome ODBC_ADD_DSN e ODBC_ADD_SYS_DSN, che verranno utilizzate per identificare il tipo di operazione da effettuare. Esse saranno utilizzate nella chiamata alla funzione SQLConfigDataSource.

  1. Private Sub WizardCheck_Click()
  2.     Dim STATO As Boolean
  3.     STATO = (WizardCheck.Value = vbUnchecked)
  4.     ParametriFrame.Enabled = STATO
  5.     NomeDriverLabel.Enabled = STATO
  6.     NomeDriver.Enabled = STATO
  7.     PathDBLabel.Enabled = STATO
  8.     PathDB.Enabled = STATO
  9.     DescrizioneLabel.Enabled = STATO
  10.     Descrizione.Enabled = STATO
  11.     UtenteLabel.Enabled = STATO
  12.     Utente.Enabled = STATO
  13.     PasswordLabel.Enabled = STATO
  14.     Password.Enabled = STATO
  15.     DatabasePredLabel.Enabled = STATO
  16.     DatabasePred.Enabled = STATO
  17.     TipoDSN(0).Enabled = STATO
  18.     TipoDSN(1).Enabled = STATO
  19. End Sub

Vediamo subito la semplicissima funzione che regola l'eventoClick sulla CheckBoxWizardCheck. Alla riga 10 otteniamo lo stato che assegneremo alle varie Label e TextBox in base alla CheckBox. Se il valore è vbUnchecked, ovvero non è attivata, la variabile STATO avrà il valore True, altrimenti sarà False.
Ottenuto tale valore cambiamo lo stato delle proprietà Enabled dei vari controlli, in modo da attivarli o disattivarli in maniera relativa alla CheckBox.

L'ultima funzione riguarda la pressione del pulsante OK.

  1. Private Sub PulsanteOK_Click()
  2.     Dim ODBCSTRING As String
  3.     Dim RISULTATO As Long
  4.     If WizardCheck.Value = vbChecked Then
  5.         ODBCSTRING = NomeDSN.Text
  6.         RISULTATO = SQLCreateDataSource(Me.hWnd, ODBCSTRING)

Alla riga 31 viene verificato lo stato della CheckBox WizardCheck. Se essa è attivata dovrà essere richiamata la funzione mediante interfaccia guidata, altrimenti la creazione avverrà esclusivamente tramite codice.

Se la CheckBox è attivata verrà letto il nome del DSN dalla casella NomeDSN. Tale valore sarà passato alla funzione SQLCreateDataSource. L'handle richiesto dalla funzione sarà quello del nostro form, in modo che la finestra sia richiamata in maniera modale, ovvero essa bloccherà l'esecuzione del codice fintanto che l'operazione non si sarà conclusa.

Il risultato dell'operazione sarà memorizzato nella variabile RISULTATO.

  1.     Else
  2.         ODBCSTRING = "DSN=" & NomeDSN.Text & vbNullChar
  3.         ODBCSTRING = ODBCSTRING & "DBQ=" & PathDB.Text & vbNullChar
  4.         ODBCSTRING = ODBCSTRING & "DESCRIPTION=" & Descrizione.Text & vbNullChar
  5.         ODBCSTRING = ODBCSTRING & "UID=" & Utente.Text & vbNullChar
  6.         ODBCSTRING = ODBCSTRING & "PWD=" & Password.Text & vbNullChar
  7.         ODBCSTRING = ODBCSTRING & "DATABASE=" & DatabasePred.Text & vbNullChar
  8.         ODBCSTRING = ODBCSTRING & vbNullChar
  9.         If TipoDSN(0).Value = True Then
  10.             RISULTATO = SQLConfigDataSource(ByVal 0&, ODBC_ADD_DSN, NomeDriver.Text, ODBCSTRING)
  11.         Else
  12.             RISULTATO = SQLConfigDataSource(ByVal 0&, ODBC_ADD_SYS_DSN, NomeDriver.Text, ODBCSTRING)
  13.         End If
  14.     End If

Se la CheckBox è disattivata il DSN verrà creato mediante codice. Sarà pertanto creata una stringa di connessione, del tutto simile a quella da utilizzare per richiamare il DSN al fine di utilizzare il database cui punta il DSN.

La stringa di connessione si compone di una serie di coppie di valori. Ogni coppia contiene il proprio nome ed il valore. Una coppia è separata dalla successiva mediante un carattere terminatore (il carattere il cui codice ASCII è 0) corrispondente alla costante vbNullChar.

La stringa conterrà il nome del DSN, l'origine dati cui punta, la descrizione, il nome utente, la password e il database predefinito in case di database multipli (righe 34-39).
La stringa deve concludersi con un carattere terminatore aggiuntivo (riga 40).

Creata la stringa sarà possibile richiamare la funzione di creazione del DSN. In questo esempio abbiamo inserito due OptionButton per determinare se il DSN deve essere di sistema oppure utente. Pertanto, alla riga 41, viene controllato se il primo OptionButton è attivato.

In base a tale controllo viene richiamata la funzione API SQLConfigDataSource e le verrà passata la costante corrispondente al tipo di DSN da creare. Oltre a tale valore sarà passato anche il nome del driver (letto dalla casella di testo NomeDriver) e la stringa di connessione ODBCSTRING (righe 42 e 44). Il valore restituito dalla chiamata alla funzione API sarà memorizzato nella variabile RISULTATO.

  1.     If RISULTATO <> 0 Then
  2.         MsgBox "Creazione DSN riuscita!", vbInformation + vbOKOnly, "Crea DSN"
  3.     Else
  4.         MsgBox "Creazione DSN fallita!", vbCritical + vbOKOnly, "Crea DSN"
  5.     End If
  6. End Sub

È giunto il momento di controllare se la chiamata alla funzione di creazione del DSN ha avuto effetto. Sarà controllato il valore della variabile RISULTATO.

Se il risultato è diverso da 0 la creazione è riuscita e sarà mostrato un messaggio informativo (riga 50). Nel caso contrario sarà mostrato un messaggio di errore (riga 52).


Possiamo passare alla prova del programma. Eseguiamo il progetto, riempiamo i campi con i dati in maniera corretta.

Figura 3
Figura 3

È fondamentale impostare il nome del DSN e il nome del driver.
In caso di mancato riempimento degli altri campi il DSN sarà comunque creato, ma il suo funzionamento dipende dalla corretta specificazione degli altri dati.

L'elenco dei driver utilizzabili è reperibile nel gestore dei DSN nel Pannello di Controllo alla voce Drivers.

Figura 4L'attivazione della CheckBox WizardCheck comporta la disattivazione delle varie Label e TextBox insieme al Frame che le contiene.

La pressione del pulsante OK in questa situazione non creerà il DSN direttamente ma porrà una serie di domande e richieste all'utente.

Figura 5
Figura 5
In ogni caso, mediante utilizzo di interfaccia guidata o no, al termine del tentativo di creazione sarà mostrata una finestra di messaggio. Figura 6
Figura 6

Fibia FBI
25 Marzo 2001

Scarica il progetto
Scarica il progetto
Scarica il testo dell'articolo
Scarica il testo dell'articolo
Stampa l'articolo
Stampa l'articolo
Torna all'introduzione delle Richieste dei lettori