Erreur d'une requéte trés trés simple

Erreur d'une requéte trés trés simple - SQL/NoSQL - Programmation

Marsh Posté le 23-12-2009 à 21:36:56    

j'aimerai savoir ou est l'erreur dans cette requête:

Code :
  1. create table client(
  2. N_Client int(11) NOT NULL AUTO_INCREMENT,
  3. Nom varchar2(20),
  4. Adresse varchar2(20),
  5. Constraint PK_Client Primary Key (N_Client)
  6. );


il m'affiche une erreur : Erreur a la ligne 2 Parenthèse de droite absente
PS: je suis sous SQL Plus 8.0.
 

Reply

Marsh Posté le 23-12-2009 à 21:36:56   

Reply

Marsh Posté le 23-12-2009 à 21:50:51    

parce que tu exécutes une syntaxe mysql sur de l'oracle

Reply

Marsh Posté le 23-12-2009 à 21:56:56    

comment sa ? j'ai pas bien saisie !!!  
a ton avis qu'est ce que je dois faire alors ?


Message édité par man_u le 23-12-2009 à 22:28:36
Reply

Marsh Posté le 23-12-2009 à 22:15:08    

Acheter un Bescherelle.


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 24-12-2009 à 00:16:27    

commencer par faire la différence entre MySQL et Oracle, ensuite tu pourras te lancer dessus

Reply

Marsh Posté le 24-12-2009 à 01:21:02    

alors pourquoi cette requête marche trés bien :

Code :
  1. create table client(
  2. N_Client int(11) NOT NULL ,
  3. Nom varchar2(20),
  4. Adresse varchar2(20),
  5. Constraint PK_Client Primary Key (N_Client)
  6. );

Reply

Marsh Posté le 24-12-2009 à 08:36:20    

parceq ue c'est pas la même commande... bon allez vu que tu as l'air vachement intelligent avec ta manière de prendre les gens de haut, je vais virer le drapal de ce sujet de conversation, et ne pas aider car je sens que je vais m'énerver

Reply

Marsh Posté le 24-12-2009 à 09:13:29    

man_u a écrit :


il m'affiche une erreur : Erreur a la ligne 2 Parenthèse de droite absente
PS: je suis sous SQL Plus 8.0.
 


SQL Plus n'est pas un SGBD, c'est un client en ligne de commande de SGBD, en l'occurence Oracle. merci d'être plus précis la prochaine fois.
et ton erreur vient du fait que AUTO_INCREMENT n'existe pas sous Oracle. pour simuler la même chose, tu dois utiliser une séquence et un trigger.
 

man_u a écrit :

alors pourquoi cette requête marche trés bien :

Code :
  1. create table client(
  2. N_Client int(11) NOT NULL ,
  3. Nom varchar2(20),
  4. Adresse varchar2(20),
  5. Constraint PK_Client Primary Key (N_Client)
  6. );



comme dit couak, parce que c'est pas la même chose... :heink:
il serait bien de te renseigner sur la syntaxe du SGBD que tu utilises, MySQL n'est pas un standard de fait, loin de là. tu fais n'importe quoi.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 25-12-2009 à 20:41:32    

Harkonnen a écrit :


il serait bien de te renseigner sur la syntaxe du SGBD que tu utilises, MySQL n'est pas un standard de fait, loin de là. tu fais n'importe quoi.


Bizarre, en lisant sa requête, j'ai plutôt pensé à du PostgreSQL à cause du constraint. Ce qui n'enlève rien aux réponses de ce topic. L'auto incrément n'existe pas plus sous PostgreSQL qu'il n'existe sous Oracle...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-12-2009 à 17:53:51    

Mais SQLPlus est un logiciel fourni avec Oracle. Pour ma part, je pense plutôt qu'il travaille effectivement sur Oracle. Même s'il y a une "norme" SQL, tous les SGBDD ne fonctionnent pas de la même manière, il faut donc apprendre ses spécificités avant de travailler sur un SGBDD nouveau.


---------------
http://www.aideinfo.com/  Whois adresses IP/domaines le plus évolué !!  FAQ Free Mobile
Reply

Marsh Posté le 26-12-2009 à 17:53:51   

Reply

Marsh Posté le 27-12-2009 à 21:22:05    

après quelque documentation j'ai su que dans Oracle il n'existe pas l'option d'AUTO-INCREMENT comme dans MySQL, il faut d'abord crée une SEQUENCE et un TRIGGER. après avoir implémenté Ma Sequence et mon TRIGGER et j'ai essayer d'insérer des informations dans ma table (directement sur SQL plus) tous marche bien et le champs s'incrémente tous seul mais qu'on j'essaye par un programme en C# il m'affiche une erreur : ORACLE.DATACCESS.CLIENT.ORACLE COMMANDE.TRANSACTION ne peut pas etre assigné --- il est en lecture seul
voilà ma TABLE:

Code :
  1. create table client(
  2. NClient NUMBER(11) NOT NULL ,
  3. Nom varchar2(20),
  4. Adresse varchar2(20),
  5. Constraint PK_Client Primary Key (NClient)
  6. );


Ma SEQUENCE  

Code :
  1. CREATE SEQUENCE seq_client
  2. START WITH 1
  3. MINVALUE 1
  4. NOCYCLE
  5. NOCACHE
  6. ORDER;


Mon TRIGGER

Code :
  1. CREATE OR REPLACE TRIGGER trg_client
  2. BEFORE INSERT
  3. ON client
  4. REFERENCING NEW AS NEW OLD AS OLD
  5. FOR EACH ROW
  6. BEGIN
  7. SELECT seq_client.nextval
  8. INTO :NEW.NClient
  9. FROM DUAL;
  10. END;
  11. /


 et la fonction :

Code :
  1. public void Compte(String nom, String adresse)
  2.         {
  3.             string strConn = Connection();
  4.             // Récupération de l'objet OracleTransaction : Début de la transaction
  5.             OracleTransaction trans = conn.BeginTransaction();
  6.             string sQuery2 = "INSERT INTO client(Nom,Adresse) values ('" + nom + "','" + adresse + "'))";
  7.             OracleCommand cmd2 = new OracleCommand(sQuery2, conn);
  8.             cmd2.CommandType = CommandType.Text;
  9.             cmd2.Transaction = trans; // l'erreur a ce niveau  
  10.             try
  11.             {
  12.                 // Exécution de la requête
  13.                 cmd2.ExecuteNonQuery();
  14.                 // On soumet la requête au serveur: tout s'est bien déroulé , la requête est exécutée
  15.                 trans.Commit();
  16.                 Console.WriteLine("Insertion effectuée avec succès" );
  17.             }
  18.             catch (Exception ex)
  19.             {
  20.                 // Une erreur est survenue: on ne valide pas la requête
  21.                 trans.Rollback();
  22.                 Console.WriteLine("Insertion non effectuée !!\nErreur: " + ex.Message);
  23.             }
  24.             finally
  25.             {
  26.                 // Libération des resources
  27.                 cmd2.Dispose();
  28.             }
  29. }


Reply

Marsh Posté le 28-12-2009 à 11:06:37    

Il ne faut pas créer ta transaction en dehors du scope de ton objet command.
 
Tes instructions ne sont donc pas dans l'ordre. De mémoire, ceci devrait marcher :
 

Code :
  1. public void Compte(String nom, String adresse)
  2.        {
  3.            string strConn = Connection();
  4.            string sQuery2 = "INSERT INTO client(Nom,Adresse) values ('" + nom + "','" + adresse + "'))";
  5.            OracleCommand cmd2 = new OracleCommand(sQuery2, conn);
  6.            cmd2.CommandType = CommandType.Text;
  7.  
  8.            // Récupération de l'objet OracleTransaction : Début de la transaction
  9.            OracleTransaction trans = conn.BeginTransaction();
  10.            cmd2.Transaction = trans; // l'erreur a ce niveau
  11.            try
  12.            {
  13.                // Exécution de la requête
  14.                cmd2.ExecuteNonQuery();
  15.                // On soumet la requête au serveur: tout s'est bien déroulé , la requête est exécutée
  16.                trans.Commit();
  17.  
  18.                Console.WriteLine("Insertion effectuée avec succès" );
  19.            }
  20.            catch (Exception ex)
  21.            {
  22.                // Une erreur est survenue: on ne valide pas la requête
  23.                trans.Rollback();
  24.  
  25.                Console.WriteLine("Insertion non effectuée !!\nErreur: " + ex.Message);
  26.            }
  27.            finally
  28.            {
  29.                // Libération des resources
  30.                cmd2.Dispose();
  31.            }
  32. }

Reply

Marsh Posté le 28-12-2009 à 16:33:06    

MagicBuzz a écrit :

Il ne faut pas créer ta transaction en dehors du scope de ton objet command.
 
Tes instructions ne sont donc pas dans l'ordre. De mémoire, ceci devrait marcher :
 

Code :
  1. public void Compte(String nom, String adresse)
  2.        {
  3.            string strConn = Connection();
  4.            string sQuery2 = "INSERT INTO client(Nom,Adresse) values ('" + nom + "','" + adresse + "'))";
  5.            OracleCommand cmd2 = new OracleCommand(sQuery2, conn);
  6.            cmd2.CommandType = CommandType.Text;
  7.  
  8.            // Récupération de l'objet OracleTransaction : Début de la transaction
  9.            OracleTransaction trans = conn.BeginTransaction();
  10.            cmd2.Transaction = trans; // l'erreur a ce niveau
  11.            try
  12.            {
  13.                // Exécution de la requête
  14.                cmd2.ExecuteNonQuery();
  15.                // On soumet la requête au serveur: tout s'est bien déroulé , la requête est exécutée
  16.                trans.Commit();
  17.  
  18.                Console.WriteLine("Insertion effectuée avec succès" );
  19.            }
  20.            catch (Exception ex)
  21.            {
  22.                // Une erreur est survenue: on ne valide pas la requête
  23.                trans.Rollback();
  24.  
  25.                Console.WriteLine("Insertion non effectuée !!\nErreur: " + ex.Message);
  26.            }
  27.            finally
  28.            {
  29.                // Libération des resources
  30.                cmd2.Dispose();
  31.            }
  32. }



 
merci pour ton aide MagicBuzz mais l'erreur reste toujours !!!!!
 

Reply

Marsh Posté le 28-12-2009 à 17:02:10    

Quelle usine a gaz (ton trigger), il est plus simple de faire un seq_client.Nextval lors de l'insert.
Sinon le message est clair, tu ne dois pas affecter ta transaction a l'objet commande. Il faut simplement commencer la transaction sur ton objet commande et eventuellement faire un rollback sur cet objet, mais il est inutile de la reafecter.
Vire la ligne 10 et tout se passera donc beaucoup mieux.
 
PS : MB, je croyais que tes new responsabilites ne te laissaient plus le temps de glander ici meme entre noel et le jour de l'an :)

Reply

Marsh Posté le 28-12-2009 à 17:21:03    

fred > Ben c'est simple... Tout le projet est bloqué pour un problème de contrat, alors j'ai rien de plus à faire qu'un techos au chômage technique :D


Message édité par MagicBuzz le 28-12-2009 à 17:35:15
Reply

Marsh Posté le 28-12-2009 à 17:25:33    

Ben pourquoi tu veux changer ca ?
Ca te sert a savoir sur quoi tu dois 'rollbacker'.

Reply

Marsh Posté le 28-12-2009 à 17:38:42    

(oublie le message précédent que j'ai édité)
 
(enfin, relis-le, mais c'est off topic ;))

Reply

Marsh Posté le 28-12-2009 à 17:47:30    

lol, t tj aussi simple a comprendre toi :) Je reedite pas, tans pis pour les relecteurs :)

Reply

Marsh Posté le 28-12-2009 à 18:33:01    

vous n'allez pas me croire mais sa marche toujours pas :(
voici l'erreur :
http://ups.imagup.com/06/1262069413.png


Message édité par man_u le 28-12-2009 à 18:35:17
Reply

Marsh Posté le 28-12-2009 à 19:15:30    

un peu d'initiative bon sang.... on va pas te macher le boulot sans arrêt ! le message est pourtant clair non ?
pour info, sous SQL+, le point virgule est nécessaire à la fin de la requête.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 28-12-2009 à 20:56:39    

le problème n'est pas dans le point virgule, même avec ce code l'erreur reste .

Code :
  1. public void Compte(String nom, String adresse)
  2.         {
  3.             string strConn = Connection();
  4.             string sQuery2 = "INSERT INTO client(Nom,Adresse) values ('" + nom + "','" + adresse + "'));";
  5.             OracleCommand cmd2 = new OracleCommand(sQuery2, conn);
  6.             cmd2.CommandType = CommandType.Text;
  7.             // Récupération de l'objet OracleTransaction : Début de la transaction
  8.             OracleTransaction trans = conn.BeginTransaction();
  9.             //cmd2.Transaction = trans;  
  10.             try
  11.             {
  12.                 // Exécution de la requête
  13.                 cmd2.ExecuteNonQuery();
  14.                 // On soumet la requête au serveur: tout s'est bien déroulé , la requête est exécutée
  15.                 trans.Commit();
  16.                 Console.WriteLine("Insertion effectuée avec succès" );
  17.             }
  18.             catch (Exception ex)
  19.             {
  20.                 // Une erreur est survenue: on ne valide pas la requête
  21.                 trans.Rollback();
  22.                 Console.WriteLine("Insertion non effectuée !!\nErreur: " + ex.Message);
  23.             }
  24.             finally
  25.             {
  26.                 // Libération des resources
  27.                 cmd2.Dispose();
  28.             }
  29. }


Message édité par man_u le 28-12-2009 à 20:57:18
Reply

Marsh Posté le 28-12-2009 à 21:01:29    

t'as essayé de regarder la requête qui est générée ? est elle correcte ? n'y a t'il pas un caractère spécial dans le nom ou l'adresse qui fait tout foirer.... ?
ça fait partie des vérifs de base hein...
une autre info : les requêtes construites à partir de concaténations de chaines, c'est très mal. regarde du coté des requêtes paramétrées, c'est largement plus sécurisé.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 28-12-2009 à 21:33:11    

benn j'ai affiché la requéte et elle me donne:
http://ups.imagup.com/06/1262079845.png
et quand j'essaye cette requête dans SQL+ , elle marche  
http://ups.imagup.com/06/1262080070.png

Code :
  1. public void Compte(String nom, String adresse)
  2.         {
  3.             string strConn = Connection();
  4.             string sQuery2 = "INSERT INTO client(Nom,Adresse) values ('" + nom + "','" + adresse + "');";
  5.             OracleCommand cmd2 = new OracleCommand(sQuery2, conn);
  6.             cmd2.CommandType = CommandType.Text;
  7.             // Récupération de l'objet OracleTransaction : Début de la transaction
  8.             OracleTransaction trans = conn.BeginTransaction();
  9.             //cmd2.Transaction = trans;   
  10.             try
  11.             {
  12.                 // Exécution de la requête
  13.                 cmd2.ExecuteNonQuery();
  14.                 // On soumet la requête au serveur: tout s'est bien déroulé , la requête est exécutée
  15.                 trans.Commit();
  16.                 Console.WriteLine("Insertion effectuée avec succès" );
  17.             }
  18.             catch (Exception ex)
  19.             {
  20.                 // Une erreur est survenue: on ne valide pas la requête
  21.                 trans.Rollback();
  22.                 Console.WriteLine("Insertion non effectuée !!\nErreur: " + ex.Message);
  23.             }
  24.             finally
  25.             {
  26.                 // Libération des resources
  27.                 cmd2.Dispose();
  28.             }
  29. }


Message édité par man_u le 28-12-2009 à 21:34:26
Reply

Marsh Posté le 29-12-2009 à 09:14:33    

ne met pas de ";" dans ta requête SQL quand tu l'envoies depuis un programme. le ; sert à séparer deux instruction SQL, alors qu'en C# tu dois passer par deux command.execute() pour le faire. Donc pas de ; sinon boum.²

Reply

Marsh Posté le 29-12-2009 à 11:22:23    

Merci MagicBuzz , sa marche trais bien. Merci encore ;)

Reply

Marsh Posté le 29-12-2009 à 11:33:42    

"le problème n'est pas dans le point-virgule", disais tu 5 posts plus haut... :sarcastic:


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 29-12-2009 à 22:12:48    

le premier problème c'est réglé  :sol: , mais il reste le dernier si vous pouvez :p  
ben le problème on réalité n'est pas un problème mdr , parcequ'il ne marche pas dans certain table et il marche dans d'autre !!!
cela marche dans une table:

Code :
  1. string sQuery = "SELECT N_Client FROM client_t where Nom='" + nom + "'And Adresse ='" + adresse + "'";
  2.             // Instanciation de l'objet OracleCommand et de ses propriétés
  3.             OracleCommand cmd = new OracleCommand(sQuery);
  4.             cmd.Connection = conn;
  5.             cmd.CommandType = CommandType.Text;
  6.             // On instancie notre OracleDataReader
  7.             OracleDataReader reader = cmd.ExecuteReader();
  8.             // lire les résultat
  9.             reader.Read();
  10.             // envoyé le num
  11.             return (reader.GetInt32(0));


et cela ne marche pas dans une autre table:

Code :
  1. string sQuery = "SELECT NLivre FROM livre where Titre='" + titre + "'And Resume ='" + resume + "' And Sommaire='"+sommaire+"'";
  2.             // Instanciation de l'objet OracleCommand et de ses propriétés
  3.             OracleCommand cmd = new OracleCommand(sQuery);
  4.             cmd.Connection = conn;
  5.             cmd.CommandType = CommandType.Text;
  6.             // On instancie notre OracleDataReader
  7.             OracleDataReader reader = cmd.ExecuteReader();
  8.             // lire les résultat
  9.             reader.Read();
  10.             // envoyé le num
  11.             return (reader.GetInt32(0));


il m'affiche une exception genre :
http://ups.imagup.com/06/1262168736.png
et pourtant les tables sont idhentiques

Reply

Marsh Posté le 29-12-2009 à 23:05:18    

t'es sur que ta colonne NLivre est bien de type Int ? (et pas BigInt, ou Char ou autre)


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 29-12-2009 à 23:21:01    

elle est de type NUMBER , exactement comme N_Client dans la table Cleint_t

Reply

Marsh Posté le 29-12-2009 à 23:48:38    

alors c'est pas bon : Number est un type décimal et toi tu le récupères comme un entier. essaie avec GetFloat(0) à la place de GetInt32(0)


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-12-2009 à 09:16:41    

Non, c'est GetDecimal pour récupérer un Number, Float est une autre représentation (qui existe aussi en SQL)

 

Mais j'ai plusieurs autre remarques :
1/ Ne pas utiliser de concaténations de variables pour exécuter des requêtes depuis du code. Préférer les requête paramétrées ! En effet, essaie un titre genre "L'appel de la forêt" et admire le plantage !
2/ Tu récupères seulement la première ligne de ton résultat, donc préfère ExecuteScalar() qui retourne directe le premier champ de la première ligne de résultat (ou null si pas de résultat) sans devoir faire de Read ni rien, c'est beaucoup moins consommateur)

Message cité 1 fois
Message édité par MagicBuzz le 30-12-2009 à 09:17:32
Reply

Marsh Posté le 30-12-2009 à 09:58:32    

Cette facon antique de lire les donnees est de toutes facons a proscrire.
Si tu veux faire plus obsolete, renonce a la base de donnee et passe aux fichiers a plat.
Si tu veux faire plus moderne, efficace et facile a maintenir, NHibernate ou autres framework de persistance (j'aime bien myGeneration personnellement) sont tes amis.

Reply

Marsh Posté le 30-12-2009 à 11:04:50    

MagicBuzz a écrit :

Non, c'est GetDecimal pour récupérer un Number, Float est une autre représentation (qui existe aussi en SQL)


au temps pour moi :jap:

 
MagicBuzz a écrit :


1/ Ne pas utiliser de concaténations de variables pour exécuter des requêtes depuis du code. Préférer les requête paramétrées ! En effet, essaie un titre genre "L'appel de la forêt" et admire le plantage !


ça je lui ai dit, mais il s'en fout [:sadnoir]

 
fred777888999 a écrit :

Cette facon antique de lire les donnees est de toutes facons a proscrire.
Si tu veux faire plus obsolete, renonce a la base de donnee et passe aux fichiers a plat.
Si tu veux faire plus moderne, efficace et facile a maintenir, NHibernate ou autres framework de persistance (j'aime bien myGeneration personnellement) sont tes amis.


c'est ptet antique, mais ça reste ce qu'il y a de plus efficace et rapide, parce que quand tu regardes la tronche du SQL généré par NHibernate sur certaines requêtes...
les ORM c'est le mal

Message cité 2 fois
Message édité par Harkonnen le 30-12-2009 à 11:07:06

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-12-2009 à 14:06:15    


Harkonnen a écrit :


c'est ptet antique, mais ça reste ce qu'il y a de plus efficace et rapide, parce que quand tu regardes la tronche du SQL généré par NHibernate sur certaines requêtes...
les ORM c'est le mal


 
T'as raison, faut d'ailleurs arreter de coder en c#, parceque quand tu vois la gueule du binaire genere par rapport a ce que tu ferais en le faisant a la main, les languages autres que le binaire c'est vachement moins performant...  
Faut vivre avec son temps mon gars :)

Reply

Marsh Posté le 30-12-2009 à 18:58:56    

euh, joker, je pense comme harko un peu, mais j'ai pas d'argument pour ou contre, et j'ai pas envie de fâcher fred :D


Message édité par MagicBuzz le 30-12-2009 à 18:59:06
Reply

Marsh Posté le 30-12-2009 à 22:06:49    

Merci a vouuuuuuuuuuuuuuus infiniment  :bounce:  
 

Harkonnen a écrit :


ça je lui ai dit, mais il s'en fout [:sadnoir]
 


non c'est pas sa Harkonnen , c'est que moi je préféré commencer par enlever les erreurs et après l'amélioration, tkt j'ai pris tes remarques en considération.
merci encore  :hello:  

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed