API: System.Runtime.InteropServices.COMException: Operator nieznaleziony.

Zapytania SQL, widoki, Crystal, definicje filtrów, szybkich raportów, wydruków, obiekty COM .NET

Moderator: mikey

the_eater
Posty: 8
Rejestracja: 10 sie 2017, 15:52
Rola: Inny

API: System.Runtime.InteropServices.COMException: Operator nieznaleziony.

Post autor: the_eater »

Cześć!

Mam aplikację webową która korzysta z API Optimy. Na wersji produkcyjnej co jakiś czas dostaję błąd jak w tytule - nie jestem w stanie osiągnąć takiego błędu na maszynie developerskiej. Dane do logowania są poprawne - ten błąd nie występuje zawsze, większość logowań do API działa bez problemu, aplikacja (przeważnie) jest w stanie używając tych danych logować się i zapisywać dane / generować wydruki.

Aplikacja łączy się do Optimy poprzez API wyłącznie w celu zapisania danych lub generowania wydruków, odczyt następuje bezpośrednio z bazy, mam pewność że zawsze są dostępne licencje.

Po każdym zalogowaniu się i wykonaniu operacji następuje wylogowanie i są zwalniane wszystkie zasoby.

Gabik
Posty: 26
Rejestracja: 05 sty 2019, 23:46
Rola: Inny
Wersja: 2018

Re: API: System.Runtime.InteropServices.COMException: Operator nieznaleziony.

Post autor: Gabik »

Cześć,

Czy w metodzie logowania do Optimy jest wskazana baza konfiguracyjna ?
Coś mi świta, że miałem podobny błąd. Optima była podłączona do innej baza konfiguracyjna na stanowisku niż autorski program.
Pozdrawiam
Gabriel Gabzdyl 511 403 091 gabrielg@elte-s.com
Firma: https://elte-s.com/ Sklep: https://sklep.elte-s.com/

the_eater
Posty: 8
Rejestracja: 10 sie 2017, 15:52
Rola: Inny

Re: API: System.Runtime.InteropServices.COMException: Operator nieznaleziony.

Post autor: the_eater »

Hej,

Nie wskazuję bazy konfiguracyjnej - na serwerze jest zainstalowana Optima (czasami ktoś z niej korzystać) i przy instalacji / aktualizacji zawsze jest to ustawiane i sprawdzane. Poza tym dla tej instancji dostępna jest tylko jedna baza konfiguracyjna .

Na serwerze bez problemu odpalam Optimę używając tych samych poświadczeń i łącze się do poszczegolnych firm. Błąd pojawia się tylko w momencie wywoływania API, nie występuje zawsze - znaczna większość wywołań działa bez problemu. Czasami aplikacja nie może się w ogóle zalogować, tak jakby nie było dostępnych licencji (z tym sobie jakoś radzę), rzadziej zdarza się ten błąd.

Aplikacja próbuję w przypadku błędu połączenia łączyć się ponownie po kilku sekundach (random od 2 do 10), po kilku niepowodzeniach przestaje.

Gabik
Posty: 26
Rejestracja: 05 sty 2019, 23:46
Rola: Inny
Wersja: 2018

Re: API: System.Runtime.InteropServices.COMException: Operator nieznaleziony.

Post autor: Gabik »

Dziwna sprawa, z ciekawości spróbowałem wywołać ten błąd i dostaje go tylko jak podam niepoprawny login użytkownika.
Co do licencji jak nie ma to i tak się zalogujesz do optimy przez api, tylko przy zapisie sesji jest błąd: program działa w trybie tylko do odczytu.
Nie mam pomysłu co może być tego przyczyną.
Pozdrawiam
Gabriel Gabzdyl 511 403 091 gabrielg@elte-s.com
Firma: https://elte-s.com/ Sklep: https://sklep.elte-s.com/

the_eater
Posty: 8
Rejestracja: 10 sie 2017, 15:52
Rola: Inny

Re: API: System.Runtime.InteropServices.COMException: Operator nieznaleziony.

Post autor: the_eater »

Dzięki za odpowiedź.

Na maszynie developerskiej mam to samo - taki błąd dostaję jedynie gdy podam nieprawidłowe dane. Może problem leży gdzieś indziej - dane do logowania do aplikacji są pobierane z innej aplikacji - może tam jest problem? Dzięki za nakierowanie :)

Przy okazji podrążę kwestie licencji - jeśli można. Ogólnie logowanie jest robione w taki sposób:

Kod: Zaznacz cały

try
{
                Application = new Application();
                Login = Application.Login(login, password, company);
                Session = Login.CreateSession();
                return true;
}
catch (Exception exc)
{
                exception = new Exception(exc.Message, exc);
                Session = null;
                if (Application != null && Login != null)
                {
                        Application.LoginOut();
                }
                Login = null;
                Application = null;
                Thread.Sleep(SleepTime);
}

Całość działa w pętli, próbuje kilkukrotnie się połączyć w przypadku niepowodzenia....

później mam zapis do bazy danych i wylogowanie:

Kod: Zaznacz cały

protected void Disconnect(){
	Application.LoginOut();
	Session = null;
	Login = null;
	Application = null;
}
Jak pisałem - nie zawsze zapis jest możliwy, czasami dostaje wyjątek:

Kod: Zaznacz cały

System.Runtime.InteropServices.COMException: Aplikacja pracuje w trybie tylko do odczytu. Zapis nie jest możliwy.
Czy możliwe jest że powyższy kod nie zwolni wykorzystywanej licencji?
Czy prawidłowy jest brak wywołania metody LockApp / UnlockApp ??

troncomputers
Posty: 4
Rejestracja: 12 cze 2019, 13:10
Rola: Inny
Wersja: 2019

Re: API: System.Runtime.InteropServices.COMException: Operator nieznaleziony.

Post autor: troncomputers »

A z czystej ciekawości spróbuj innym sposobem logowania, czy też będzie ten problem:

Kod: Zaznacz cały

            Environment.CurrentDirectory = @"C:\Program Files (x86)\Comarch ERP Optima";
            LoginService login = new LoginService();
            ModuleCollection mc = new ModuleCollection() { Module.KasaBank, Module.Handel };

            login.Login("OPERATOR", "HASŁO", "NAZWA_FIRMY", mc);

            AdoSession Sesja = login.LoginInfo.CreateSession();
Upewnij się, że jesteś podłączony do poprawnej bazy konfiguracyjnej, jeśli masz ich więcej.

the_eater
Posty: 8
Rejestracja: 10 sie 2017, 15:52
Rola: Inny

Re: API: System.Runtime.InteropServices.COMException: Operator nieznaleziony.

Post autor: the_eater »

niestety to nie to...

firma ma kilka licencji na Optimę - jest to współdzielone między aplikację i pracowników.

Niestety z administrowania Optimą nie jestem zbyt biegły - czy istnieje możliwość podziału tych licencji na serwerze HASP w taki sposób, że użytkownicy mogą wykorzystać maksymalnie X - 1 licencji, gdzie X = liczba licencji? wtedy miałbym pewność że zawsze mam dostępną co najmniej jedną licencję dla aplikacji.

troncomputers
Posty: 4
Rejestracja: 12 cze 2019, 13:10
Rola: Inny
Wersja: 2019

Re: API: System.Runtime.InteropServices.COMException: Operator nieznaleziony.

Post autor: troncomputers »

Możesz w konfiguracji Optimy ustawić domyślny klucz licencji na całą bazę oraz na konkretnego operatora. Błąd nie tyczy się klucza/licencji. Błąd tyczy się braku operatora w bazie konfiguracyjnej. Jeśli twierdzisz, że to klucz i chcesz się upewnić to wejdź do:

Konfiguracja -> Program -> Użytkowe -> Operatorzy -> wybierz operatora -> zakładka Bazy.

W kolumnie o nazwie Serwer klucza wpisujesz instancje SQL + dwa dwukropki + nr klucza (np. SERVER\SQL::123456789)

Sprawdź sobie zapytaniem SQL jakich masz operatorów w bazie konfiguracyjnej.

Kod: Zaznacz cały

SELECT * FROM CDN_KNF_Konfiguracja.CDN.Operatorzy
Sprawdź jaki masz connectionString w Optimie do bazy konfiguracyjnej w rejestrze.
HKEY_CURRENT_USER\Software\CDN\CDN Opt!ma\CDN Opt!ma\Login\KonfigConnectStr

Wrzucaj rezultaty. Coś zaradzimy ;-)

ODPOWIEDZ