Eseguire una query di select su Oracle in C# (DataReader)
Eseguire una query di select per Oracle in C# è simile a MS SQL Server. Le eccezioni sono:
Nel caso la query fosse contenuta in una store procedure il codice diventa:
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:
Dove TNS_NAME e uno dei nomi oracle definiti nel file tnsnames.ora (vedi anche Oracle SQLPlus).
- 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)
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
//...
}
}
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
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.