Chiamare una Stored Procedure da codice C#

Programmazione - Visual Studio Visite: 6201

Come usare una Stored Procedure Oracle da C#Come usare una Stored Procedure Oracle da C#
Vediamo qualche esempio su come invocare una stored procedure Oracle usando del codice C#. In particolare vedremo la gestione delle date. In questi esempi le date sono di tipo TIMESTAMP.
AGGIORNAMENTI
31/10/2014: aggiornamento articolo con nuovi esempi

 

LA STORED

Ecco come potrebbe essere fatta la Stored Procedure:

 

procedure MIA_STORED(
    FROM_DATE_IN IN TIMESTAMP,
    TO_DATE_IN IN TIMESTAMP
);

LA CHIAMATA C#

Ecco come fare la chiamata della stored procedure da codice c#:

OracleCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = packageName + ".MIA_STORED";
            cmd.Parameters.Add("FROM_DATE_IN", OracleDbType.TimeStamp, 6, new OracleTimeStamp(this.fromDate), System.Data.ParameterDirection.Input);
            cmd.Parameters.Add("TO_DATE_IN", OracleDbType.TimeStamp, 6, new OracleTimeStamp(this.toDate), System.Data.ParameterDirection.Input);
           
cmd.ExecuteNonQuery();

Gli attributi usati this.fromDate e this.toDate sono di tipo DateTime.

 

Prima abbiamo visto come gestire le date come parametri di ingresso nelle stored procedure.

Vediamo ora come si possono gestire al meglio le date come parametri di output e già che ci siamo supponiamo che poi il risultato debba essere trasformato in xml.

 

[Serializable]
[XmlRoot("MiaClasse")]
public class MIA_CLASSE
{
        private DateTime mioCampo;
 
        [XmlAttribute]
        public DateTime MioCampo
        {
            get { return mioCampo; }
            set { mioCampo = value; }
        }
 
        private DateTime mioCampo2;
 
        [XmlAttribute]
        public string MioCampo2
        {
            get { return (mioCampo2 != DateTime.MinValue) ? mioCampo2.ToString("s", CultureInfo.CreateSpecificCulture("en-US")) : null; }
            set { if (!DateTime.TryParse(value, out mioCampo2)) mioCampo2 = DateTime.MinValue; }        }
 
}

 

In questa classe vediamo che sia l'attributo mioCampo interno della classe che il suo corrispondente in Xml sono tutti e due di tipo DateTime.

Mentre l'attributo mioCampo2 è di tipo DateTime invece il suo corrispondente in XML è di tipo String.

Perché e a cosa servono queste due differenze.

 

MioCampo2 serve in quei casi in cui l'attributo DateTime può essere nullo. Una DateTime non può essere nulla, allora se la DateTime è uguale alla MinDate equivale a dire che è nulla e quindi il suo equivalente in XML, essendo stringa, potrà essere nullo.

 

Con le stored si fa qualcosa del tipo:

 

public void GetListaMiaClasse(OracleConnection conn, string packageName)
{
    OracleCommand cmd = conn.CreateCommand();
    cmd.CommandType = System.Data.CommandType.StoredProcedure;
    cmd.CommandText = packageName + ".GET_MIA_CLASSE";
    cmd.Parameters.Add("risultati", OracleDbType.RefCursor, 36, null, System.Data.ParameterDirection.Output);
    cmd.ExecuteNonQuery();
 
    DataSet ds = new DataSet();
            OracleDataAdapter da = new OracleDataAdapter(cmd);
            da.Fill(ds);
            foreach (DataRow row in ds.Tables[0].Rows) {
                MIA_CLASSE risultato = new MIA_CLASSE();
                
                if (row.ItemArray[0] != null && row.ItemArray[0].GetType().Equals(typeof(DateTime)))
                    risultato.MioCampo = (DateTime)row.ItemArray[0];
                else
                    risultato.MioCampo = DateTime.MinValue;
 
                if (row.ItemArray[1] != null && row.ItemArray[1].GetType().Equals(typeof(DateTime)))
                    risultato.MioCampo2 = row.ItemArray[1].ToString().Length > 0 ? row.ItemArray[1].ToString() : null;
                                               
                
            }
}

 

 

Buon lavoro!