C# .NET insertion dans BD Orale [Résolu]

cs_Sabine25 84 Messages postés jeudi 1 mars 2007Date d'inscription 22 juin 2007 Dernière intervention - 20 mars 2007 à 17:06 - Dernière réponse :  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();
}
Afficher la suite 

Votre réponse

31 réponses

Meilleure réponse
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 21 mars 2007 à 22:00
3
Merci
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# 

Merci MorpionMx 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 92 internautes ce mois-ci

Commenter la réponse de MorpionMx
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 20 mars 2007 à 17:22
0
Merci
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# 
Commenter la réponse de MorpionMx
cs_Sabine25 84 Messages postés jeudi 1 mars 2007Date d'inscription 22 juin 2007 Dernière intervention - 20 mars 2007 à 20:24
0
Merci
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);
}
}
}
Commenter la réponse de cs_Sabine25
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 20 mars 2007 à 21:02
0
Merci
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# 
Commenter la réponse de MorpionMx
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 20 mars 2007 à 21:03
0
Merci
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# 
Commenter la réponse de MorpionMx
cs_Sabine25 84 Messages postés jeudi 1 mars 2007Date d'inscription 22 juin 2007 Dernière intervention - 20 mars 2007 à 21:52
0
Merci
Merciiii beaucoup pour ton aide!
je teste tout ca!
Sabine
Commenter la réponse de cs_Sabine25
ricklekebekoi 305 Messages postés mardi 11 février 2003Date d'inscription 24 avril 2009 Dernière intervention - 21 mars 2007 à 02:05
0
Merci
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
Commenter la réponse de ricklekebekoi
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 21 mars 2007 à 08:52
0
Merci
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# 
Commenter la réponse de MorpionMx
cs_Sabine25 84 Messages postés jeudi 1 mars 2007Date d'inscription 22 juin 2007 Dernière intervention - 21 mars 2007 à 14:37
0
Merci
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
Commenter la réponse de cs_Sabine25
ricklekebekoi 305 Messages postés mardi 11 février 2003Date d'inscription 24 avril 2009 Dernière intervention - 21 mars 2007 à 15:04
0
Merci
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
Commenter la réponse de ricklekebekoi
cs_Sabine25 84 Messages postés jeudi 1 mars 2007Date d'inscription 22 juin 2007 Dernière intervention - 21 mars 2007 à 15:57
0
Merci
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
Commenter la réponse de cs_Sabine25
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 21 mars 2007 à 17:15
0
Merci
Une petite question, pourquoi utilises tu oledb et pas OracleClient

Mx
MVP C# 
Commenter la réponse de MorpionMx
cs_Sabine25 84 Messages postés jeudi 1 mars 2007Date d'inscription 22 juin 2007 Dernière intervention - 21 mars 2007 à 17:21
0
Merci
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
Commenter la réponse de cs_Sabine25
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 21 mars 2007 à 17:45
0
Merci
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# 
Commenter la réponse de MorpionMx
cs_Sabine25 84 Messages postés jeudi 1 mars 2007Date d'inscription 22 juin 2007 Dernière intervention - 21 mars 2007 à 20:10
0
Merci
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
Commenter la réponse de cs_Sabine25
ricklekebekoi 305 Messages postés mardi 11 février 2003Date d'inscription 24 avril 2009 Dernière intervention - 21 mars 2007 à 20:14
0
Merci
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
Commenter la réponse de ricklekebekoi
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 21 mars 2007 à 20:23
0
Merci
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# 
Commenter la réponse de MorpionMx
cs_Sabine25 84 Messages postés jeudi 1 mars 2007Date d'inscription 22 juin 2007 Dernière intervention - 21 mars 2007 à 20:33
0
Merci
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;
Commenter la réponse de cs_Sabine25
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 21 mars 2007 à 20:38
0
Merci
Bon, j'installe Oracle et je vois ce que ca dit

Mx
MVP C# 
Commenter la réponse de MorpionMx
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 21 mars 2007 à 21:15
0
Merci
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# 
Commenter la réponse de MorpionMx

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.