Précédent   Forum des professionnels en informatique > Bases de données > Firebird
Firebird Forum d'entraide sur le SGBD Firebird. Avant de poster -> F.A.Q Firebird, Tutoriels
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/07/2007, 12h32   #1
Membre du Club
 
Avatar de jibe74
 
Inscription : avril 2004
Messages : 121
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 121
Points : 48
Points : 48
Par défaut Erreur "Record changed by another user"

Bonjour

J'ai un problème qui semble tout bête mais pour lequel je n'arrive pas à trouver de solution ni même déterminer les causes exactes.

J'ai une base firebird 2.0 avec plusieurs tables que je manipule avec un programme écrit avec C++Builder et les composants SQLDirect. Pour une table, j'ai des erreurs "Record changed by another user" dès que j'essaie d'y écrire... Or, je travaille en local, et je suis bien certain qu'aucune autre application n'accède à cette table.

gfix ne me trouve aucune "limbo transaction", je ne comprends pas la raison de cette erreur... Quelqu'un l'a déjà rencontrée ? Quelle solution ?

J'ai tenté sans succès de passer l'update mode en upWhereKeyOnly...
__________________
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein.
jibe74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 16h51   #2
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
houlala ...
il faut aprendre à gérer tes transactions et tu n'as pas de limbo (limbo c'est seulement pour les commit deux phases entre deux bases)

SQLDirect n'est pas forcément le meilleur choix
en tout cas manifestement tu le manies mal
c'est plus une question SQLDIRECT qu'une question Firebird
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 17h44   #3
Membre du Club
 
Avatar de jibe74
 
Inscription : avril 2004
Messages : 121
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 121
Points : 48
Points : 48
Merci pour ta réponse.

Un problème de transactions ? Je m'en doutais un peu. Mais j'ai du mal à comprendre ce qui ne va pas... Une transaction est bien en cours, aucune autre opération d'écriture n'a été effectuée avant ! Bon, je vais faire quelques essais simples pour tenter de comprendre ce qui pourrait ne pas aller...

Citation:
Envoyé par makowski
tu n'as pas de limbo (limbo c'est seulement pour les commit deux phases entre deux bases)
Argh ! Là, effectivement, je dois avoir mal compris quelque chose... Je pensais qu'une limbo transaction était une transaction laissée en plan lors d'une interruption du programme (par exemple suite à erreur mal gérée... ou reboot sauvage) ou coupure de la liaison avec le serveur ?

Citation:
Envoyé par makowski
SQLDirect n'est pas forcément le meilleur choix
Probablement. J'y ai découvert effectivement plusieurs bugs. Mais bon, Yuri Sheino est assez réactif et je crains que ce soit un boulot assez énorme de transformer cette appli pour utiliser autre chose... A moins qu'il y ait un jeu de composants ayant la même approche et facilement adaptables ?
__________________
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein.
jibe74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2007, 19h45   #4
Expert Confirmé

 
Homme Philippe Makowski
Consultant spécialité Firebird
Inscription : mai 2002
Messages : 2 215
Détails du profil
Informations personnelles :
Nom : Homme Philippe Makowski
Âge : 49
Localisation : France

Informations professionnelles :
Activité : Consultant spécialité Firebird
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 2 215
Points : 3 318
Points : 3 318
en l'espèce ce n'est pas un bug sqldirect
sqldirect est très bien quand on doit travailler avec differents sgdb
si tu ne dois travailler qu'avec Firebird, autant prendre des outils spécialisés Firebird
pour C++, il y a IBPP, mais aussi UIB qui fonctionnent avec C++Builder
mais c'est une autre logique

il faut que tu isoles tes traitements ou que tu fonctionnes en read committed
à la manière du BDE
ou alors que tu isoles tes traitements, travailles avec des select qui rapatrient les choses dans un dataset en mémoire et qui ferment leur transaction et faire des update, insert, delete dans une autre transaction
__________________
Philippe Makowski
IBPhoenix - Firebird
Membre de l'April
makowski est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2007, 01h01   #5
Membre du Club
 
Avatar de jibe74
 
Inscription : avril 2004
Messages : 121
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 121
Points : 48
Points : 48
Effectivement, ce ne doit pas être un bug SQLDirect, puisque tout fonctionne bien avec d'autres tables, et qu'un essai simple avec celle-ci fonctionne egalement. C'est bien un code assez m**dique qui doit être à l'origine du problème.

Mais comme en fouillant un peu j'étais tombé sur ceci et que j'ai effectivement sur cette table plusieurs index numériques et composés, je me demandais un peu s'il y avait une astuce...

En fait, c'est une appli que je reprends, qui avait été écrite il y a longtemps en utilisant BDE, puis est passée sous FlashFiler pour finir avec Firebird... Autant dire que le code n'est pas très génial ! Mais comme elle fonctionne à 80% dans l'état actuel, et que je ne suis chargé que de mettre au point les 20% qui ne l'ont pas été lors de la migration depuis FlashFiler, j'hésite un peu à tout reprendre...

Je connais IBPP qui est bien, mais ce ne sont pas des composants => une philosophie assez différente et réécriture totale des parties concernées, et au final manque de cohérence avec le reste de l'appli... J'ai découvert UIB il y a quelque temps au hasard de mes interrogations de google, mais n'ai pas étudié de près. Serait-ce assez facile de (tout) repasser de SQLDirect à UIB sans trop modifier de code ? Serait-ce intéressant ?

J'en doute un peu, si on garde une approche de type BDE... A moins que cela facilite nettement la mise au point de la partie que je dois faire fonctionner ? J'apprécierai tout conseil, mais j'ai bien peur d'être condamné à me débrouiller avec ce qui existe
__________________
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : Rien ne fonctionne... et personne ne sait pourquoi ! Albert Einstein.
jibe74 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h15.


 
 
 
 
Partenaires

Hébergement Web