Eseguire query su database differenti

Articolo che spiega come realizzare un programma che permette di eseguire query su diversi database.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

In questo articolo vedremo come realizzare una semplcie applicazione che permette di eseguire le query su database differenti, in particolare nell'articolo vedremo come effettuare la select su un database di tipo Microsoft Access e Microsoft Sql Server, il tutto utilizzando le librerie Enterprise Library, di Microsoft.

Creazione del progetto

Si crea un progetto di tipo Windows Application, selezionando il linguaggio di programmazione di proprio interesse.

Nella form, inserimano alcuni controlli come una label, una textbox e due pulsanti.

I pulsanti avranno il compito di eseguire le query che viene per i vari database, un pulsante per il database Access e l'altro per il pulsante SQL.

Stesura del codice

Passiamo in visualzzazione codice ed aggiungiamo lo spazio dei nomi riguardante la gestione dei database ed in particolare della libreria EnterpriseLibrary.Data.


Qui di seguito si riporta tale frammento di codice:

VB.Net
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Text
Imports System.IO
Imports Microsoft.Practices.EnterpriseLibrary.Data
Imports System.Data
Imports System.Data.Common
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Practices.EnterpriseLibrary.Data;
using System.Data;
using System.Data.Common;
using System.Windows.Forms;


Ora dobbiamo scrivere il codice che fornita una query, o meglio un istruzione SQL la esegua a prescindere dalla fonte dati.


La funzione qui di seguito, accetta tre argomenti,  la connessione alla fonte dati, ossia la query string, il tipo di provider, ossia che base, (Sql Server, Access, Oracle, etc) e la query.

La funzione restituisce un oggetto di tipo Database, il quale viene valorizzato, quando si esegue la funzione ExecuteDAtaSet dell'oggetto di tipo Database.

Qui di seguito si riporta il frammento di codice per entrambi i linguaggi.

Vb.Net
Function GetDati(Connessione As String, Provider As String, Sql As String) As DataTable
        Dim RisultatoDTT As New DataTable
        Try
            Dim dbProviderFactory As DbProviderFactory = DbProviderFactories.GetFactory(Provider)
            Dim Database As Database = New GenericDatabase(Connessione, dbProviderFactory)
            Dim dbCommand As DbCommand
            DbCommand = Database.GetSqlStringCommand(Sql)
            RisultatoDTT = Database.ExecuteDataSet(dbCommand).Tables(0)
        Catch ex As Exception
            Throw ex
        End Try
        Return RisultatoDTT
    End Function
C#
          DataTable GetDati  (string Connessione, string Provider, string Sql)
        {
            DataTable RisultatoDTT = new DataTable();
            try
            {
                DbProviderFactory dbProviderFactory = DbProviderFactories.GetFactory(Provider);
                Database database = new GenericDatabase(Connessione, dbProviderFactory);
                DbCommand  dbCommand = default(DbCommand);
                dbCommand = database.GetSqlStringCommand(Sql);
                RisultatoDTT = database.ExecuteDataSet(dbCommand).Tables[0];
            }
            catch (Exception ex)
            {
                throw ex;
            }
            return RisultatoDTT;
        }


Ora non ci resta che scrivere la funzione per eseguire tale query.

Un pulsante richiamerà la funzione impostando come valori, la connectionstring, il tipo di database e la query.

Qui di seguito si riporta il codice per entrambi i linguaggi e per i due database.

Access
Vb.Net
Private Sub btnEsegui_Click(sender As System.Object, e As System.EventArgs) Handles btnEsegui.Click
        Dim Dati As DataTable = GetDati("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\test.mdb", "System.Data.OleDb", TxtSql.Text)
        MessageBox.Show("Record Totali: " & Dati.Rows.Count)
    End Sub
C#
private void btnEsegui_Click(object sender, EventArgs e)
        {
            DataTable Dati = GetDati(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\test.mdb", "System.Data.OleDb", TxtSql.Text);
            MessageBox.Show("Record Totali: " + Dati.Rows.Count);
        }
Sql Server
VB.Net
Private Sub BtnEseguiMS_Click(sender As System.Object, e As System.EventArgs) Handles BtnEseguiMS.Click
        Dim Dati As DataTable = GetDati("Server=localhost;Database=test;Trusted_Connection=True;", "System.Data.SqlClient", TxtSql.Text)
        MessageBox.Show("Record Totali: " & Dati.Rows.Count)
    End Sub
C#
private void button1_Click(object sender, EventArgs e)
        {
            DataTable Dati = GetDati(@"Server=localhost;Database=test;Trusted_Connection=True;", "System.Data.SqlClient", TxtSql.Text);
            MessageBox.Show("Record Totali: " + Dati.Rows.Count);
        }

Conclusioni

L'articolo ha voluto illustrare una tecnica per estrapolare i dati da database differenti, rendendo in questo modo il nostro programma flessibile su più fonti di dati. Questa tecnica ci permette di rendere le nostre applicazioni flessibili con un alta interoperabilità nella gestione di database differenti, senza modificare il codice.

Tramite semplici impostazioni al programma, che possono essere passate anche dall'esterno, possiamo renderlo facilmente flessibile minimazzando la manutenzione del codice.

Tramite il link download è possibile scaricare il file di esempio di questo articolo.