Problème procédure stockée et visual studio 2010 (framework 4.5)
Bonjour, j'ai un petit problème avec l'exécution d'une procédure stockée dans ORACLE que je veux faire fonctionner avec C#.
voilà le code de ma Procédure stockée :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
CREATE OR REPLACE
PROCEDURE MODIFIE_FOURNISSEUR(IDFOURNISSEUR IN FOURNISSEURS.PK_FOURNISSEUR_ID%TYPE, P_SOCIETE IN FOURNISSEURS.SOCIETE%TYPE,
P_CONTACT IN FOURNISSEURS.CONTACT%TYPE, P_TEL IN FOURNISSEURS.TEL%TYPE, P_RUEETNUM IN FOURNISSEURS.RUE_NUM%TYPE,
P_Ville IN FOURNISSEURS.VILLE%TYPE, P_CodePostal IN FOURNISSEURS.CP%TYPE, ErrorMessage out varchar2)
IS
FOURNISSEUREXISTE INTEGER;
FournisseurNOEXISTANT EXCEPTION;
BEGIN
SELECT count(*) INTO fournisseurexiste FROM fournisseurs WHERE FOURNISSEURS.PK_FOURNISSEUR_ID=IDFOURNISSEUR;
IF FOURNISSEUREXISTE>0 THEN
UPDATE FOURNISSEURS
SET SOCIETE = P_SOCIETE,
CONTACT = P_CONTACT,
TEL = P_TEL,
RUE_NUM = P_RUEETNUM,
VILLE = P_VILLE,
CP = P_CODEPOSTAL
WHERE PK_FOURNISSEUR_ID = IDFOURNISSEUR;
ErrorMessage := 'La mise à jour s''est faite correctement';
ELSE
RAISE FournisseurNoExistant;
END IF;
EXCEPTION
WHEN FOURNISSEURNOEXISTANT THEN
ErrorMessage := 'Le fournisseur ne figure pas dans la DB';
END; |
et j'essaye d’exécuter ça avec le code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
|
static public void modifierFournisseur(int ID, string Societe, string contact, string tel, string rue_num, string ville, string CodePostal, ref string ErrMsg)
{
OracleConnection con = Utilitaire.getConnection(); // on creer l'objet de connection
//bool retVal;
OracleCommand commandeModif = new OracleCommand("MODIFIE_FOURNISSEUR", con); //on affecte à l'objet commande la procédure voulue et l'objet de connection qui va avec la commande.
commandeModif.CommandType = System.Data.CommandType.StoredProcedure; //on dit qu'on va travailler sur une procédure stockée
//création des différents paramètres en rapport à la procédure stockée.
OracleParameter param1 = new OracleParameter(":IDFOURNISSEUR", OracleDbType.Int32);
OracleParameter param2 = new OracleParameter(":p_SOCIETE", OracleDbType.Varchar2);
OracleParameter param3 = new OracleParameter(":P_CONTACT", OracleDbType.Varchar2);
OracleParameter param4 = new OracleParameter(":P_TEL", OracleDbType.Varchar2);
OracleParameter param5 = new OracleParameter(":P_RUEETNUM", OracleDbType.Varchar2);
OracleParameter param6 = new OracleParameter(":P_VILLE", OracleDbType.Varchar2);
OracleParameter param7 = new OracleParameter(":P_CODEPOSTAL", OracleDbType.Varchar2);
OracleParameter param8 = new OracleParameter(":ERRORMESSAGE", OracleDbType.Varchar2, System.Data.ParameterDirection.Output);
param8.OracleDbType = OracleDbType.Varchar2;
param1.Direction = ParameterDirection.Input; //ParameterDirection permet de dire si le paramètre est de type in ou out (voir les paramètres de la procédure stockée)
param1.Value = ID;
param2.Direction = ParameterDirection.Input;
param2.Value = Societe;
param3.Direction = ParameterDirection.Input;
param3.Value = contact;
param4.Direction = ParameterDirection.Input;
param4.Value = tel;
param5.Direction = ParameterDirection.Input;
param5.Value = rue_num;
param6.Direction = ParameterDirection.Input;
param6.Value = ville;
param7.Direction = ParameterDirection.Input;
param7.Value = CodePostal;
param8.Value = ErrMsg;
//ajout des paramètre à la commande
commandeModif.Parameters.Add(param1);
commandeModif.Parameters.Add(param2);
commandeModif.Parameters.Add(param3);
commandeModif.Parameters.Add(param4);
commandeModif.Parameters.Add(param5);
commandeModif.Parameters.Add(param6);
commandeModif.Parameters.Add(param7);
commandeModif.Parameters.Add(param8);
try
{
con.Open();
commandeModif.ExecuteNonQuery();
if (commandeModif.Parameters[":ERRORMESSAGE"].Value != null)
ErrMsg = (string) commandeModif.Parameters[":ERRORMESSAGE"].Value;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
ErrMsg = ex.Message.ToString();
}
finally
{
con.Close();
}
//return retVal;
} |
en exécutant ça j'ai l'erreur suivante :
ORA-06502: PL/SQL : ereur numérique ou erreur sur une valeur:tampon de chaîne de caractères trop petit
ORA-06512: à "ABRADAX.MODIFIE_FOURNISSEUR", ligne 29
ORA-06502: PL/SQL : erreur numérique ou erreur sur une valeur:tampon de chaîne de caractères trop petit
ORA-06512:à ligne 1
et mon appel à ma méthode se fait avec :
Code:
1 2 3 4 5 6 7 8 9 10
|
private void btModifier_Click(object sender, EventArgs e)
{
string Messageerreur = "";
int IDfournisseur = Convert.ToInt32(this.tbIdFournisseur.Text.ToString());
DAL.GestionFournisseur.modifierFournisseur(IDfournisseur, tbSociete.Text, tbContact.Text, tbTel.Text, tbRueNum.Text, tbVille.Text, tbCP.Text, ref Messageerreur);
MessageBox.Show(Messageerreur.ToString(), "information de modification", MessageBoxButtons.OKCancel);
} |
J'ai un petit doute avec le type number d'oracle et le type int32 de C# est-ce que c'est la même chose? ou est-ce qu'il faut une conversion? si c'est le cas comment est-ce qu'on l'a fait ? car ORACLEDBTYPE ne me propose pas de type number.
à savoir que je travail en 4 couches (PL, DAL, BLL et BO)
Le problème c'est que je ne sais pas comment exécuter ma procédure via le C#, le code que j'ai mis ne m'exécute pas ma procédure lorsque je tente une modification. Est-ce que le fait de mettre un paramètre de type ref dans ma méthode C# ça va passer avec mon paramètre OUT de ma procédure stockée ?
voilà j'espère que je suis déjà au bon endroit pour poser ma question et j'espère aussi avoir été assez clair dans ma question :s
Merci d'avance pour les réponses.