C# .NET insertion dans BD Orale

Résolu
cs_Sabine25 Messages postés 84 Date d'inscription jeudi 1 mars 2007 Statut Membre Dernière intervention 22 juin 2007 - 20 mars 2007 à 17:06
 Matroks - 26 mars 2007 à 20:06
Bonjour,
je souhaiterai faire cette insertion mais j ai une erreur comme quoi "ExecuteNonQuery: Connection property has not been initialized."
est ce que quelqu un peu me donner une réponse clair, parceque je débute et c'est pas évident encore!!!

Merci 1000 fois

Sabine

Voici mon code:

private






void
button1_Click(

object
sender,

EventArgs
e){
        


string
insertCmd =

"INSERT INTO user VALUES (seq_user.NEXTVAL,textBox1.Text,textBox2.Text);";

         DataConnection
m =

new



DataConnection
();


         OleDbCommand
cmd =

new



OleDbCommand
(insertCmd);
         m.DoConnection();
         cmd.ExecuteNonQuery();
         m.DoDeconnection();
}
A voir également:

31 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
21 mars 2007 à 22:00
Oui c'est rageant... En fait j'aurais du installer oracle dès le départ, ca t'aurais évité de perdre du temps :/ 

Enfin bref, pour revenir un petit peu en arriere où tu demandais "faut-il des cotes ou autre" :  le fait d'utiliser les requetes paramétrées te permet de ne plus avoir a t'en soucier ;)

N'hésite pas a revenir poser des questions si besoin est.

a+

Mx
MVP C# 
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
20 mars 2007 à 17:22
Salut,

Ce n'est pas parce que tu appelles DoConnection() que ton Command sait qu'il faut qu'il utilise cette connexion.
Il faut que tu affectes une instance d'OleDbConnection à la propriété Connection de ton OleDbCommand. Il faut donc que ta méthode DoConnection retourne ta connexion et dire a ton OleDbcommand de l'utiliser.

Mx
MVP C# 
0
cs_Sabine25 Messages postés 84 Date d'inscription jeudi 1 mars 2007 Statut Membre Dernière intervention 22 juin 2007
20 mars 2007 à 20:24
bonjour,
J'ai une erreur comme quoi au niveau de ExecuteNonQuery, j ai un "invalid character", meme avec le prog en commentaire!
j essaye un peu tout et je fouille sur le net mais la j avous que je bloque!

merci pour votre aide
Sabine
voici mon code:

private
void button1_Click(
object sender,
EventArgs e)
{

string

insertCmd =
"INSERT INTO user_mpl VALUES (1,"+textBox1.Text+
","+textBox2.Text+
");";

OleDbConnection connection =
new
OleDbConnection();

DataConnection m =
new
DataConnection();
connection=m.DoConnection();

OleDbCommand cmd =
new
OleDbCommand(insertCmd, connection);

int n=cmd.ExecuteNonQuery();

if (n != 1) {
MessageBox.Show(
"insertion KO"); }
else
MessageBox.Show(
"insertion GOOOOOD!");
m.DoDeconnection();

// String connect = "Provider=OraOLEDB.Oracle;"
//                                + "Data Source=***********;"
//                                + "User ID=*********;"
//                                 + "Password=***********;";

// OleDbConnection con = new OleDbConnection(connect);
// con.Open();
// OleDbCommand cmd = con.CreateCommand();
// cmd.CommandText = "INSERT INTO user_mpl VALUES (1,'blabla','joker');";
// cmd.ExecuteNonQuery();
// con.Close();}

et voici ma connection:

public

class
DataConnection
{

                private
OleDbConnection conn;

                private
string connectString =
"Provider=OraOLEDB.Oracle;"
                                +
"Data Source=*************;"
                                +
"User ID=***********;"
                                +
"Password=***********;";

                public DataConnection()
                {
                    conn =
new
OleDbConnection(connectString);

                   // Le timeOut en secondes
                   //conn.ConnectionTimeout=60;
                 }

                //public void DoConnection()
                public
OleDbConnection DoConnection()
                 {

                 try
                {

                          // Connection
                          conn.Open();

                           Console.WriteLine(
"Connexion établit!!!");

                           return conn;
                 }

                 catch (
OleDbException e)
                 {

                            Console.WriteLine(
"erreur remarquee:" + e);

                            return conn;
                   }
 }

public
void DoDeconnection()
{

try
{
conn.Close();

Console.WriteLine(
"Déconnexion à la base de données");
}

catch (
Exception ex)
{

Console.WriteLine(
"erreur de deconnexion:" + ex);
}
}
}
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
20 mars 2007 à 21:02
Salut,

Plutot que de construire ta requete comme tu le fais, avec des concaténations, tu devrais plutot utiliser des requetes paramétrées (ce qui en plus d'etre plus propre et sécurisé, va certainement résoudre ton probleme)

En gros ca doit donner ca :
string insertCmd = "INSERT INTO user_mpl VALUES (1, ?, ?);";
cmd.parameters.add(textBox1.Text);
cmd.parameters.add(textBox2.Text);

cmd.ExecuteNonQuery();

De plus, il faut absolument que tu fermes ta connexion dans une clause finally (qui s'executera quoiqu'il arrive dans ton code, exception ou non).

try
{
    // Ton Code
}
catch{} // Gestion des exception
finally
{
   connection.Dispose();
   connection = null;
}

Ceci est valable aussi pour les fermeture de fichiers, ...

Mx
MVP C# 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
20 mars 2007 à 21:03
J'oubliais, qques infos sur les requetes paramétrées avec oledb

http://msdn2.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters.aspx

Mx
MVP C# 
0
cs_Sabine25 Messages postés 84 Date d'inscription jeudi 1 mars 2007 Statut Membre Dernière intervention 22 juin 2007
20 mars 2007 à 21:52
Merciiii beaucoup pour ton aide!
je teste tout ca!
Sabine
0
ricklekebekoi Messages postés 303 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 24 avril 2009 5
21 mars 2007 à 02:05
Tiens, un peu hors contexte mais quand même .. a propos du finally ... qu'apporte-t-il de plus ? Je veux dire, les 2 bloc d'instructiosn suivants font la même choses non ?
======================
BLOC A

try
{
    // Ton Code
}
catch{} // Gestion des exception
finally
{
   connection.Dispose();
   connection = null;
}
===================
BLOCB

try
{
    // Ton Code
}
catch{} // Gestion des exception

connection.Dispose();connection null;
Eric
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
21 mars 2007 à 08:52
Héhé, la question avait déja été posée au semblable ;)
Tel que tu l'as écrit, oui la connection sera libérée. Mais dans la réalité, tu ne fais pas un simple catch{ }. Tu peux tout a fait relancer l'exception au code appelant, voire ne pas catcher la bonne exception.
Tu peux aussi avoir un 'return qqchose' dans ton try ou ton catch. Le finally sera appelé, mais pas le code dans ton Bloc B

Simple code de test  :
<hr />public
class
Form1 :
Form
{

   public Form1()
   {

      try  
     {
         Test();
      }

      catch (
Exception e) {
MessageBox.Show(
"Dans catch constructeur"); } 
   }

   
   public
void Test()
   {

      try 
      {

         MessageBox.Show(
"Dans try test");

         throw
new
Exception();

         //return;
      }

      catch (
Exception)
      {

         MessageBox.Show(
"Dans catch test");

         throw;

        //return;
      }

      finally {
MessageBox.Show(
"Dans finally"); }

      MessageBox.Show(
"Apres finally");
   }
}
<hr />
Tu verras que le "Apres finally" ne montre jamais le bout de son nez. Si tu modifies les throw par des return, idem.
D'ailleurs, pour s'en rendre compte plus facilement, Resharper me met la ligne du "apres finally" en gris.

Mx
MVP C# 
0
cs_Sabine25 Messages postés 84 Date d'inscription jeudi 1 mars 2007 Statut Membre Dernière intervention 22 juin 2007
21 mars 2007 à 14:37
Bonjour,
j ai essayé de mettre le paramétrage mais le probleme c est que je créais mon cmd telquel:

OleDbCommand cmd =
new
OleDbCommand(insertCmd, connection);
et donc faire:
string insertCmd = "INSERT INTO user_mpl VALUES (1, ?, ?);";
cmd.parameters.add(textBox1.Text);
cmd.parameters.add(textBox2.Text);
cmd.ExecuteNonQuery();

n est pas possible compte tenu que je passe en parametre 'InsertCmd', donc je peux pas l initialiser avant d ajouter les parametres!!!
enfin je comprends pas vraiment l utilité des paramètres par rapport à ma concaténation, sachant que cést une requete pas compliquée!

donc j en suis toujours au meme point, je sais pas mon erreur du ExecuteNonQuery!!!

merci encore pour vos réponses!

Sabine
0
ricklekebekoi Messages postés 303 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 24 avril 2009 5
21 mars 2007 à 15:04
Eh bah initialise le apres

OleDbCommand cmd;

string insertCmd = "INSERT INTO user_mpl VALUES (1, ?, ?);";

cmd = new

OleDbCommand(insertCmd, connection);

cmd.parameters.add(textBox1.Text);
cmd.parameters.add(textBox2.Text);
cmd.ExecuteNonQuery();

Eric
0
cs_Sabine25 Messages postés 84 Date d'inscription jeudi 1 mars 2007 Statut Membre Dernière intervention 22 juin 2007
21 mars 2007 à 15:57
Arrrfff, j ai tenté un autre paramétrage mais apparement ca marche pas....

OleDbConnection

conn =
null;

private
void button1_Click(
object sender,
EventArgs e){

try{

conn =

new
OleDbConnection(
"Provider=OraOLEDB.Oracle;"+

"Data Source=********;"+

"User ID=***********;"+

"Password=***********;");conn.Open();

OleDbCommand cmd =
new
OleDbCommand(
"INSERT INTO user_mpl VALUES (1, @user, @password);", conn);

OleDbParameter param1 =
new
OleDbParameter();

OleDbParameter param2 =
newOleDbParameter();param1.ParameterName "@user";param2.ParameterName

"@password";param1.Value = textBox1.Text;

param2.Value = textBox2.Text;

cmd.Parameters.Add(param1);

cmd.Parameters.Add(param2);

cmd.ExecuteNonQuery();

}

finally{

conn.Close();

}

}

'Maintenant l erreur est : "missing expression" pour executeNonQuery()
alors là, franchement je sais pas!!!

Encore Merci
Sabine
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
21 mars 2007 à 17:15
Une petite question, pourquoi utilises tu oledb et pas OracleClient

Mx
MVP C# 
0
cs_Sabine25 Messages postés 84 Date d'inscription jeudi 1 mars 2007 Statut Membre Dernière intervention 22 juin 2007
21 mars 2007 à 17:21
Euhh, bonne question! lol
non je l ai pas quand je tape using "System.Data...."
donc je sais pas trop
Mais je crois aue j en suis à ma 150 facons d insérer et que je réinvente le C#...rire!
merci pour ton aide
Sabine
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
21 mars 2007 à 17:45
En fait il faut que tu l'ajoutes en référence a ton projet.
Clic droit sur "references" -> "Ads reference", puis tu choisis System.Data.OracleClient.

On va y arriver

Mx
MVP C# 
0
cs_Sabine25 Messages postés 84 Date d'inscription jeudi 1 mars 2007 Statut Membre Dernière intervention 22 juin 2007
21 mars 2007 à 20:10
ca y est je l ai fais!
voici mon nouveau code



private



void
button1_Click(

object
sender,

EventArgs
e)



{
            OracleConnection conn =
null;
           
conn =
new
OracleConnection(
"Data Source=ICAODBDV_ICAODEV.ICAO.LAN;"
                         +
"User ID=MPLDB;"
                        +
"Password=MPLDB;"); 
           
            conn.Open();
           
OracleCommand cmd = conn.CreateCommand();
           cmd.CommandText =
"INSERT INTO user_mpl (parm1,parm2,parm3) VALUES (?,?,?);" +
  
                                            "COMMIT;";
             
OracleParameter myParameter1 =
new
OracleParameter(
"parm1",
OracleType.Number);
             myParameter1.Value = textBox3.Text;
             
OracleParameter myParameter2 =
new
OracleParameter(
"parm2",
OracleType.VarChar);
             myParameter2.Value = textBox2.Text;
            
OracleParameter myParameter3 =
new
OracleParameter(
"parm3",
OracleType.VarChar);   
             myParameter3.Value = textBox1.Text;
             cmd.Parameters.Add(myParameter1);
             cmd.Parameters.Add(myParameter2);
             cmd.Parameters.Add(myParameter3);
 
             cmd.ExecuteNonQuery();
             cmd.Dispose();
             cmd =
null;
             conn.Close();
}

et la j ai comme erreur "ORA-01036: illegal variable name/number", au niveau de ExecuteNonQuery,
alors que les parametres ont le bon type!!!
est cequ il faut les '?', faut t il des cotes ou autres???
je cherche mais je trouve pleins de version sur le net différentes!!!

merci merci et encore merci

Sabine
0
ricklekebekoi Messages postés 303 Date d'inscription mardi 11 février 2003 Statut Membre Dernière intervention 24 avril 2009 5
21 mars 2007 à 20:14
Je n'y connais absolument rien en oracle, ni en requete parametrés, mais ce ne serait pas:

           cmd.CommandText = "INSERT INTO user_mpl (x,y,x) VALUES (parm1,parm2,parm3);" +
  
                                            "COMMIT;";

Où x,y et z sont les nom de tes colones de ta table oracle ?

Eric
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
21 mars 2007 à 20:23
Essaie avec des parametres précédés de ':'
INSERT INTO user_mpl (parm1,parm2,parm3) VALUES (:p1,:p2,:p3);" 

puis

OracleParameter myParameter1 =
new
OracleParameter(":p1", OracleType.Number);
myParameter1.Value = textBox3.Text;

Mx
MVP C# 
0
cs_Sabine25 Messages postés 84 Date d'inscription jeudi 1 mars 2007 Statut Membre Dernière intervention 22 juin 2007
21 mars 2007 à 20:33
Entre temps j avais trouvé ta solution, mais ca marche toujours pas

toujours "Invalid character"

j ai créé ma table user_mpl comme ceci:
SQL> desc user_mpl
 Name                                      Null?    Type
 ----------------------------------------- -------- -----------------------
 ID_USER                                   NOT NULL NUMBER(38)
 LOGIN                                              VARCHAR2(30)
 PASSWORD                                           VARCHAR2(30)

est ce que les types sont appropriés??? oui je pense!!!

emsuite dans le LOAD j ai rien mis, c est ok?
InitializeComponent se fait dans mon constructeur de Formulaire!!

Bref je sais plus!!!
Merci encore
------------------------------------------------------
OracleCommand
cmd conn.CreateCommand();cmd.CommandText

"INSERT INTO user_mpl (p1,p2,p3) VALUES (:parm1,:parm2,:parm3);" +
"COMMIT;";

OracleParameter myParameter1 =
new
OracleParameter(
":parm1",
OracleType.Number);myParameter1.Value = textBox3.Text;

OracleParameter myParameter2 =
new
OracleParameter(
":parm2",
OracleType.VarChar,30);myParameter2.Value = textBox2.Text;

OracleParameter myParameter3 =
new
OracleParameter(
":parm3",
OracleType.VarChar,30);myParameter3.Value = textBox1.Text;
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
21 mars 2007 à 20:38
Bon, j'installe Oracle et je vois ce que ca dit

Mx
MVP C# 
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
21 mars 2007 à 21:15
Ok on y est

Il s'agit simplement du ';' dans ta requete....
ce qui donne, par rapport a la structure de ta table

<hr />OracleCommand

cmd = conn.CreateCommand();
cmd.CommandText =
"INSERT INTO user_mpl (ID_USER, LOGIN, PASSWORD) VALUES (:parm1,:parm2,:parm3)";

OracleParameter myParameter1 =
new
OracleParameter(
":parm1",
OracleType.Number);
myParameter1.Value = textBox1.Text

OracleParameter myParameter2 =
new
OracleParameter(
":parm2",
OracleType.VarChar, 30);
myParameter2.Value = textBox2.Text;

OracleParameter myParameter3 =
new
OracleParameter(
":parm3",
OracleType.VarChar, 30);
myParameter3.Value = textBox3.Text

cmd.Parameters.Add(myParameter1);
cmd.Parameters.Add(myParameter2);
cmd.Parameters.Add(myParameter3);
cmd.ExecuteNonQuery();
<hr />

Mx
MVP C# 
0
Rejoignez-nous