In questo articolo tratteremo come effettuare una connessione al database Microsoft Sql Server in c# mediante l’architettura ADO.NET.
ADO.NET (Active Data Objects .NET) รจ il nome con il quale si indicano lโinsieme di strumenti creati da Microsoft per
consentire ad una Applicazione Windows (o a una Applicazione Web) di accedere ai dati presenti in un DataBase SQL Server.
Per accedere ai dati di un DataBase, lโArchitettura ADO.NET offerta da MicroSoft, occorre includere i due NameSpace (ossia due โlibrerieโ di
classi) chiamati System.Data e System.Data.SqlClient per poter utilizzare ADO.NET:
“
using System.Data;
using System.Data.SqlClient;
“
A questo punto si possono utilizzare i seguenti oggetti:
1) La Connection che stabilisce una connessione fra lโApplicazione e il DataBase sul Server.
2) Il DataAdapter che specifica il comando SQL per recuperare i dati desiderati dal DataBase. (Il DataAdapter rende disponibile il metodo FILL che: โฆ invia il comando SQL al Server; โฆ il Server esegue il comando,
genera i dati richiesti e li trasmette al DataAdapter; โฆ infine, il DataAdapter memorizza i dati ottenuti nel DataTable.)
3) Il DataTable che immagazzina i dati recuperati dal DataBase e li rende accessibili โin RAMโ allโApplicazione. (Se lโApplicazione modifica i dati nel DataTable, tali modifiche possono facilmente essere โscaricateโ sul Server
utilizzando il metodo UPDATE del DataAdapter.)
4) La classe SqlConnection รจ la classe specificata per stabilire connessioni con DataBase gestiti su Server con MS SQL Server:
“
SqlConnection cn = new SqlConnection(
“server=ยซNOME SERVERยป\\ยซNOME ISTANZA DB MSSQLยป;database=ยซNOME DBยป;user id=ยซUSER DBยป;password=ยซPASSWORD USER DBยป” );
“
Note: \\ โdoppia back-slashโ ( \\), viene interpretata da C# come unโunica back-slash ( \ ). La Connessione con il Server viene automaticamente โapertaโ solo al momento dellโesecuzione del metodo FILL (o del
metodo UPDATE) del DataAdapter e, terminate le azioni previste dal FILL (o UPDATE), viene automaticamente chiusa.
La Creazione di un Oggetto di classe SqlConnection รจ necessaria prima di poter utilizzare le altre classi ADO.NET.
La classe SqlDataAdapter e il Comando SQL di tipo SELECT
La classe SqlDataAdapter รจ la classe specifica per inviare Comandi SQL di Selezione a DB gestiti su Server con MS
SQL Server e gestire le Tabelle di Dati restituite dal Server stesso.
SqlDataAdapter esige un Comando SQL di tipo SELECT, che consente di โselezionareโ (ossia scegliere) quali dati si
desidera ottenere, da quali tabelle del DB, in che ordine, con quale โfiltroโ, eccetera.
“
SqlDataAdapter daTB= new SqlDataAdapter(“SELECT * FROM ยซNOME TABELLA DBยป”, cn);
“
Note: Questa istruzione crea lโoggetto daTB di classe SqlDataAdapter e lo prepara per inviare al Server, il Comando SQL di selezione
SELECT * FROM ยซNOME TABELLAยป, sfruttando la connessione cn definita nellโistruzione precedente.
Lโinvio del Comando SQL al Server avviene solo quando si esegue il metodo FILL dellโoggetto DataAdapter.
La classe DataTable e il metodo FILL del DataAdapter
La classe DataTable, come giร studiato in precedenza, consente di memorizzare e gestire in RAM dati in forma
tabellare, specificando nome e caratteristiche dei campi (insieme Columns) e permettendo un accesso diretto ai record
tramite un indice (insieme Rows).
“
DataTable dt = new DataTable();
“
La classe SqlDataAdapter dispone del metodo FILL che, quando eseguito provoca le seguenti azioni:
1) il DataAdapter apre la Connessione con il Server e invia ad esso il Comando SQL di tipo SELECT.
2) Il motore di MS SQL Server riceve ed esegue il Comando SQL sul DataBase, generando la Tabella di Dati richiesta.
3) Il motore di MS SQL Server invia al Client la Tabella di Dati generata dal Comando SQL.
4) Il DataAdapter memorizza la Tabella di Dati ricevuta allโinterno di un oggetto di classe DataTable.
Il metodo FILL necessita, come parametro, dellโoggetto DataTable in cui memorizzare la tabella restituita dal Server:
“
DaTB.Fill (dt);
“
Note: La Struttura del DataTable, ossia la definizione delle sue Colonne (Insieme Columns) viene automaticamente creata
dal DataAdapter in base alla Tabella di Dati proveniente dal Server.
Anche lโInsieme Rows del DataTable viene automaticamente riempito dal DataAdapter con tutti i record presenti nella
Tabella di Dati proveniente dal Server.
Accedere o Modificare i Record in un oggetto DataTable
Per Accedere ad uno specifico Record di un DataTable, si utilizza lโinsieme Rows, indicando lโIndice del Record desiderato:
“
ยซDataTableยป.Rows[ยซIndice (riga da cui tirare fuori i dati)ยป].Item[ยซNome Campoยป];
o nella forma abbreviata, che omette โ.Itemโ:
ยซDataTableยป.Rows[ยซIndice (riga da cui tirare fuori i dati)ยป][ยซNome Campoยป];
“
Note: Il valore dell’Indice parte con il valore 0. (Quindi se nella DataTable ci sono 4 righe occorre costruire un ciclo che parta da 0 ed arrivi fino a 3). Lโaccesso ad un campo puรฒ avvenire, ovviamente, sia in lettura che in scrittura. il campo puรฒ essere usato come una
variabile: puรฒ essere โlettoโ, per utilizzare il suo valore, oppure vi si puรฒ โassegnareโ un dato, modificandone il valore.
Es: ad esempio, per visualizzare in un MessageBox il valore di una certa colonna in una posizione di record (esempio alla riga 2), si dovrร scrivere:
MessageBox.Show( dt.Rows[2].Item[โยซNome del Campoยปโ] ) oppure MessageBox.Show ( dt.Rows[2][โยซNome del Campoยปโ] )
Per modificare il valore contenuto in un campo registrato come da esempio nella seconda riga con un nuovo valore, si dovrร scrivere:
dt.Rows[2].Item[โยซNome del Campoยปโ] = โยซnuovo valore da attribuireยปโ oppure dt.Rows[2][โยซNome del Campoยปโ] = โยซnuovo valore da attribuireยปโ
Query Parametriche (comandi SELECT con uso di Parametri)
La maggior parte delle volte, un comando Sql di tipo SELECT, deve essere eseguito in base ad uno o piรน Parametri.
In tal caso, la tecnica corretta per impostare il comando Sql nel DataAdapter, prevede di indicare esplicitamente il
parametro tramite una โvariabile sqlโ, caratterizzata dalla notazione:
@ยซidentificatoreยป
Quindi la query da scrivere nel SqlDataAdapter รจ:
“
SqlDataAdapter daTB = new SqlDataAdapter (
โSELECT * FROM ยซNome Tabellaยป WHERE ยซNome Campoยป = @ยซidentificatoreยปโ, cn);
“
Oltre a indicare esplicitamente il Parametro nel comando Sql, รจ necessario informare il DataAdapter dellโesistenza
del parametro stesso, specificandone Identificatore, Tipo ed eventualmente, Dimensione:
“
daTB.SelectCommand.Parameters.Add (
โidentificatoreโ, SqlDbType.ยซTipo di Dato SQLยป,ยซDimensioneยป );
“
Note: Come si vede, รจ necessario accedere allโoggetto โinternoโ SelectCommand e, quindi, al suo insieme โinternoโ Parameters, al quale si aggiunge (metodo Add) la definizione del nuovo parametro.
Si noti come SqlDbType รจ una enumerazione che, dopo aver digitato il punto, elenca automaticamente tutti i possibili tipi disponibili in MS Sql Server.
Infine, per Attribuire un Valore al Parametro, si accede al parametro appena definito nellโinsieme Parameters e si imposta la sua proprietร Value:
“
daTB.SelectCommand.Parameters[โ@ยซidentificatoreยปโ].Value = ยซValore da assegnare (puรฒ essere anche il testo contenuto in un campo)ยป;
“
A questo punto รจ possibile richiamare il metodo Fill del DataAdapter che invierร al Server Sql il comando SELECT e la definizione del Parametro: il Server eseguirร la query โsostituendoโ al parametro il valore specificato.
Note: E’ utile adoperare i parametri perchรจ non si incorre in problematiche di errore con i tipi di valore stringhe. Cosรฌ facendo, infatti, un dato โesternoโ (il valore del parametro) viene a costituire parte integrante del comando sql, diventando cosรฌ โeseguibileโ ed esponendo la query al cosiddetto SQL INJECTION (questa โdebolezzaโ consente a un malintenzionato di inserire, nella
query, parte di comandi indesiderati e malevoli, semplicemente specificando valori particolari per il parametro).
“
DataTable dt = new DataTable();
daTB.Fill (dt);
“
Lascia un commento