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 :

[ADO][Access]Probleme Insert


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 11
    Points : 6
    Points
    6
    Par défaut [ADO][Access]Probleme Insert
    Boujour,
    je ne retrouve plus mon sujet. Donc je refais un avec tous les details. Il y a 2 erreurs d execution. La premiere est :Index or primary key cannot contain a Null value..Elle provient du premier insert. La seconde : Data Type mismatch in citeria expression provenant du 2 eme insert. Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    with DataModule.ADOQAfficher do
    begin
     Close;
     SQL.Clear;
     SQL.Add('insert into Table1');
     SQL.Add('(nom,prenom)');
     SQL.Add('Values('+QuotedStr(editNom.Text)+','+QuotedStr editPrenom.Text)+')');
     Prepared:=True;
     ExecSQL;
     Close;
     SQL.Clear;
     SQL.Add('insert into Table2');
     SQL.Add('(date,heure)');
     SQL.Add('Values('+DATETOSTR(DATETIMEPICKER1.Date)+','+QuotedStr(editHeure.Text)+')');
     Prepared:=True;
     ExecSQL;
     Close;
    J utilise Acces et voici les 2 tables avec les attributs:
    Table1 -> idTable1:NumeroAuto(cle primaire), nom:Text, prenom:Text, adresse:Text
    Table2 -> idTable2:NumeroAuto(cle primaire), idTable1:Numerique(lie a la Table1), date: Date/Heure, heure:Text, lieu:Text.

    La connection marche car j ai deja fait des insert ds un autre Form avec 1 autre AdoQuery et sur d autres tables de cette meme base de donne et ca a fonctionne.

    Merci d avance!

  2. #2
    Membre averti
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Points : 338
    Points
    338
    Par défaut
    Salut
    Attention les dates en SQL sont au format mm/dd/yyyy
    est pour access exprimés entre '#'

    Voici une fonction que j'ai ecrite concernant datesql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function TodateSql(Date: TDate): string;
    var c: char;
    begin
     c := DateSeparator; // Sauvegarder le separateur de date
     DateSeparator := '/'; // le slash est le caractère que reconnait le separateur de date de DBase
     Result := FormatDateTime('mm/dd/yyyy', Date); // date sql est de type mois, jour, année
     DateSeparator := c; // récupère le separateur de date sauvegardé
    end;
    Pour ta 2eme requette voici une solution

    Salut
    Attention les dates en SQL sont au format mm/dd/yyyy
    est pour access exprimés entre '#'

    Pour ta 2eme requette voici une solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SQL.Clear;
    SQL.Add('INSERT INTO Table2 ( [date], heure )');
    SQL.Add('Select #'+TodateSql(DATETIMEPICKER1.Date)+'#,'+QuotedStr(editHeure.Text));

  3. #3
    Membre averti
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Points : 338
    Points
    338
    Par défaut
    Pardon j'ai oublié la première question.

    Il te manque une parenthèse après le 2eme QuotedStr

  4. #4
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut Re: Probleme Insert
    Citation Envoyé par rafraf6
    Table1 -> idTable1:NumeroAuto(cle primaire), nom:Text, prenom:Text, adresse:Text
    Table2 -> idTable2:NumeroAuto(cle primaire), idTable1:Numerique(lie a la Table1), date: Date/Heure, heure:Text, lieu:Text.
    Est ce que tu autorises les null dans le champs adresse de ta table1 ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Merci de m avoir repondu.

    Pr Malatar : j autorise les null car tous les champs ont la propriete Null Interdit a Non

    Pr delphichem. Les erreurs sont toujours la et ds ma premiere requete, j ai oublie la parenthese ici mais pas ds mon code.

    Au depart mon champ heure etait de type DATE/HEURE et j ai modifie en TEXT. Jai aussi modifie idTable1 car c etait en Numerique et j ai mis en AutoNumerique pr resoudre l erreur2 et j ai sauve ma base de donne. Est - il possible que ma connection a la base reste comme elle etait a l etat initial c a d l ancienne base de donnee( et donc idTable1 est de type Numero et l heure en DATE/HEURE d ou les erreurs. Pourtant quand j ouvre la base, les modifs ont bien ete enregistre par contre peut etre que la connection n est pas a jour car je ne sais pas comment ca se passe.?

  6. #6
    Membre averti
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Points : 338
    Points
    338
    Par défaut
    Oui c'est possible si tu as ajouter tous les champs manuellement a ta table.

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Que faire alors ds ce qu a la, supprimer AdoConnection et refaire 1 nouveau? Puis j ai modifier les types de 2 champs, je n ai rien ajoute

  8. #8
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    Par défaut
    je sais si c'est juste mais tu as vu la prpriéte filtred=true du table2 :
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  9. #9
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Non, ca ne change rien. En fait j ai trouve le probleme mais je ne sais pas le resoudre. En fait pr tester, j ai modifie le nom et prenom ds la table en nomEleve et prenomEleve. J ai sauve ma base de donne. puis ds mon insert j ai mis nomEleve et prenomEleve et la il m a dit que ces 2 la etaient inconnus. Donc c est la connection qui est tjs a l etat ancien de la base d ou les erreur car par exemple l heure etait avant en DATE/HEURE puis je l ai mis en Text car c est ce qui convient au prof. ET donc on dirait que le programme continue a travaille avec l ancienne base et donc de type DATE/HEURE or ds mon Value je mets un Text. CE que j ai fait c est refaire la connection a partir de mon ADOConnection pr mettre a jour et la il me donn : You cannot add or change a record because a related record is required in table 'Table3' La table3 est une autre table ds ma base mais sur ce Form je ne fait rien sur cette Table. Donc voila?

    Ce probleme m a rendu fou. J ai deja travaille avec Java,c,c++,php.. ET franchement Delphi avec du Access c est du suicide mais je ne peux plus faire marche arriere ds ce projet, oblige de travailler avec ce couple qui n a pas l air de s entendre

  10. #10
    Membre averti
    Avatar de delphichem
    Inscrit en
    Octobre 2002
    Messages
    280
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 280
    Points : 338
    Points
    338
    Par défaut
    ET franchement Delphi avec du Access c est du suicide
    Je ne suis pas d'acord avec toi, je travail depuis 3 ans avec delphi et access (BDE / ODBC et ADO), cela marche bien.

    J'admets avoir eu quelque petit soucis au début, car j'ai commencé avec interbase et paradox, mais maintenant tout va bien.

    Voici ce que j'ai fait pour testé:

    j'ai créee une dbb access au chemin suivant: D:\xxx\BDD.mdb, elle contient 2 table; Table1 et Table2 dont la structure est la même que sur ton message initial.

    j'ai créée une form 'Help' et voici le source de Help.dfm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
     
    object Form1: TForm1
      Left = 201
      Top = 114
      Width = 536
      Height = 130
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
      object Label1: TLabel
        Left = 8
        Top = 8
        Width = 22
        Height = 13
        Caption = 'Nom'
      end
      object Label2: TLabel
        Left = 144
        Top = 8
        Width = 36
        Height = 13
        Caption = 'Pr'#233'nom'
      end
      object Label3: TLabel
        Left = 280
        Top = 8
        Width = 29
        Height = 13
        Caption = 'Heure'
      end
      object Label4: TLabel
        Left = 408
        Top = 8
        Width = 23
        Height = 13
        Caption = 'Date'
      end
      object Button1: TButton
        Left = 8
        Top = 64
        Width = 75
        Height = 25
        Caption = 'Inserer'
        TabOrder = 0
        OnClick = Button1Click
      end
      object EditNom: TEdit
        Left = 8
        Top = 24
        Width = 121
        Height = 21
        TabOrder = 1
      end
      object EditPrenom: TEdit
        Left = 144
        Top = 24
        Width = 121
        Height = 21
        TabOrder = 2
      end
      object DateTimePicker1: TDateTimePicker
        Left = 408
        Top = 24
        Width = 113
        Height = 21
        Date = 38451.009688159720000000
        Time = 38451.009688159720000000
        TabOrder = 4
      end
      object EditHeure: TEdit
        Left = 280
        Top = 24
        Width = 121
        Height = 21
        TabOrder = 3
      end
      object ADOConnection1: TADOConnection
        ConnectionString = 
          'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\xxx\BDD.mdb;Pers' +
          'ist Security Info=False'
        LoginPrompt = False
        Mode = cmShareDenyNone
        Provider = 'Microsoft.Jet.OLEDB.4.0'
        Left = 88
        Top = 56
      end
      object ADOQAfficher: TADOQuery
        Connection = ADOConnection1
        Parameters = <>
        Left = 168
        Top = 56
      end
    end
    Puis le fichier Help.pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    unit Help;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ADODB, DB, ComCtrls;
     
    type
      TForm1 = class&#40;TForm&#41;
        ADOConnection1&#58; TADOConnection;
        ADOQAfficher&#58; TADOQuery;
        Button1&#58; TButton;
        EditNom&#58; TEdit;
        EditPrenom&#58; TEdit;
        DateTimePicker1&#58; TDateTimePicker;
        EditHeure&#58; TEdit;
        Label1&#58; TLabel;
        Label2&#58; TLabel;
        Label3&#58; TLabel;
        Label4&#58; TLabel;
        procedure Button1Click&#40;Sender&#58; TObject&#41;;
      private
        &#123; Déclarations privées &#125;
      public
        &#123; Déclarations publiques &#125;
      end;
     
    var
      Form1&#58; TForm1;
     
    implementation
     
    &#123;$R *.dfm&#125;
    function TodateSql&#40;Date&#58; TDate&#41;&#58; string;
    var c&#58; char;
    begin
     c &#58;= DateSeparator; // Sauvegarder le separateur de date
     DateSeparator &#58;= '/'; // le slash est le caractère que reconnait le separateur de date de DBase
     Result &#58;= FormatDateTime&#40;'mm/dd/yyyy', Date&#41;; // date sql est de type mois, jour, année
     DateSeparator &#58;= c; // récupère le separateur de date sauvegardé
    end;
     
    procedure TForm1.Button1Click&#40;Sender&#58; TObject&#41;;
    begin
      with ADOQAfficher do
      begin
        Close;
        SQL.Clear;
        SQL.Add&#40;'insert into Table1'&#41;;
        SQL.Add&#40;'&#40;nom,prenom&#41;'&#41;;
        SQL.Add&#40;'Values&#40;' + QuotedStr&#40;editNom.Text&#41; + ',' + QuotedStr&#40;editPrenom.Text&#41; + '&#41;'&#41;;
        Prepared &#58;= True;
        ExecSQL;
        Close;
        SQL.Clear;
        SQL.Add&#40;'insert into Table2'&#41;;
        SQL.Add&#40;'&#40;&#91;date&#93;,heure&#41;'&#41;;
        SQL.Add&#40;'Values&#40;#' + ToDateSql&#40;DATETIMEPICKER1.Date&#41; + '#,' + QuotedStr&#40;editHeure.Text&#41; + '&#41;'&#41;;
        Prepared &#58;= True;
        ExecSQL;
        Close;
      end;
    end;
     
    end.
    Cela fonctionne trés bien sans aucun message d'erreur.

  11. #11
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Salut,

    Merci pr ton aide delphichem mais les 2 erreurs persistent meme en faisant un copier coller de ton code. Je n ai pas pu resoudre encore mon probleme mais je suis certain a present apres divers tests que mon probleme provient de access ou j ai du mal fait mes tables. J ai dans mes autres Forms plein de Insert et j ai chaque fois modifie les champs Access, les types et tout et ca fonctionnaient parfaitement. Je vais donne plus de details sur mes 2 tables Access juste comme ca au cas ou un de vs puisse m aider meme si que un Forum Access soit plus adapte pr mon probleme mais comme vs connaissez deja ma situation. Voici mes tables:

    Table1:

    =idTable1 : NumeroAuto(cle primaire)-Taille : Entier long-Indexé : oui sans doublons
    =nom:Text - Taille : 50: Null interdit : non-Chaîne vide autorise: oui Indexé : nonprenom:Text
    =prenom: meme proprites que nom

    Table2

    =idTable2:NumeroAuto(cle primaire)... meme propites que idTable1
    =idTable1:Numerique, Entie Long, Null interdit :Non, Indexe: Non(lie a la Table1 acec une contrainte referentielle)
    = date: Date/Heure, Format: Date Abrege, Null Interdit: Non, Indexe : Non
    = heure:Text... Meme propriete que Nom de la table 1

    la premiere erreur : Index or primary key cannot contain a Null value
    2 eme erreur : Data Type mismatch in citeria expression

  12. #12
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Merci de m avoir aide. Je viens de trouver le probleme. Dans Access, je n ai pas mis la propriete Indexe a "Oui" de la cle idTable1 de la table "Table2"

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

Discussions similaires

  1. Vb6 Ado Access : Probleme Recordset
    Par visualnotbasic dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 27/02/2007, 20h34
  2. VB6-ACCESS : Probleme d'insertion
    Par meloo dans le forum IHM
    Réponses: 1
    Dernier message: 11/06/2006, 13h17
  3. [ADO.NET] Problème avec Insert dans base de données
    Par mpascolo dans le forum Accès aux données
    Réponses: 9
    Dernier message: 24/01/2005, 10h36
  4. [JDBC][MS ACCESS] probleme insertion de date
    Par darius_the_first dans le forum JDBC
    Réponses: 2
    Dernier message: 10/12/2004, 19h04
  5. probleme insertion donnée access
    Par nashouille dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/01/2004, 15h45

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