Eseguire una query di select per Oracle in C# è simile a MS SQL Server. Le eccezioni sono:
  • L'installazione sulla macchina del Client Oracle per avere le DLL di connessione e l'uso del namespace System.Data.OracleClient
  • la definizione di un parametro di tipo cursore in output per poter leggere i dati tramite un DataReader
  • per i parametri definiti all'interno della query di tipo testo (vedi :p_cod) usare il prefisso : (due punti / colon) e non la @ (chiocciola / at) come avviene in MS SQL Server
  • indicare sempre lo schema dove si trova la tabella e il nome della tabella separati da un punto (MIOSCHEMA.MIATABELLA)
ecco un esempio:
C#
//https://www.sgart.it
//aggiungo i namespace necessari
using System.Data;
using System.Data.OracleClient;

//definisco la query orcale con parametri
string query = @"SELECT COD, DESCR FROM MIOSCHEMA.MIATABELLA WHERE COD = :p_cod";

using (OracleConnection cnn = new OracleConnection("stringa di connessione ad oracle"))
{
  using (OracleCommand cmd = cnn.CreateCommand())
  {
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = query;

    //definisco un parametro di input, attenzione al ":" (due punti) come prefisso
    OracleParameter pCodForn = cmd.Parameters.Add(":p_cod", OracleType.NVarChar, 14);

    //definisco il parametro di tipo cursor in output per poter leggere il risultato con un DataReader
    OracleParameter pResults = cmd.Parameters.Add(":p_results", OracleType.Cursor);
    pResults.Direction = ParameterDirection.Output;

    //assegno il valore all'unico parametro di input
    pCodForn.Value = "AZ123";

    //apro la connessione
    cnn.Open();

    using (OracleDataReader reader = cmd.ExecuteReader())
    {
      //ciclo sul risultato ritornato grazie al parametro p_results
      while (reader.Read())
      {
        Console.WriteLine((string)reader["DESCR"]);
      }
    }
  }
}

Nel caso la query fosse contenuta in una store procedure il codice diventa:
C#
using (OracleConnection cnn = new OracleConnection("stringa di connessione ad oracle"))
{
  using (OracleCommand cmd = cnn.CreateCommand())
  {
    //cambio il tipo di comando
    cmd.CommandType = CommandType.StoredProcedure;
    //definisco il nome completo della store
    cmd.CommandText = "MIOSCHEMA.MIOPACKAGE.MIASTOREPROCEDURE";

    //definisco un parametro di input, attenzione NON va messo il ":"
    OracleParameter pCodForn = cmd.Parameters.Add("p_cod", OracleType.NVarChar, 14);

    //definisco il parametro di tipo cursor in output per poter leggere il risultato con un DataReader
    OracleParameter pResults = cmd.Parameters.Add("p_results", OracleType.Cursor);
    pResults.Direction = ParameterDirection.Output;

    //il resto non cambia
    //...
  }
}
Quindi va definito il nome completo della store procedure composto da schema, package e nome store separati da un punto e i parametri perdono il : (due punti) come prefisso.

La stringa di connessione a Oracle è nel formato:
Text
Data Source=TNS_NAME;Persist Security Info=True;User ID=USER_ORACLE;Password=PASSWORD_ORACLE;Unicode=True
Dove TNS_NAME e uno dei nomi oracle definiti nel file tnsnames.ora (vedi anche Oracle SQLPlus).
ora-01036: Nome o numero di variabili non ammesso
Se compare questo errore una delle possibili cause e la mancata o non corretta definizione del CommandType o la mancata / errata definizione dei parametri.
Potrebbe interessarti anche: