[Delphi7] multitier, refresh/Variant or safe array is locked

Pagina: 1
Acties:

  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45
intro
Ik ben momenteel bezig met het maken van een synchronisatie module voor een multitier klantenbeheerprogramma. Alles is in principe klaar en werkend op 1 ding na: een bug die optreed bij het refreshen van 3 van de 40 tabellen, in alleen de synchronisatiemodule. Met dat laatste bedoel ik dat als er nog helemaal geen gegevens zijn, ik een verbinding maak met de server dan probeer de gegevens binnen te halen, het dan wel goed gaat, mits de probleemtabellen de eersten zijn die worden opgehaald.

Van de 3 tabellen betreffen er 2 een master/detail relationship voor een agenda en de derde heeft er ook betrekking op. De enige opvallende gelijkenis die deze 3 uit de andere tabellen kan lichten is dat ze alle 3 uit een andere database worden gevoed dan de andere 37. (De server heeft 2 databases, 1 voor klantgegevens en een voor 'internetgegevens', de agenda zit bij de laatste). Het is voor zover ik kan zien echter niet zo (ik zou niet weten hoe ik dat kan testen)

De verbinding zelf: zoals hierboven gezegd multitier, that is, we hebben 2 databases, een server waar ze instaan met betreffende tabellen en providers via (DCOM) en een programma dat via DCOM een verbinding legt met de serverapplicatie en daar de data vandaan haalt. In dat laatste programma ('client') worden de gegevens als xml of cds bestand opgeslagen.

Zodra ik begin met synchroniseren vanuit een lopend programma ('currentTable.refresh;') krijg ik de volgende foutmeldingen:

1) een exception 'EDBClient' met melding: 'Operation not applicable.'.
2) een exception 'EVariantArrayLockedError' met melding 'Variant or safe array is locked.'

(Beiden op dezelfde regel, dus het gaat om 2 'interne' statements binnen de client')

probleem
Ik kan op beide foutmeldingen geen zinnige informatie vinden op google. Experts-exchange geeft nog ergens een vage referentie naar een beschadigde midas.dll. Ik heb op een tweede computer delphi geinstalleerd om dat uit te sluiten, maar het probleem blijft bestaan. Daarna heb ik de update naar versie 7.1 gevonden en deze ook bij beide computers geinstalleerd en getest, maar het probleem blijft onveranderd.
De volgorde veranderen zoals bij het ophalen van gegevens tijdens het starten van het programma hielp hier ook niet. Ik kom gewoon niet om die fout heen en de agenda is toch wel enigszins cruciaal voor het programma.

Wie weet raad?

appendix ;) het wordt al een heel boekwerk dit :P

procedure voor updaten als er nog geen bestanden aanwezig zijn:
code:
1
2
3
currentTable.Active := True ;
currentTable.LogChanges := true;
currentTable.saveToFile;


procedure voor updaten vanuit het programma:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
currentTable.active := true;
MSource := currenttable.MasterSource;
currentTable.MasterSource := Nil;
MFields := currentTable.MasterFields;
currentTable.MasterFields := '';
try
  currentTable.refresh;
except
  On E: Exception do
  begin
     memo1.lines.add('  ' + currentTable.name + ': ' + E.ClassName+ ' / ' + E.Message);
  end;
end;
currenttable.MasterSource := MSource;
currentTable.MasterFields := MFields;
currenttable.active := false;

Localhost is where the heart is


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Komt voor als je een andere versie van midas.dll op het systeem hebt staan als dat je applicatie mee gecompiled is. Zorg ook dat zowel de server als de client dezelfde versie hebben. Je kan het gebruik van midas.dll voorkomen door MidasLib als unit te usen.

PS: Er is trouwens wel veel te vinden over deze foutmeldingen als je ook de usenet newsgroups doorzoekt. Bijvoorbeeld met Google Groups.

We adore chaos because we like to restore order - M.C. Escher


  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45
LordLarry schreef op maandag 09 mei 2005 @ 18:59:
Komt voor als je een andere versie van midas.dll op het systeem hebt staan als dat je applicatie mee gecompiled is. Zorg ook dat zowel de server als de client dezelfde versie hebben. Je kan het gebruik van midas.dll voorkomen door MidasLib als unit te usen.

PS: Er is trouwens wel veel te vinden over deze foutmeldingen als je ook de usenet newsgroups doorzoekt. Bijvoorbeeld met Google Groups.
Bedankt! het is wel logisch om daar ook te kijken, meer het is 'gewoon' niet in me opgekomen. Ik vind hier inderdaad een hele hoop meer berichten, die allemaal naar midas.dll wijzen.

Ik heb gedaan:
1) zowel client als server hercompileren met nieuweste midas.dll [failure]
2) in betrokken modules (update en database module client en database module server) midaslib opgenomen, recompile beiden [failure]
3) midas.dll verwijderd (van naam veranderd) recompile, melding 'EOleSysError' een benodigde dll of library file kan niet worden gevonden > midas.dll wordt gebruikt

4) ? Ik kan wel overal midaslib gaan toevoegen, maar die units worden helemaal niet aangesproken. De error ontstaat ook op het moment dat refresh wordt aangeroepen.

Wat is een goede volgende stap?
Ik lees ondertussen nog wat door op google groups..

Localhost is where the heart is


  • SilentStorm
  • Registratie: November 2000
  • Laatst online: 18-03 14:45
4) Unregister en reregister midas.dll [failure]
5) verander opslag van deze 3 tabellen van xml naar cds (op aanraden van een post in de nieuwsgroepen) [succes! tenminste, in de test die ik ook steeds op de andere situaties losliet. Ik expirimenteer wat verder met volledige synchronisaties.

Uitslag: het werkt :D

posts die het meest hebben bijgedragen aan nuttige oplossing voor mensen met een vergelijkbaar probleem (/search):
deze en deze


iets wat me echter nog wel enigszins verbaast is de snelheid, of liever traagheid van het geheel. Het gaat hier om een relatief klein klantenbestand (+/- 3000), met aanverwante gegevens en wat zaak-specifieke gegevens (contactlensspecialist). Al met al een database van zo'n 25 mb over alle tabellen. Het duurt echter wel een minuut als ik het op dezelfde pc probeer als waar de database aanwezig is. Op de 'slechtste' clientpc hier, doet 'ie er zo'n 12 minuten over. Als ik af mag gaan op verhalen van anderen is dit enigszins traag. Ik maak geen gebruik van het fetchen van een gelimiteerd aantal, maar voer op elke tabel slechts 'refresh' uit. Het lijkt er kwa snelheid op dat de hele tabel weer wordt vernieuwd, in plaats van alleen de nieuwe records. Ik kan me voorstellen dat daarvoor wel eerst in de database moet worden gekeken welke records al bestaan en daarmee vergeleken welke er nieuw moeten komen, maar dat zou toch nog steeds sneller moeten gaan dan alles opnieuw downloaden? Mis ik een instelling?

[ Voor 71% gewijzigd door SilentStorm op 09-05-2005 21:49 ]

Localhost is where the heart is