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