Diskuzní fórum a databáze tipů a utilit pro AutoCAD, Inventor, Revit a další produkty Autodesk - od firmy Arkance Systems [www.cadforum.cz]
CZ | SK | EN | DE
Přihlášení
či registrace
   právě nás čte: 6917 
RSS kanál - CAD tipy RSS tipy
RSS diskuze

Diskuze Diskuzní fórum, poradna

 

NápovědaCAD diskuze, rady, výměna zkušeností

 
CAD Fórum - Homepage Veřejné diskuzní fórum k CAD aplikacím - ptejte se na libovolné otázky týkající se oboru CAx, podělte se o vaše znalosti a zkušenosti s programy AutoCAD, Inventor, Revit, Fusion 360, 3ds Max a s dalšími CAD aplikacemi. Zaregistrujte se nebo se přihlašte a zašlete váš příspěvek do odpovídajícího fóra. Viz další informace o CAD Fóru. Nechcete se registrovat? Zeptejte se v naší Facebook poradně.
Fórum nenahrazuje technický support firmy Arkance Systems (CAD Studio) - přímá podpora pro zákazníky funguje na helpdesk.cadstudio.cz
  FAQ FAQ  Prohledat fórum   Události   Registrovat Registrovat  Přihlásit Přihlásit

Téma uzavřenoADO Automation Error

 Odpovědět Odpovědět archiv
Autor
Vratislav Zobrazit panel
Diskutér
Diskutér

Přihlášen: 26.lis.2004
Stav: Offline
Bodů: 17
Přímý odkaz na tuto zprávu Téma: ADO Automation Error
    Zasláno: 26.dub.2005 v 15:23

V AutoLispu (Map 3D 2005) cyklicky vytvarim a oteviram adodb.recordset (Microsoft.Jet.OLEDB.4.0). Po urcitem poctu iteraci (cca 180) program vzdy spadne a nahlasi: Automation Error. Nelze otevrit zadnou dalsi tabulku.

Recordset delam jednoduse takto: 

  (setq rs nil)
  (setq rs (vlax-create-object "ADODB.Recordset"))

  (vlax-invoke-method
    rs
    "OPEN"
    sql
    cn
    adok-adOpenStatic
    adok-adLockReadOnly
    adok-adCmdUnknown
  )

Podobne cykly pouzivam casto uz radu let a nikdy jsem se s touto chybou nesetkal. Nevite nekdo co to znamena? V Mapu 5 (2002) mi to urcite nedelalo.

Diky za kazdou radu.

Zpět nahoru
Vladimír Michl Zobrazit panel
Moderátor
Moderátor
Avatar
Arkance Systems

Přihlášen: 09.zář.2004
Lokalita: ČR (JČ)
Používám:
Dodáváme produkty Autodesk
Stav: Offline
Bodů: 21471
Přímý odkaz na tuto zprávu Zasláno: 26.dub.2005 v 15:50
nevím, jestli by nebylo efektivnější opakovaně používat stejný objekt rs, ale hlavně by bylo dobré odchytávat případné chyby ADO (a dozvědět se tak bližší příčiny chyby) - viz vl-catch-all-apply
Vladimír Michl (moderátor)
Arkance Systems s.r.o. - www.arkance-systems.cz
(podpora viz hd.cads.cz)
Zpět nahoru
Vratislav Zobrazit panel
Diskutér
Diskutér

Přihlášen: 26.lis.2004
Stav: Offline
Bodů: 17
Přímý odkaz na tuto zprávu Zasláno: 26.dub.2005 v 17:24

Pane Michle, chyby ado samozřejmě odchytávám:

Viz např:

(setq errobj (vl-catch-all-apply
   'vlax-invoke-method
   (list rsSloje
         "Open"
         sql
         cnEUZ
         adok-adOpenStatic
         adok-adLockReadOnly
         adok-adCmdUnknown
   )
        )
  )


  (if (vl-catch-all-error-p errobj)
    (alert (vl-catch-all-error-message errobj))
  )

Není mi to ale nic platné, protože v tom alertu se nedovím nic nového: prostě Automation Error: Nelze otevřít žádnou další tabulku.

Otázku efektivnosti vytváření recordsetu při každém volání funkce ponechám stranou. To bych nakonec mohl mít v celé aplikaci jeden globální recordset a ten bych jen otevíral a zavíral.

Problém asi souvisí s tím, jak AutoLisp 2005 object recordset vytváří a ruší. Je opravdu (setq rs nil) to samé jako ve VB set rs = nothing? Vypadá to totiž, jako by v určitý okamžik byl vyčerpán nějaký potřebný paměťový prostor, protože AutoLisp po sobě objekty recordset neruší.

 

Zpět nahoru
Vratislav Zobrazit panel
Diskutér
Diskutér

Přihlášen: 26.lis.2004
Stav: Offline
Bodů: 17
Přímý odkaz na tuto zprávu Zasláno: 26.dub.2005 v 18:20

Pane Michle, je to opravdu tak. že AutoLisp vytváří stále nové a nové objekty recordset. Prozatím mi pomohlo to, že jsem cyklicky otevírané recordsety opravdu nechal globální a objekt recordset vytvářím jen jednou.

(if (null rs)
   ;;Pokud ano - vytvorim novy
   (setq rs (vlax-create-object "ADODB.Recordset"))
   ;;Pokud ne a je otevren - zavru ho
   (if (= (vlax-get-property rs "State") 1)
     (vlax-invoke-method rsProfil "Close")
   )
 )

Program tedy už jede, ale znamená to, že se vlastně neumím objektu vytvořeného pomocí funkce vlax-create-object zbavit. Co s tím? Navíc bych se skoro vsadil, že se tak Map 2002 nechoval.

 

 

Zpět nahoru
Vladimír Michl Zobrazit panel
Moderátor
Moderátor
Avatar
Arkance Systems

Přihlášen: 09.zář.2004
Lokalita: ČR (JČ)
Používám:
Dodáváme produkty Autodesk
Stav: Offline
Bodů: 21471
Přímý odkaz na tuto zprávu Zasláno: 26.dub.2005 v 18:24

(setq rs nil) zruší ukazatel na objekt, ale nikoliv objekt samotný (jeho paměť); pro rušení objektu slouží (a vždy sloužila) VLisp funkce vlax-release-object

popis chyby závisí na tom co vrátí daný objekt, měl by být dostupný přes catch-all-error-message

Vladimír Michl (moderátor)
Arkance Systems s.r.o. - www.arkance-systems.cz
(podpora viz hd.cads.cz)
Zpět nahoru
Vratislav Zobrazit panel
Diskutér
Diskutér

Přihlášen: 26.lis.2004
Stav: Offline
Bodů: 17
Přímý odkaz na tuto zprávu Zasláno: 26.dub.2005 v 18:25

Omlouvám se za chybu, ale fragment k kódu v předešlé odpovědi má být pochopitelně takto:

(if (null rs)
   ;;Pokud ano - vytvorim novy
   (setq rs (vlax-create-object "ADODB.Recordset"))
   ;;Pokud ne a je otevren - zavru ho
   (if (= (vlax-get-property rs "State") 1)
     (vlax-invoke-method rs "Close")
   )
 )

Zpět nahoru

Pro technickou podporu CAD
kontaktujte Helpdesk

Příbuzné CAD tipy:
Tip 11859:Utilita se vzdáleným přístupem přestala fungovat v AutoCADu 2019.
Tip 10448:Chyba při tvorbě závitu v Inventoru - CLSIDFromProgID() failed.
Tip 2456:Co je AutoCAD CAO?
Tip 12285:VIPChyba: LoadLibrary failed with error 1114.
Tip 7955:VIP[Error: 48] Unknown Error in PISOGEN
Tip 5441:VIPChyba 29001 . Správa úložiště chyba: (error) - možné příčiny


 Odpovědět Odpovědět

Přejít na fórum Oprávnění fóra Zobrazit panel



Stránka byla vygenerována za 0,953 sekund.