Classe de connexion oracle

Description

Cette classe permet de se connecter à une base de données Oracle, de récupérer les données (SELECT), de faire des modifications (UPDATE, DELETE) et de lancer des procédures et des fonctions stockées.

Source / Exemple :


using System;
using System.Windows.Forms;
using System.Collections;
using System.Data.OracleClient;
using System.Data;

namespace ConnexionOracle
{
	/// <summary>
	/// Classe permettant l'interface avec Oracle
	/// </summary>
	public class classOracle
	{
		#region Variables
		/// <summary>
		/// User Oracle
		/// </summary>
		private string sUser;
		/// <summary>
		/// Mot de passe Oracle
		/// </summary>
		private string sPassword;
		/// <summary>
		/// Nom de la base Oracle
		/// </summary>
		private string sBase;
		/// <summary>
		/// Nombre de lignes du résultat d'une requête
		/// </summary>
		private int iNbRows;
		/// <summary>
		/// Nombre de colonnes du résultat d'une requête
		/// </summary>
		private int iNbCols;
		/// <summary>
		/// Connexion à la base de données Oracle
		/// </summary>
		private OracleConnection oracleCnx;
		/// <summary>
		/// Instruction SQL ou procédure stockée à exécuter
		/// </summary>
		private OracleCommand oracleCmd;
		/// <summary>
		/// Flux de lignes de données stockant le résultat d'une requête
		/// </summary>
		private OracleDataReader oracleReader;
		#endregion

		#region Propriétés
		/// <summary>
		/// Affecte ou récupère le login Oracle
		/// </summary>
		public string User 
		{
			get 
			{
				return this.sUser;
			}

			set
			{
				this.sUser = value;
			}
		}		

		/// <summary>
		/// Affecte ou récupère le mot de passe Oracle
		/// </summary>
		public string Password
		{
			get 
			{
				return this.sPassword;
			}

			set
			{
				this.sPassword = value;
			}
		}	

		/// <summary>
		/// Affecte ou récupère la base Oracle
		/// </summary>
		public string Base
		{
			get 
			{
				return this.sBase;
			}

			set
			{
				this.sBase = value;
			}
		}	
		
		/// <summary>
		/// Récupère le nombre de ligne d'une requête
		/// </summary>
		public int NbRows
		{
			get
			{
				return this.iNbRows;
			}
		}

		/// <summary>
		/// Récupère le nombre de colone d'une requête
		/// </summary>
		public int NbCols
		{
			get
			{
				return this.iNbCols;
			}
		}
		#endregion

		#region Constructeur de la classe classOracle
		/// <summary>Constructeur de la classe</summary>
		public classOracle()
		{
			this.sUser     = "";
			this.sPassword = "";
			this.sBase     = "";

			this.iNbRows = 0;
			this.iNbCols = 0;			

			this.oracleCnx    = new OracleConnection();
			this.oracleCmd    = new OracleCommand();
			this.oracleReader = null;
		}
		#endregion

		#region Connexion à la base de données Oracle
		/// <summary>Lance un ordre de connexion à la base Oracle</summary>
		/// <example>
		/// classOracle  monOracle = new classOracle();
		/// monOracle.setUser("Toto");
		/// monOracle.setPassword("mdp");
		/// monOracle.setBase("maBase");
		/// 
		/// if(this.monObjetOracle.connect())
		/// {
		/// ...
		/// }
		/// </example>
		public bool connect()
		{
			 try
			{
				this.oracleCnx.ConnectionString = "Password=" + this.sPassword + ";User ID=" + this.sUser + ";Data Source=" + this.sBase;

				this.iNbCols = 0;
				this.iNbRows = 0;

				oracleCnx.Open();

				return true;
			}
			catch(Exception)
			{
				MessageBox.Show("Impossible de se connecter à la base de données","Erreur Oracle",System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Error);
				return false;
			}
		}
		#endregion

		#region Déconnexion de la base de données Oracle
		/// <summary>
		/// Lance un ordre de déconnexion de la base de données Oracle
		/// </summary>
		/// <example>
		/// classOracle  monOracle = new classOracle();
		/// ...
		///	this.monOracle.deconnect();
		/// </example>
		public bool deconnect()
		{
			try
			{
				oracleCnx.Close();
				return true;
			}
			catch(Exception ex)
			{
				MessageBox.Show(ex.Message,"Erreur Oracle",System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Error);
				return false;
			}
		}
		#endregion

		#region Récupère les valeurs d'une requête
		/// <summary>Récupère les valeurs d'une requête</summary>
		/// <param name="sQuery">Requête à exécuter</param>
		/// <returns>Renvoi les valeurs de la requête</returns>
		/// <example>
		/// classOracle  monOracle = new classOracle();
		/// monOracle.setUser("Toto");
		/// monOracle.setPassword("mdp");
		/// monOracle.setBase("maBase");
		/// 
		/// if(this.monObjetOracle.connect())
	    /// {
		///		string sQuery="SELECT COUNT(*) FROM MaTable";
		///		object[,] resultat = this.monOracle.getQueryResult(sQuery);
		///		this.monOracle.deconnect();
		///		...
		/// }
		/// </example>
		public Object[,] getQueryResult(string sQuery)
		{
			this.oracleCmd    = new OracleCommand(sQuery, this.oracleCnx);
			this.oracleReader = null;
			this.oracleReader = this.oracleCmd.ExecuteReader();

			Object[,] oArrResult;
			this.iNbRows = 0;
			this.iNbCols = this.oracleReader.FieldCount;

			// Initialisation du tableau de retour
			while (this.oracleReader.Read()) { this.iNbRows++; }
			oArrResult = new Object[this.iNbRows,iNbCols];

			// Remplissage du tableau de retour
			try
			{
				this.oracleReader = this.oracleCmd.ExecuteReader();
				int i = 0;
				while (this.oracleReader.Read())
				{
					for(int j=0; j<this.iNbCols; j++)
					{
						oArrResult[i,j] = oracleReader.GetOracleValue(j);
					}
					i++;
				}
			}
			catch(OracleException oe)
			{
				this.gestionErreur(oe);
				return null;
			}
			finally
			{
				this.oracleReader.Close();
				this.oracleCmd = null;
				this.oracleReader = null;
			}

			return oArrResult;
		}
		#endregion

		#region Lance un ordre SQL de INSERT, UPDATE ou DELETE
		/// <summary>Lance un ordre SQL de INSERT, UPDATE ou DELETE</summary>
		/// <param name="sQuery">Requête à exécuter</param>
		/// <returns>Renvoi true si l'odre SQL s'est déroulé normallement, false sinon</returns>
		/// <example>
		/// classOracle  monOracle = new classOracle();
		/// monOracle.setUser("Toto");
		/// monOracle.setPassword("mdp");
		/// monOracle.setBase("maBase");
		/// 
		/// if(this.monObjetOracle.connect())
		/// {
		///		string sQuery="DELETE FROM MaTable";
		///		bool bResultat = this.monOracle.nonQueryOrder(sQuery);
		///		this.monOracle.deconnect();
		///		
		///		if(bResultat)
		///		{
		///		  ...  
		///		}
		/// }
		/// </example>
		public bool nonQueryOrder(string sQuery)
		{
			this.oracleCmd = new OracleCommand(sQuery, this.oracleCnx);
			try
			{
				this.oracleCmd.ExecuteNonQuery();
				return true;
			}
			catch(OracleException OracleEx)
			{
				this.gestionErreur(OracleEx);
				return false;
			}
			finally
			{
				this.oracleCmd = null;
			}
		}
		#endregion

		#region Lance une procédure PL/SQL
		/// <summary>
		/// Lance une procédure stockée PL/SQL de type procédure
		/// </summary>
		/// <param name="sQuery">Procédure stockée de type procédure à exécuter</param>
		/// <param name="param">Tableau des paramètres</param>
		/// <returns>vrai si la procédure s'est exécutée correctement, faux sinon</returns>
		/// <example>
		/// classOracle  monOracle = new classOracle();
		///	monOracle.setUser("Toto");
		///	monOracle.setPassword("mdp");
		///	monOracle.setBase("maBase");
		///
		///	string param1="blabla";
		///	string param2="blablabla";
		///
		///	string sQuery = "SCHEMA.PACKAGE.MA_PROCEDURE";
		///	ArrayList param = new ArrayList(2);
		///	/* En admettant que le premier paramètre de ma procédure stockée MA_PROCEDURE, du package PACKAGE, sous le chéma Oracle SCHEMA, se nomme monPremierParametre (idem pour le deuxième paramètre) */
		///	param.Add(new string[] {"monPremierParametre",param1});
		///	param.Add(new string[] {"monDeuxièmeParametre",param2});				
		///
		/// if(this.monOracle.connect())
		/// {
		///		bool bRetour =  this.monOracle.procStockOrder(sQuery,param);
		///		this.monOracle.deconnect();
		///
		///		if(bRetour)
		///		{
		///			...
		///		}
		///	}
		/// </example>
		public bool procStockOrder(string sQuery, ArrayList param)
		{
			this.oracleCmd = this.oracleCnx.CreateCommand();
			this.oracleCmd.CommandText = sQuery;
			this.oracleCmd.CommandType = CommandType.StoredProcedure;

			foreach(string[] tableau in param)
			{
				this.oracleCmd.Parameters.Add(tableau[0],tableau[1]);
			}

			try
			{
				this.oracleCmd.ExecuteNonQuery();
			}
			catch(OracleException OracleEx)
			{
				this.gestionErreur(OracleEx);
				return false;
			}
			finally
			{
				this.oracleCmd = null;
			}

			return true;
		}
		#endregion

		#region Lance une fonction PL/SQL
		/// <summary>
		/// Lance une procédure stockée PL/SQL de type fonction
		/// </summary>
		/// <param name="sQuery">Procédure stockée de type fonction à exécuter</param>
		/// <param name="param">Tableau des paramètres</param>
		/// <param name="sRetour">Intitulé de la valeur de retour</param>
		/// <param name="iLongueurRetour">Longueur de la variable de retour</param>
		/// <returns>la chaîne de caractères retournée par la fonction PL/SQL</returns>
		/// <example>
		/// classOracle  monOracle = new classOracle();
		///	monOracle.setUser("Toto");
		///	monOracle.setPassword("mdp");
		///	monOracle.setBase("maBase");
		///
		///	string param1="blabla";
		///	string param2="blablabla";
		///
		///	string sQuery = "SCHEMA.PACKAGE.MA_FONCTION";
		///	ArrayList param = new ArrayList(2);
		///	/* En admettant que le premier paramètre de ma fonction stockée MA_FONCTION, du package PACKAGE, sous le chéma Oracle SCHEMA, se nomme monPremierParametre (idem pour le deuxième paramètre) */
		///	param.Add(new string[] {"monPremierParametre",param1});
		///	param.Add(new string[] {"monDeuxièmeParametre",param2});				
		///
		/// if(this.monOracle.connect())
		/// {
		///		/* En admettant que le paramètre de retour de ma fonction stockée se nomme monParametreRetour et est de longueur 10 (VARCHAR2(10))*/
		///		string sRetour =  this.monOracle.foncStockOrder(sQuery,param,"monParametreRetour",10);
		///		this.monOracle.deconnect();
		///
		///		if(sRetour != null)
		///		{
		///			...
		///		}
		///	}
		/// </example>
		public string foncStockOrder(string sQuery,ArrayList param, string sRetour, int iLongueurRetour)
		{
			this.oracleCmd = this.oracleCnx.CreateCommand();
			this.oracleCmd.CommandText = sQuery;
			this.oracleCmd.CommandType = CommandType.StoredProcedure;
			this.oracleCmd.Parameters.Add(sRetour,OracleType.VarChar,iLongueurRetour);
			this.oracleCmd.Parameters[sRetour].Direction = ParameterDirection.ReturnValue;

			foreach(string[] tableau in param)
			{
				this.oracleCmd.Parameters.Add(tableau[0],tableau[1]);
			}

			try
			{
				this.oracleCmd.ExecuteNonQuery();
				return((string)this.oracleCmd.Parameters[sRetour].Value);
			}
			catch(OracleException OracleEx)
			{
				this.gestionErreur(OracleEx);
				return null;
			}
			finally
			{
				this.oracleCmd = null;
			}
		}
		#endregion

		#region Gestion des erreurs
		private void gestionErreur(OracleException oe)
		{
			switch(oe.Code)
			{
				case 02292 :
					MessageBox.Show("Impossible de supprimer cet élément car il est encore référencé dans une autre table.","Erreur Oracle",System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Error);
					break;

				default :
					MessageBox.Show(oe.Message,"Erreur Oracle",System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Error);
					break;
			}
		}
		#endregion
	}
}

Conclusion :


Exemple d'utilisation pour une requête simple :
classOracle monOracle = new classOracle();
monOracle.setUser("Toto");
monOracle.setPassword("mdp");
monOracle.setBase("maBase");

if(this.monObjetOracle.connect())
{
string sQuery="SELECT MonChamp FROM MaTable";

object[,] resultat = this.monOracle.getQueryResult(sQuery);

this.monOracle.deconnect();

// Utilisation pour remplir un combobox par exemple avec MonChamp
foreach(object[] monRow in resultat)
{
this.cbMonComboBox.Items.Add(monRow[0].ToString());
}
}

Exemple d'utilisation pour une procédure stockée :
classOracle monOracle = new classOracle();
monOracle.setUser("Toto");
monOracle.setPassword("mdp");
monOracle.setBase("maBase");

String param1="blabla";
String param2="blablabla";

string sQuery = "SCHEMA.PACKAGE.MA_PROCEDURE";
ArrayList param = new ArrayList(2);
/* En admettant que le premier paramètre de ma procédure stockée MA_PROCEDURE, du package PACKAGE, sous le chéma Oracle SCHEMA, se nomme monPremierParametre (idem pour le deuxième paramètre) */
param.Add(new string[] {"monPremierParametre",param1});
param.Add(new string[] {"monDeuxièmeParametre",param2});

if(this.monOracle.connect())
{
bool bRetour = this.monOracle.procStockOrder(sQuery,param);
this.monOracle.deconnect();

if(bRetour)
{
...
}
}

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.