Avatar billede 2Mida Praktikant
08. maj 2013 - 10:45 Der er 4 kommentarer og
1 løsning

Delphi 2007 og Firebird 2.5

Windows XP
Delphi 2007 Pro
IB komponenterne
Firebird 2.5
Firebird Meastro

Burde der være problemer med ovenstående?

Jeg har en meget simpel applikation hvor jeg bruger
IBDatabase,
IBTransaction,
IBTable,
Datasource,
DBNavigator
og en DBGrid

Databasen og tabellerne er oprettet i Firebird Maestro og jeg har fint hul igennem, men

1) ved New Record bruger jeg et generator kald til at lave et autoinc felt - kaldet udføres kun ved den FØRSTE record, ellers ikke
2) ved opdatering af felter, via DBEdit, bliver disse ikke opdateret før jeg lukker programmet
3) ved tvangsopdatering, IBTransaction1.Commit kommer data i tabellen, men DBGrid mister så data

Så mit spørgsmål er kort - er det konstellationen D2007 (IB komponenterne) og FB2.5 der ikke spiller sammen?

Jeg har været det meste af indernettet igennem og kan umiddelbart ikke finde noget der siger at det ikke skulle!
Avatar billede hrc Mester
22. maj 2013 - 09:12 #1
Jeg har ikke megen erfaring med TIB-komponenterne, men i det store hele burde de virke som alle andre (BDE, ADO og deslige).

FB25 fungerer bedre end de tidligere versioner, men dog på samme måde. Det kan ikke være her der er problemer.

Er det i IBTable.OnNewRecord du kalder generatoren?

Jeg er ret sikker på, at hvis du poster en TIBTable hvor state er forskellig fra dsBrowse, så gemmes tingene. Måske efterfølge kalde IBTable.Refresh (det er ikke alle TDataSet der implementerer den del - og umiddelbart ser TIBTable ikke ud til at gøre det, prøv)?

TIBTransaction er pr. default AutoStart. Det burde være ok, men prøv at sætte den false og kør transaktionerne selv.

TIBTable har pr. default sat UniDirectional til true. Det betyder, at du ikke kan bruge din DBNavigator til ret meget, for retningen er kun fremad.
Jeg ved ikke, men frygter dog, at ved at sætte den false, får du nogle temporære filer liggende lokalt, det er set før.
Den bedste løsning er nok at bruge en TIBQuery i stedet for en TIBTable, koble den på et TClientDataSet via en TDataSetProvider. På den måde får du understøttet bidirectional ovenpå en unidirectional TIBQuery. Når du applyerupdates (fra clientdatasættet), så skal den og provideren nok sørge for at skrive de cachede ændringer til databasen. Via events .. sikkert i provideren ... kan du kalde generatoren hver gang en ny record har brug for det.

Grundlæggende vil jeg påstå det er utidssvarende at bruge T*Table i sine programmer. Man bruger T*Query'er eller stored procs ... bare en tanke: Måske kunne du lave en stored procedure som kaldte generatoren hver gang der blev indsat en ny.

Afsluttende kan jeg anbefale dig at kigge på dette link: http://www.firebirdfaq.org/faq29 - og overveje at bruge TIBQuery med klient datasæt.
Avatar billede 2Mida Praktikant
22. maj 2013 - 10:50 #2
Hej HRC,

tak for dit indlæg, og jeg giver dig ret, det burde virke, men jeg kunne altså ikke... det er endt med at jeg købte InterBase and Firebird Data Access Components fra devart.com (99US$) og nu spiller det. Jeg er ikke færdig med applikationen endnu, så det kan være at der kommer nogle knaster senere, men indtil videre kører det.

(Unidirectional har været sat til false)

Og ja, jeg har læst flere steder at man skal undgå TTAble, men det var simpelthen et forsøg på at få hul igennem og nu bruger jeg IBCQuery (som den hedder hos Devart) til CUD operationer.

TClientDataSet havde jeg også set på, den er jo ret nem at opererer med, men 2 ting bekymrede mig:

1) Er det ikke som TTAble at den trækker alle data over i klientprogrammet - ikke at der er voldsomt mange rækker, men alligevel
2) Får man ikke et flerbruger problem eller håndteres det af TDataSetProvideren? Jeg har brugt ClientDataSet i flere små programmer, men det har været enkelt-bruger, lokale programmer.

..Ole
Avatar billede hrc Mester
23. maj 2013 - 09:43 #3
Jeg har hørt at kombinationen med Unidirectionale datasæt og ClientDataSet fungerer godt. Jeg bruger pt. sløve - men utrolig bekvemme - ADO, så det er ikke undersøgt. Hvis Jens Borrisholt stadig er på fora, så har han lavet en fiks indkapsling af konceptet, godt nok ikke på TIB, men på dbexpress.

ad. 1: Uanset om du bruger TTable eller TQuery (der begge nedarver fra TDataSet), så henter man de data du ser. Man kan styre hvor cursoren placeres (på server eller på klient), men i sidste ende ved jeg ikke hvor meget det giver.

ad. 2: Det er rigtigt at indtil man ApplyUpdates, så caches ændringerne. Derefter genereres der SQL-scripts til dem. Hvis det er en meget dynamisk tabel, med opdateringer flere steder fra, så vil det give problemer. Man kan sikkert lave en slags "autoapply".
Avatar billede 2Mida Praktikant
07. juni 2013 - 11:04 #4
Jeg er kommet videre med componenterne fra Devart, så HRC læg et svar for point, tak for hjælpen
Avatar billede hrc Mester
10. juni 2013 - 12:32 #5
OK
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

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