L'écosystème .NET a évolué, rendant obsolètes certaines anciennes bibliothèques. Depuis le framework 4.0, l'espace de noms System.Data.OracleClient n'est plus supporté par Microsoft. La solution recommandée consiste désormais à utiliser le pilote officiel fourni par Oracle : Oracle.ManagedDataAccess (ODP.NET Managed Driver).
Cette bibliothèque présente l'avantage majeur de ne nécessiter aucune installation de client Oracle lourd sur la machine d'exécution, et s'affranchit de la configuration complexe des fichiers tnsnames.ora.
1. Configuration de la chaîne de connexion
Contrairement aux méthodes traditionnelles, la chaîne de connexion peut intégrer directement les détails du decsripteur réseau. Voici un exemple de configuration pour un fichier App.config ou Web.config :
<connectionStrings>
<add name="OracleDbContext"
connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.3.254)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=mabase)));Persist Security Info=True;User ID=mon_utilisateur;Password=mon_mot_de_passe;"/>
</connectionStrings>
2. Implémentation d'un utilitaire d'accès aux données
Pour interagir avec la base de données, il est judicieux de créer des méthodes génériques gérant l'ouverture et la fermeture des connexions via le bloc using.
Exécution d'une commande (Insertion, Mise à jour, Suppression) :
public static int ExecuterCommande(string reqSql, params OracleParameter[] parametres)
{
using (OracleConnection connexion = new OracleConnection(chaineConnexion))
{
using (OracleCommand commande = new OracleCommand(reqSql, connexion))
{
try
{
connexion.Open();
if (parametres != null)
{
commande.Parameters.AddRange(parametres);
}
int resultat = commande.ExecuteNonQuery();
commande.Parameters.Clear();
return resultat;
}
catch (OracleException ex)
{
throw new Exception("Erreur lors de l'exécution SQL : " + ex.Message);
}
}
}
}
Récupération de données dans un DataSet :
public static DataSet ObtenirDonnees(string reqSql)
{
using (OracleConnection connexion = new OracleConnection(chaineConnexion))
{
DataSet ds = new DataSet();
try
{
connexion.Open();
OracleDataAdapter adaptateur = new OracleDataAdapter(reqSql, connexion);
adaptateur.Fill(ds, "Resultats");
}
catch (OracleException ex)
{
throw new Exception("Erreur de lecture : " + ex.Message);
}
return ds;
}
}
3. Spécificités syntaxiques d'Oracle par rapport à SQL Server
Lors de la transition de SQL Server vers Oracle, plusieurs différences syntaxiques doivent être prises en compte :
- Formatage des dates : Dans une requête brute, utilisez la fonction
TO_DATE, par exemple :TO_DATE('2023-10-27 14:30:00', 'yyyy-mm-dd hh24:mi:ss'). - Pagination : Le mot-clé
TOPn'existe pas. Il faut utiliserROWNUMou les clausesFETCH FIRST n ROWS ONLY(versions récentes). - Paramètres nommés : Contrairement à SQL Server qui utilise le préfixe
@, Oracle utilise le symbole deux-points:pour identifier les variables.
Exemple de mise à jour paramétrée :
public bool MettreAJourStatut(Equipement model)
{
StringBuilder sql = new StringBuilder();
sql.Append("UPDATE TBL_EQUIPEMENT SET ");
sql.Append("VALEUR_PARAM = :valeur, ");
sql.Append("DATE_LECTURE = :dateHeure ");
sql.Append("WHERE ID_MACHINE = :id");
OracleParameter[] parametres = {
new OracleParameter("valeur", OracleDbType.NVarchar2) { Value = model.Valeur },
new OracleParameter("dateHeure", OracleDbType.Date) { Value = model.DateLecture },
new OracleParameter("id", OracleDbType.Int32) { Value = model.Id }
};
int lignesAffectees = DbHelper.ExecuterCommande(sql.ToString(), parametres);
return lignesAffectees > 0;
}