Operazioni su SQL Server in C#

.::Home::.

.::Introduzione::.

1.Panoramica

.::Presentazioni PPT::.

.::Link::.

.::DownLoad::.

 

Questo esempio mostra le transazioni di base, SELECT, INSERT UPDATE, DELETE. Utilizza il database "northwind" di SQL-Server per la dimostrazione.

Per una spiegazione dettagliata degli oggetti e dei metodi usati, visualizzare la pagina "Architettura di ADO.NET".

Dopo aver stabilito una connessione con il database "northwind" residente su server SQL cerca la riga della tabella Orders che ha OrderID 10248 e la modifica.

In seguito cancella la riga che ha OrderID 10248 nella tablella Order Details e ne inserisce una completamente nuova al suo posto.

Al termine stabilisce una relazione tra le colonne OrderID delle due tabelle Orders e Order Details e ne stampa risultati seguendo la relazione appena impostata.

I numerosi commenti, aiuteranno l'utente a non perdersi nel lungo codice...

using System;
using System.Data;
using System.Data.SqlClient;

namespace Database
{
	// Classe di esempio per dimostrare l'interazione
	// tra ADO.NET e SQL Server
	class Class1
	{
		static void Main(string[] args)
		{   
			// Ottiene dati da un database
			// (L'esempio  riferito al database Northwind
			// di SQL Server)
                      
			// Crea una connessione con il SQL Server BARIBAL
			// e il database northwind in esso memorizzato
			// mediante l'account del sistem administrator (sa)
			// che non  protetto da password
			string strConnection="user id=sa;password=;";
			strConnection+="database=northwind;server=BARIBAL";
			SqlConnection objSqlConnection = new SqlConnection(strConnection);
			// Apre la connessione
			objSqlConnection.Open();
			
            
			// Crea un DataSet (una cache) per memorizzare i dati da elaborare
			DataSet objDataSet = new DataSet("OrderAdmin");

			// Ora bisogna riempire la tabella, creando un
			// comando SELECT * dalla tabella Orders...
			string strOrders = "SELECT * FROM Orders ";
			SqlCommand objOrderCommand = new SqlCommand(strOrders,objSqlConnection);
			// e un DataAdapter nel quale mappare la tabella
			SqlDataAdapter objOrdAdapter = new SqlDataAdapter();
			objOrdAdapter.TableMappings.Add("Table","Orders");
			// connettere il SqlCommand e l'SqlDataAdapter
			objOrdAdapter.SelectCommand = objOrderCommand;
			// e riempire il DataSet precedentemente creato
			objOrdAdapter.Fill(objDataSet);

		   // Ora esegue una procedura analoga per la tabella Order Details
		   string strOrderDetails = "SELECT * FROM [Order Details]";
		   SqlCommand objOrdDetailCommand = 
		   new SqlCommand(strOrderDetails,objSqlConnection);
		   SqlDataAdapter objODAdapter = new SqlDataAdapter();
		   objODAdapter.TableMappings.Add("Table","Order Details");
		   objODAdapter.SelectCommand = objOrdDetailCommand;
		   objODAdapter.Fill(objDataSet);
		   
		   // Crea due DataColumn... si useranno pi tardi...
		   DataColumn objDCParent;
		   DataColumn objDCChild;
           	   
		   DataTable objOrdTable = objDataSet.Tables["Orders"];
		   DataTable objODTable = objDataSet.Tables["Order Details"];

         
		   // Ora aggiona il record della tabella Orders che ha OrderID=10248
		   foreach(DataRow objRow in objOrdTable.Rows)
		   {
				string strID = objRow["OrderID"].ToString();
				string strShip = "HMS Invisible";
				if(strID == "10248" )
				{
					// Imposta le modifiche
					string strUpDate = "UPDATE Orders SET ShipName = "+"'"+strShip+"'";
					strUpDate+=" WHERE OrderID = " + strID;
					objRow["ShipName"]=strShip ;
					// Crea il comando SQL appropriato per l'aggiornamento
					objOrdAdapter.UpdateCommand = new SqlCommand(strUpDate,objSqlConnection);
					// Esegue l'aggiornamento
					objOrdAdapter.Update(objDataSet,"Orders");
					Console.WriteLine("Update done");
					break;
				}
			}
			// Cancella i record dalla tabella Order Details che hanno OrderID 10248
			for(int i=0;i‹objODTable.Rows.Count;i++)
			{
				// Crea un DataRow con l'i-esima riga della tabella
				DataRow objDataRow = objODTable.Rows[i];
				string strID =objDataRow["OrderID"].ToString();
				if( strID == "10248")
				{
				    // se ha OrderID = 10248 cancella il record dal DataSet...
		                    objDataRow.Delete();
				    // ... ma solo dal DataSet! Per cancellarlo anche dalla sorgente dei dati, 
				    // il database memorizzato sul server, bisogna aggiornarlo con il contenuto 
				    // del dataset!
					objODAdapter.DeleteCommand = new 
						SqlCommand("DELETE FROM [Order Details] WHERE OrderID = "+strID,objSqlConnection);
					objODAdapter.Update(objDataSet,"Order Details");
					Console.WriteLine("Delete done");
					break;		
				}
			}


		   // Inserisce un nuovo record nella tabella con OrderID = 10248
		   // Per far questo si crea un oggetto DataRow con il metodo NewRow di DataTable,
		   // si riempe la riga con i dati appropriati e la si inserisce in DataTable.
		   DataRow  objODRow = objODTable.NewRow();
		   objODRow["OrderID"] = 10248;
		   objODRow["ProductID"] = 63;
		   objODTable.Rows.Add(objODRow);
		   // Ora aggiorniamo anche la sorgente...
		   string strInsert = "INSERT INTO [Order Details] (OrderID,ProductID,UnitPrice,Quantity,Discount) VALUES(10248,63,33.4,100,0.20)";
		   objODAdapter.InsertCommand = new SqlCommand(strInsert,objSqlConnection);
		   objODAdapter.Update(objDataSet,"Order Details");
		   Console.WriteLine("Insert done");

	   
			// Crea una DataRelation per collegare le tabelle Orders e Order Details
			DataRelation objDR;
			// Riempiamo i due DataColumn dichiarati in precedenza
		        objDCParent=objDataSet.Tables["Orders"].Columns["OrderID"];
			objDCChild=objDataSet.Tables["Order Details"].Columns["OrderID"];
			// Per creare una relazione (DataRelation) denominata "OJoinOD" tra le due colonne
			// OrderID delle tabelle Orders e Order Details
			objDR=new DataRelation("OJoinOD", objDCParent,objDCChild);
			objDataSet.Relations.Add(objDR);
			// Ora usiamo la relazione per stampare il ProductID prelevato da Order Details 
			// alla quale si  acceduto fornendo l'OrderID della tabella Orders.
			// Al valore della colonna ProductID di Order Details ci si arriva seguendo la relazione.

			// Per ogni riga nelle righe di Orders...
			foreach(DataRow objRow in objOrdTable.Rows)
			{
				//... se l'OrderID  pari a 10248...
				string strOrderID = objRow["OrderID"].ToString();
				if(strOrderID=="10248")
				{
					//... Scrivi l'OrderID...
					Console.WriteLine("Order Id:"+strOrderID);
					// ... e per ogni riga nelle righe figlie della relazione OJoinOD...
					// (ovvero per ogni riga di Order Details che ha OrderID=10248)
					// (GetChildRows preleva le richieste righe figlie del DataRow seguendo
					// la relazione indicata)
					foreach(DataRow objChild in objRow.GetChildRows(objDataSet.Relations["OJoinOD"]))
					{
						//... scrivi il ProductID!! FINE! :)
						string strProductID=objChild["ProductID"].ToString();
						Console.WriteLine(strProductID);
					}
					break;
				}
			}
				
            // chiude la connessione al database
			objSqlConnection.Close();

			String strAnswer = Console.ReadLine();
		
		}
	}
}

Lavorando su di una architettura disconessa è necessario porre grande attenzione a non confondere le operazioni fatte sulla cache locale (DataSet) con quelle sulla sorgente dei dati! Gli inserimenti, le cancellazioni e gli aggiornamenti devono sempre essere sincronizzate.

Nelle immagini che seguono si vede come la cancellazione e l'inserimento di una nuova riga nella tabella Order Details sia andata a buon fine e resa persistente nel database:

Questa è la tabella Order Details prima dell'esecuzione del programma C#:

Il codice, tra le altre operazioni eliminerà la riga che ha OrderID 10248 per sostituirla con una con valori (10248,63,33.4,100,0.20).
Se il programma lavora in maniera corretta le modifiche si rispecchieranno nella tabella dopo le operazioni.

L'esecuzione porta a termine le operazioni di Update, Delete ed Insert, inoltre stampa il ProductID dell' OrderID 10248, seguendo la relazione tra Orders e Order Details. Il valore è 63 perchè riferito alla tabella modificata da Delete/Insert ovvero quella dell'immagine successiva, non di quella precedente

Ed ecco infine come appare la tabella modificata dall'esecuzione del programma:

Note Importanti:

Il codice non compila?
Avete copiato e incollato il codice ed ottenete un errore di compilazione? La riga

for(int i=0;i‹objODTable.Rows.Count;i++)

contiene il segno di minore che non è possibile usare direttamente in una pagina web perchè verrebbe interpretato come l'apertura di un TAG HTML. Controllare che non sia stato copiato il codice relativo al carattere speciale "minore" invece che il carattere stesso ed eventualmente sostituirlo.

Non si collega a SQL Server?
Controllare di avere un account valido e i permessi correttamente impostati su SQL Server. La stringa di connessione deve essere modificata con i dati del VOSTRO server.
Per maggiori dettagli leggere l' "ATTENZIONE" nella pagina "Semplice accesso a SQL Server in C#".

Fonti:

http://www.c-sharpcorner.com/Database/DBOpsInADOPA.asp

.::^top^::.

(2002) A cura di Carlo Becchi