Classe de connexion oracle

Soyez le premier à donner votre avis sur cette source.

Vue 38 870 fois - Téléchargée 1 822 fois

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

Ajouter un commentaire

Commentaires

Messages postés
23
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
10 novembre 2012

Salut,

Je ne pense pas qu'on parle de la même chose. ^^
Je ne parle pas des erreurs SQL. Je parle de la gestion des transactions. Elles ne sont pas gérés dans cette class, se qui est problématique dans le cas où tu fais plusieurs requêtes en base et que tu as besoin qu'elles soient toutes validées (sans erreur) avant de confirmer l'opération en base (COMMIT). De plus cela te permet de gérer les locks etc...!

Je vous invite (à toi et aux autres) à regarder ceci :
http://morpheus.developpez.com/oracledotnet/
http://www.tuto-dba-oracle.com/gestion-transactions-oracle.html

et plus si affinité... ^^
Messages postés
121
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
20 mars 2009
1
Non ce n'est certainement pas en automatique : à proscrire.
De mémoire je le gérais dans le retour :

if(bResultat)
{
...
}
Messages postés
23
Date d'inscription
mardi 23 octobre 2007
Statut
Membre
Dernière intervention
10 novembre 2012

Salut,

J'ai une remarque qui me semble importante à faire à propos de cette jolie class ^^.
Comment gère tu le commit et le rollback? Est-ce que les données sont automatiquement validées lorsque que tu fais un Insert dans ta base? (PAS BON CA...)

A+
Messages postés
19
Date d'inscription
mercredi 30 juillet 2003
Statut
Membre
Dernière intervention
21 juin 2011

Bonjour,

En ouvrant le code en tant que solution "using System.Data.OracleClient;" est reconnu mais lorsque j'insère ce code en tant que classe dans la solution, il ne connait pas "OracleClient".
Pourquoi ?

Merci.
Messages postés
12
Date d'inscription
jeudi 27 décembre 2001
Statut
Membre
Dernière intervention
29 avril 2008

J'ai aussi eu le problème de l'exception lors de la récupération ; je suis sous VS 2008, c'est sans doute du à cela.
Je l'ai résolu comme ça en utilisaant un tableau d'objets de récupération de résultat à 1 dimension, qui contient lui aussi un tableau d'objets :

--> dans la classe :

public Object[] getQueryResult(string sQuery)
{
.....

Object[] oArrResult;
.....
oArrResult = new Object[this.iNbRows];

// Remplissage du tableau de retour
try
{
this.oracleReader = this.oracleCmd.ExecuteReader();
int i = 0;
while (this.oracleReader.Read())
{
object[] hop = new object[iNbCols];
for (int j = 0; j < this.iNbCols; j++)
{
hop[j] = oracleReader.GetOracleValue(j);
}
oArrResult[i]=hop;
i++;
}
....

--> dans le code de récup du résultat :

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

this.monOracle.deconnect();

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

A part ça, très bon code, merci ;)
Afficher les 30 commentaires

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.