Avatar billede morten_s Nybegynder
23. oktober 2002 - 08:33 Der er 16 kommentarer og
1 løsning

ClientDataSet - dbExpress

Jeg har en databaseapplikation hvor en del af interfacet er oprettet på følgende måde:

Brugerinterface ser på DB gennem følgende komponenter

1. SQLConnection1 forbundet til databasen
2. SQLDataset1 forbundet til d.o.
3. DataSetProvider forbundet til d.o.
4. ClientDataSet forbundet til d.o.
5. alm. dataset forbundet til d.o.

Brugeren har mulighed for at ændreværdier i en tabel gennem diverse dbEdit komponeter på en dialog, når der trykkes o.k. på denne dialog afvikles følgende kode:

procedure TdlgInt.OKBtnClick(Sender: TObject);
begin
  try
    DM.cdsInt.ApplyUpdates(-1);
  except
    ShowMessage('Error in data please retype !');
    DM.cdsInt.CancelUpdates;
  end;                     
end;

Ofte giver det fejlen:
Record not found or change by another user

Det er et dataopsamlingsprogram og der foregår konstant en hel del læsninger/skrivninger af andre data i db'en, igennem TSQLdataset samt TSQLQuerys, disse er alle forbundet til db'en gennem en anden connection, SQLConnection2

Hvordan afhjælpes problemet ?
Avatar billede angelod Novice
23. oktober 2002 - 09:23 #1
Bruger du Interbase eller MySQL igennem dbExpress?
Avatar billede morten_s Nybegynder
23. oktober 2002 - 10:37 #2
Jeg bruger mySql
Avatar billede angelod Novice
23. oktober 2002 - 10:56 #3
Så virker det ekstra mystisk da MySQL ikke plejer at tage sig af om nogen bruger den record du er ved at opdatere.. Så vidt jeg ved kender MySQL ikke til transactions og locking..
Avatar billede kebab Nybegynder
23. oktober 2002 - 11:14 #4
Jeg forstår ikke den sidste kobling. Hvorfor sætte endnu et datasæt på CDS? Har du ikke dataaware kontroller direkte på CDS ?
Avatar billede morten_s Nybegynder
23. oktober 2002 - 11:17 #5
Såvidt jeg kan se er det ikke muligt at koble dataawre komponenterne direkte på et clientdataset
Avatar billede angelod Novice
23. oktober 2002 - 11:18 #6
Ifølge online kilder opstår dette problem hyppigt ved databaser der benytter timestamps og datetime felter, specielt hvis de er indexed. Det skyldes en bug i dbExpress-komponenterne.. Jeg vil da lige poste noget jeg fandt, i tilfælde af at det kan bruges i din situation. :)


To solve this, use a primary key/index and the UpdateMode = upWhereKeyOnly mode with keys on fields that are not timestamp/datetime/etc (do not make the timestamp values indexed). This will avoid VCL to generate a wrong WHERE statement.
If in your database these fields are indexed, removing the pfInWhere option from the TField.ProviderFlags property for that filed should be enough.
If the actual value in your table that have no fraction or timezone value values, the generated SQL will be able to find that record (because it will use only the indexed fields in the WHERE clause) and the update will suceed.
Avatar billede morten_s Nybegynder
23. oktober 2002 - 11:22 #7
Jeg har ingen datetime/timestams felter, mit SQLDataset er af typen Tabel, kan det være årsagen ?
Avatar billede angelod Novice
23. oktober 2002 - 11:25 #8
Jeg ved sq snart ikke.. Når jeg bruger MySQL så bruger jeg kun SQL features fra systemet, da de sikrer et fuldt overblik hele tiden.
Avatar billede morten_s Nybegynder
23. oktober 2002 - 11:34 #9
angelod> Det plejer jeg normalt også, men så bruger jeg normale editfelter som jeg så sender til db'en via et sql statement, syntes bare lige jeg ville prøve om ikke det kunne lykkeds med de "officielle" dataware komponenter
Avatar billede angelod Novice
23. oktober 2002 - 11:38 #10
Fandt lige noget andet du skal prøve..

I din DataSetProvider sætter du Options til at have 'poNoReset' og 'poPropogateChanges' sat til 'True'.

Og når du så skal opdatere, så prøv:
if DM.cdsInt.ApplyUpdates(0) = 0 then
  DM.cdsInt.MergeChangelog;

Håber det virker :)
Avatar billede morten_s Nybegynder
23. oktober 2002 - 11:43 #11
Nej det gør desværre ingen forskel
Avatar billede angelod Novice
23. oktober 2002 - 11:47 #12
Argh.. Det er en af de ting vi skulle have Tipsen til at kigge på, men han er nok på arbejde eller i skole eller noget..

Du skriver at den gør det ofte.. Betyder det så at den nogle gange går igennem uden problemer?
Avatar billede morten_s Nybegynder
23. oktober 2002 - 11:47 #13
Undre mig bare over det ikke har nogen effekt at sætte datasetet på en connection helt for sig selv
Avatar billede morten_s Nybegynder
23. oktober 2002 - 11:52 #14
angelod> Hvis jeg stopper den øvrige kommunikation til databasen som kører igennem connection2 (altså dataopsamlingsdelen) virker det uden problemer, og jeg må indrømme at det er betydeligt mere elgant end at skrive sine sqlstatemensts selv, jeg plejer normalt at have 3 forskellige "procedure" til det samme et insert, et update (edit) og et delete statemenst som så får sine værdier fra alm. edit felter, og sqlstatementsne samt det kode som skal til at parse til felterne bliver ret lange når man har en 20-25 felter og udfylde
Avatar billede angelod Novice
23. oktober 2002 - 11:53 #15
Jeg ville ønske jeg kunne hjælpe, men jeg er godt løbet tør for ideer og referencer..
Avatar billede angelod Novice
23. oktober 2002 - 11:55 #16
Je' ve' de' gåt' :D
Men jeg er først og fremmest PHP programmør, og der skriver jeg selv mine MySQL statements, så det er blevet en vane. Prøver dog at vænne mig til at bruge komponenterne bedre i Delphi. :P
Avatar billede morten_s Nybegynder
07. november 2002 - 10:00 #17
slukker og lukker.......har desværre ikke en løsning
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester