Connexion et manipulation de bases de données Oracle en C# avec Oracle.ManagedDataAccess

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é TOP n'existe pas. Il faut utiliser ROWNUM ou les clauses FETCH 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;
}

Étiquettes: C# Oracle ODP.NET Oracle.ManagedDataAccess ADO.NET

Publié le 26 juillet à 22h21