Erreur d'une requéte trés trés simple - SQL/NoSQL - Programmation
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 ?
Marsh Posté le 23-12-2009 à 22:15:08
Acheter un Bescherelle.
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
Marsh Posté le 24-12-2009 à 01:21:02
alors pourquoi cette requête marche trés bien :
Code :
|
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
Marsh Posté le 24-12-2009 à 09:13:29
man_u a écrit : |
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 :
|
comme dit couak, parce que c'est pas la même chose...
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.
Marsh Posté le 25-12-2009 à 20:41:32
Harkonnen a écrit : |
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...
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.
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 :
|
Ma SEQUENCE
Code :
|
Mon TRIGGER
Code :
|
et la fonction :
Code :
|
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 :
|
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.
|
merci pour ton aide MagicBuzz mais l'erreur reste toujours !!!!!
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
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
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'.
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 )
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
Marsh Posté le 28-12-2009 à 18:33:01
vous n'allez pas me croire mais sa marche toujours pas
voici l'erreur :
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.
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 :
|
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é.
Marsh Posté le 28-12-2009 à 21:33:11
benn j'ai affiché la requéte et elle me donne:
et quand j'essaye cette requête dans SQL+ , elle marche
Code :
|
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.²
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...
Marsh Posté le 29-12-2009 à 22:12:48
le premier problème c'est réglé , mais il reste le dernier si vous pouvez
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 :
|
et cela ne marche pas dans une autre table:
Code :
|
il m'affiche une exception genre :
et pourtant les tables sont idhentiques
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)
Marsh Posté le 29-12-2009 à 23:21:01
elle est de type NUMBER , exactement comme N_Client dans la table Cleint_t
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)
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)
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.
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
MagicBuzz a écrit :
|
ça je lui ai dit, mais il s'en fout
fred777888999 a écrit : Cette facon antique de lire les donnees est de toutes facons a proscrire. |
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
Marsh Posté le 30-12-2009 à 14:06:15
Harkonnen a écrit : |
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
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
Marsh Posté le 30-12-2009 à 22:06:49
Merci a vouuuuuuuuuuuuuuus infiniment
Harkonnen a écrit : |
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
Marsh Posté le 23-12-2009 à 21:36:56
j'aimerai savoir ou est l'erreur dans cette requête:
il m'affiche une erreur : Erreur a la ligne 2 Parenthèse de droite absente
PS: je suis sous SQL Plus 8.0.