Avatar billede iakob Nybegynder
07. februar 2002 - 11:12 Der er 1 kommentar og
1 løsning

sp_OAMethod - Katastrofal fejl

Jeg har lavet en activeX control i Visual C++ med MFC. Den har et interface og to funktioner:

long test()
long GetBorgerPlan(long BrugerId, long BorgerId, DATE TilDato, DATE FraDato, BSTR IdList)

Jeg kan kalde begge funktionerne med ActiveX Control Test Container.

Men det er meningen at jeg skal kunne kalde dem fra SQL, og det er her det går galt.

Kaldet til sp_OACreate går godt, men kaldet til sp_OAMethod går galt, lige gyldig hvilken af de to funktioner jeg vil kalde.

Her er min sql kode:
DECLARE @object int    -- Handle til COM objekt
    DECLARE @hr int        -- HRESULT fra COM kald (ikke returparameter)
    EXEC @hr = dbo.sp_OACreate 'DISPOOBJECT.DispoObjectCtrl.1', @object OUT
    IF @hr <> 0     -- Create af objekt er fejlet. Serveren kan evt. v&#8216;re overbelastet, eller
            -- objektet kan mangle registrering
BEGIN
        EXEC sp_displayoaerrorinfo @object, @hr -- test (udvid evt. med log ?)
        select @ReturnCode=2
    RETURN
END

    -- Saa er objektet skabt. Kald metode paa Objekt

    DECLARE @result int
    SELECT @result=0
    SELECT @hr=0
   
    EXEC @hr = dbo.sp_OAMethod @object, 'GetBorgerPlan', @result output, @BrugerId, @BorgerId, @FraDato, @TilDato, @Statuskode
--    EXEC @hr = dbo.sp_OAMethod @object, 'Test', @result output

    IF @hr = 0
    BEGIN
        select @ReturnCode=@result
    END
   
    IF @hr <> 0 -- Kald til skabt objekt er fejlet.
    BEGIN
        EXEC sp_displayoaerrorinfo @object, @hr -- test(udvid evt. med log ?)
        select @ReturnCode=4
        select @hr=0    -- reset HRESULT   
    END
   
    EXEC @hr = dbo.sp_OADestroy @object
    IF @hr <> 0
    BEGIN
        EXEC sp_displayoaerrorinfo @object, @hr
        select @ReturnCode=8
        RETURN       
    END

Resultatet er:
@ReturnCode = 4
OLE Automation Error Information
  HRESULT: 0x8000ffff
  Source: ODSOLE Extended Procedure
  Description:  Katastrofal fejl

Jeg kører Windows 2000, SQL Server 2000 og Visual CPP 6.

Da returncode er 4, så må objektet jo være blevet lavet. Så hvorfor kan jeg så ikke kalde min funktion?

Hvad består fejlen i og hvordan kan jeg rette den?
Avatar billede iakob Nybegynder
26. februar 2002 - 10:20 #1
Jeg er kommet lidt videre i mit problem. Nu kan jeg kalde sp_OAMethod, fordi jeg ikke længere har mit COM object som en dll, men som en exe. Ny problem:

En test viser at der opstår følgende fejl på serveren: SqlDumpExceptionHandler: Process 52 generated fatal exception c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server is terminating this process..

Process 52 er naturligvis min process.

sp_OACreate, sp_OAMethod og sp_OADestroy bliver kaldt og returnerer uden fejl. Min snitfladeprocedure bliver kaldt og gør det den skal. Men kort tid efter, så kommer ovenstående fejl og serveren lukker.

Dette er på SQL Server 2000. På SQL Server 6.5 har jeg ikke nogen problemer, der gør alt som det skal.

Da mit object er en exe, så kan jeg køre den som en klient. På klienten har jeg implementeret en menu, der kalder min snitfladeprocedure. Den har ingen problemer, ingen fejl, warnings eller memoryleaks.

Desuden har jeg lavet et testinterface, som ikke tager nogen parametre og som ikke gør andet end at returnere en integer. Den forårsager også fejlen ovenover.

Er der problemer med sp_OA-procedurerne i SQL Server 2000 i forhold til COM objekter lavet som MFC AppWizard (exe) med Visual C++ 6.0 ?

Hvordan kan jeg løse mit problem?
Avatar billede iakob Nybegynder
03. juni 2003 - 08:44 #2
Jeg lukker spørsmålet ned
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
Computerworld tilbyder specialiserede kurser i database-management

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