IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bases de données Delphi Discussion :

[Delphi 4] Probleme sur Blob null avec UpdateSQL


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 84
    Points : 61
    Points
    61
    Par défaut [Delphi 4] Probleme sur Blob null avec UpdateSQL
    Bonjour,
    J'ai écrit un programme qui accède à une grosse base de données. Comme cela doit marcher en mode client/serveur j'utilise des TQuery avec des TUpdateSQL.

    Cette base contient des blobs qui peuvent être NULL. Mais quand ils sont NULL je me suis aperçu que les valeurs mises en base sont n'importe quoi (pour ces blobs), voir que j'ai des erreurs "handle de blob incorrect".

    En revanche, si je force leur valeur en y mettant un espace, cela se passe bien. Donc j'en conclus qu'en Delphi4 le cache est incorrect en présence de blobs NULL.

    Quelqu'un aurait-il déjà rencontré ce problème, et surtout trouvé la solution pour le contourner?

    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    TQuery ? BDE ? sur quelle type de Base de Données ?
    Paradox ? Access ? ou SQL Server ? Oracle ? InterBase et dans ce cas, mieux vaudrait utiliser ADO ou DBExpress ...
    Une Grosse Base ? Combien ?

    Ensuite, la gestion des BLOBS doit être la plus restreinte que possible, évite de faire un SELECT * par exemple !

    Utilises-tu des requêtes paramètrées ? force tu bien le type du paramète à Blob après une affectation AsValue := Null; (équivalent de Clear()
    N'hésite pas à faire une requête pour les données simples et une autre requête pour le BLOB (si c'est vraiement utile !)

    Personnellement, je trouve qu'utiliser un Query en RequestLive avec Edit\Post en mode Client\Server c'est très vilain, mieux vaut laisser le Query en lecture seule (nettement plus performant) puis utiliser un TClientDataSet pour le cache, et ensuite effectuer les mises à jour manuellement avec du SQL explicite !
    Rien est pire que de devoir chercher dans SQLUpdate pour trouver des SQL, c'est l'utilisation de delphi comme clicodrome, ce n'est pas prudent !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 84
    Points : 61
    Points
    61
    Par défaut
    La base est du MySQL. Mais le problème ne vient clairement pas de là. Car les traces ODBC (oui en prime cela passe par ODBC) prouvent que c'est la requête émise par Delphi qui est foireuse.

    Pour l'historique de l'application, initialement nous utilisions des TTable, ce qui permettait une gestion très simple de toutes les opérations (ajout/suppression/modification) de la table. Sauf que cela ne marche pas en client/serveur du fait des timeout. D'où le basculement sur le couple TQuery/TUpdateSQL qui semblait permettre de faire l'équivalent facilement. Mais visiblement cela entraîne des effets de bord problématiques.

    En ce qui concerne l'usage des RequestLive c'est une option que nous sommes en train d'envisager. Mais nous ne savons pas trop leur comportement sur les blobs, ni si nos tables respectent les règles permettant de s'en servir. D'autant que sur ce point la documention Delphi est des plus succintes.

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 455
    Points : 24 867
    Points
    24 867
    Par défaut
    Avec Delphi 4, c'est limité, BDE ça doit être le seul qui fonctionne avec MySQL !
    Je ne crois pas que MyDAC de Devart\CoreLab le supporte encore (quoi que !)

    Je n'ai pas l'habitude de TUpdateSQL, mais j'ai manipulé des Blobs avec Requête Paramètrée (voir ParamByName), je n'ai eu aucun soucis et cela avec MyDAC et ADO !
    BDE c'est un peu vieux mais comme il utilise ODBC ... ça doit passer comme ODBC

    Pour RequestLive, je le deconseillais !

    Comme je le disais fait donc le code manuellement (sans l'IDE), gère tes propres accès ! Evite Edit et Post avec le BDE sur une base comme MySQL, c'est très bien avec Paradox mais pas plus !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 84
    Points : 61
    Points
    61
    Par défaut
    Bon,
    en passant un max de temps sur Google à essayer divers combinaisons de mots clefs, j'ai fini par trouver un article me donnant une solution qui semble marcher. Pour cela il faut modifier la VLC. Voici ce qui dit le message:
    I did the following modification in Unit: DBTables.pas, and Method: SetParams(UpdateKind: TUpdateKind); if Old then Param.AssignFieldValue(Field, Field.OldValue) else
    begin
    Value := Field.NewValue;
    if VarIsEmpty(Value) then Value := Field.OldValue;
    if Field.DataType = ftMemo then begin
    Param.AsString := Value;
    end else begin
    Param.AssignFieldValue(Field, Value);
    end;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme sur un Update avec ODP.NET
    Par IsaacB dans le forum Accès aux données
    Réponses: 2
    Dernier message: 19/03/2009, 11h26
  2. Probleme sur order by avec des dates.
    Par Shandler dans le forum MySQL
    Réponses: 8
    Dernier message: 09/02/2009, 14h39
  3. probleme sur une requete avec DISTINCT
    Par samsso2006 dans le forum Requêtes
    Réponses: 1
    Dernier message: 06/05/2007, 14h35
  4. Réponses: 5
    Dernier message: 24/04/2005, 04h09
  5. Problème sur une cmd avec AWK
    Par OrangeBud dans le forum Linux
    Réponses: 3
    Dernier message: 02/06/2004, 10h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo