Antonio Esposito's


Prodotti tipici .NETtiani

ADO.NET, Stored Procedure e valori di ritorno

Ciao

è passato un po di tempo dall'ultimo mio post... ma il lavoro incalza e dai clienti non posso connettermi al blog... :(

Stored procedure e valori di ritorno in .NET:

Normalmente ADO.NET ci mette a disposizione tramite un SqlCommand 4 possibilità di esecuzione dello statement SQL:

1) ExecuteNonQuery viene usato per eseguire lo statement senza posizionarsi in lettura su eventuali resultset che l'SQL passato possa generare: in genere è usato per INSERT, UPDATE e DELETE... le select funzionano ovviamente, ma non potendo leggerne i risultati, sono pressocchè inutili.
SqlCommand cm = new SqlCommand("INSERT INTO x VALUES (a,b,c)",cn);

2) ExecuteScalar è usato per leggere un valore singolo dal server. esempi sono:
DateTime ServerDate = (DateTime)new SqlCommand("SELECT GETDATE()",cn).ExecuteScalar(); //per avere l'ora del server
int newID = (int)new SqlCommand("INSERT INTO x VALUES (a,b,c); SELECT @@identity",cn).ExecuteScalar(); //fa una insert e successivamente ritorna l'id appena generato come identity (contatore)

3) ExecuteReader è usato per leggere i resultset generati dall'SQL:
SqlCommand cm = new SqlCommand("SELECT * FROM X; SELECT * FROM Y",cn);
SqlDataReader dr = sqlCommand.ExecuteReader()
while (dr.Read())
  items.Add(dr[0].ToString());

dr.NextResult() //per passare all'eventuale secondo resultset (la seconda select)
while (dr.Read())
  items2.Add(dr[0].ToString());

Utilizzando una stored, le cose non cambiano particolarmente:
var cm = new SqlCommand("EXEC sp_Pippo",cn);
oppure:
var cm = new SqlCommand("sp_Pippo",cn);
cm.CommandType=CommandType.StoredProcedure;
utilizzando l'execute.... che meglio calza....

Unico extra in una stored sono i parametri e l'eventuale valore di ritorno:
avendo una SP così:
CREATE PROCEDURE sp_chiamami
@a int, @b int
AS
BEGIN
 INSERT INTO x VALUES (@a, @b);
 RETURN @@IDENTITY;
END
si potrebbe fare così:
var cm = new SqlCommand("sp_chiamami",cn);
cm.CommandType=CommandType.StoredProcedure;
cm.Parameters.AddWithValue("@a", "a");
cm.Parameters.AddWithValue("@b", "b");
cm.Parameters.Add("@return_value", SqlDbType.Int).Direction=ParameterDirection.ReturnValue; //per leggere il RETURN
cm.ExecuteNonQuery();
var newID=(int)cm.Parameters["@return_value"].Value;

4) ExecuteXmlScalar() è usato invece per leggere un resultset di tipo xml (SELECT * FROM X FOR XML AUTO) con un XmlReader

 

Ciao

Categoria: Tips
lunedì, 22 mar 2010 Ore. 11.01
Statistiche
  • Views Home Page: 11.549
  • Views Posts: 60.322
  • Views Gallerie: 0
  • n° Posts: 44
  • n° Commenti: 16
Copyright © 2002-2007 - Blogs 2.0
dotNetHell.it | Home Page Blogs
ASP.NET 2.0 Windows 2003