FireBird elerese szolgaltatasbol

FireBird elerese szolgaltatasbol
2007-03-08T12:29:41+01:00
2007-03-14T09:03:26+01:00
2022-11-03T19:05:38+01:00
piro
Sziasztok!
Nagy az en banatom, es surgos megoldasra var.
Service-t irtam, ami FireBird adatbazist hasznal. Mar korabban is problemat okozott, hogy a hagyomanyos modszerekkel nem erte el az adatbazist (unavailable database), de a dbExpress hasznalataval ezt kikuszoboltem (ehhez az is kellett, hogy a szolgaltatas egyuttmukodhessen az asztallal). Hittem en, mert ugyan a sajat gepemen mukodik gyonyoruen, de ha atviszem egy masikra, ott mar nem, a hibauzenet ugyanaz.
Valaki meg tudna mondani, mit tegyek?
Mutasd a teljes hozzászólást!
Firebird-2.0.0.12748-0.

De ha alkalmazásból megy, akkor szolgáltatás alatt is kéne mennie...
Mutasd a teljes hozzászólást!

  • Mit értesz hagyományos módszerekkel... mert én natívan a ibx komponensekkel használtam volna a firebirdet, és természetesen az automatikus indítás helyet a direkpe raknám az indítását a db motornak...
    Mutasd a teljes hozzászólást!
  • Hagyomanyos megoldason az IBX komponenseket es a BDE-t ertem. Azzal probaltam, de mar a sajat gepemen sem ment. Itt a dbExpress megoldast jelentett, de most egy tesztgepen probalnam, es ott nem megy.
    Ugyanakkor alkalmazasbol IBX-el es dbExpressel is megy azon a gepen is, csak a service-bol nem.
    Mondjuk azt nem ertem, miert jo, ha nem automatikus inditassal hasznalom az adatbazisszervert (ha jol ertelmezem, amit mondtal).
    Mutasd a teljes hozzászólást!
  • Nem lehetséges hogy a te service programod előbb indul, mint a firebird service, és ezért nem tud kapcsolódni?
    Mutasd a teljes hozzászólást!
  • Dependencies property be van állítva rendesen?
    Mutasd a teljes hozzászólást!
  • Nem valoszinu, mert ezt akkor is eloadja, ha leallitom es ujrainditom.
    A dependency normalis beallitasa alatt reszletesen mit ertesz? Hogy allitsam be?
    Mutasd a teljes hozzászólást!
  • A Dependencies-ben adhatod meg, hogy mely szolgáltatások az előfeltételei a Te szolgáltatásodnak, magyarul addig nem indul a tied, amíg a Dependencies-ben felsorolt szolgáltatások mindegyike el nem indult. Itt kifejezetten az fbserver az előfeltétel, szerintem ennyi elég is. Persze ez csak egy lehetséges probléma, nem feltétlenül ez a hiba.

    Üdv:Alex
    Mutasd a teljes hozzászólást!
  • Attol tartok, teljesen rossz iranyba tapogatozunk. Az en szolgaltatasom ugyanis nem automatikusan indul.
    Irtam hozza egy alkalmazast, amibol elinditom/leallitom, ez pedig mar eleve hasznalja a FireBird-ot (IBX-el), tehat az ki van zarva, hogy ne menne a szerver.
    Mint emlitettem, egy kisebb dbExpress-es alkalmazassal is kiprobaltam, az is eleri, tehat a dbExpress dll-jeibol sem hagytam ki semmit (dbexpint.dll es midas.dll, ha jol tudom).
    A szolgaltatasom megsem talalja az adatbazist. Nem lehet valami jogosultsagi problema (a service-t ugye a system futtatja, nem a felhasznalo)? De ha igen, akkor mi a megoldas?
    A sajat gepemen az okozott ilyen problemat, amikor nem volt bejelolve, hogy egyuttmukodhet az asztallal. Lehet, hogy itt kell meg valamit allitani ezen kivul?
    Mutasd a teljes hozzászólást!
  • Szerintem a szervizt futtató felhasználó lesz a ludas. Próbáld ki, hogy a szervizedet nem system userként indítod el. (CreateProcessAsUser)

    szerk:
    Bár, ha kapcsolódni tudsz, csak az adatbázist nem éred el, akkor valószínű, hogy valahol máshol lesz a probléma...
    Mutasd a teljes hozzászólást!
  • Ehhez milyen jogosultsagok kellenek? Mert azt irja ki a CreateProcessAsUser-re, hogy az "ugyfelnek nincs meg a megfelelo joga".
    Egyebkent igy csinaltam:

    HANDLE User=NULL;
    bool b = LogonUser(
    "felhasznalo", // string that specifies the user name
    NULL, // string that specifies the domain or server
    "jelszo", // string that specifies the password
    LOGON32_LOGON_INTERACTIVE, // specifies the type of logon operation
    LOGON32_PROVIDER_DEFAULT, // specifies the logon provider
    &User // pointer to variable to receive token handle
    );

    if (b)
    { // elindítás
    b = CreateProcessAsUser(
    User,
    "c:\\Program Files\\Borland\\CBuilder6\\Projects\\Project1.exe",
    NULL,
    NULL,
    NULL,
    false,
    CREATE_DEFAULT_ERROR_MODE,
    NULL,
    "c:\\Program Files\\Borland\\CBuilder6\\Projects",
    &startup_info,
    &process_info);
    }
    Mutasd a teljes hozzászólást!
  • Itt az idő, hogy mutass kódot.

    Mert az, hogy nem találja, az adatbázist, az vajmi kevés információ.

    Azt, hogy meg interaktív, azt most felejtsd el. Nem kell hozzá! És így még a szép nagy security hole-t is elkerülheted, amit egy interaktív service nyújt.

    Lásd alábbi példa, simán megy:

    unit Unit1 ; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, IBDatabase, DB, IBCustomDataSet, IBQuery ; type TService1 = class(TService) DB: TIBDatabase ; IBTransaction1: TIBTransaction ; qry: TIBQuery ; procedure ServiceStart(Sender: TService; var Started: Boolean) ; procedure ServiceExecute(Sender: TService) ; procedure ServiceStop(Sender: TService; var Stopped: Boolean) ; private public function GetServiceController: TServiceController; override ; end ; var Service1: TService1 ; implementation {$R *.DFM} procedure ServiceController(CtrlCode: DWord); stdcall ; begin Service1.Controller(CtrlCode) ; end ; function TService1.GetServiceController: TServiceController ; begin Result := ServiceController ; end ; procedure TService1.ServiceStart(Sender: TService; var Started: Boolean) ; var I : Integer ; begin DB.DatabaseName := ExtractFilePath(ParamStr(0)) + 'test.gdb' ; DB.Params.Values['User_name'] := 'test' ; DB.Params.Values['Password'] := 'test' ; I := 0 ; while (not DB.Connected) and (I < 3) do begin try DB.Open ; except on E: Exception do begin OutputDebugString(PChar(E.Message)) ; Sleep(500) ; end ; end ; Inc(I) ; end ; if DB.Connected then try qry.Open ; Started := True ; except on E: Exception do OutputDebugString(PChar(E.Message)) ; end ; end ; procedure TService1.ServiceExecute(Sender: TService) ; begin while not Terminated do begin ServiceThread.ProcessRequests(False) ; OutPutDebugString(PChar(qry.FieldByName('ID').AsString)) ; qry.Next ; if qry.Eof then qry.First ; Sleep(1000) ; end ; end ; procedure TService1.ServiceStop(Sender: TService; var Stopped: Boolean); begin try qry.Close ; DB.Close ; except on E: Exception do OutputDebugString(PChar(E.Message)) ; end ; Stopped := True ; end ; end.
    Mutasd a teljes hozzászólást!
  • Elsore WIN32_LOGON_SERVICE-el probaltam, azert allitottam interaktivra, hogy hatha akkor megy.
    Egyebkent ezt systemkent iditod, amikor megy, igaz?
    Pillanatnyilag a dbExpresses kodot tudom mutatni (egyebkent cbuilderes, bocs , mint emlitettem, jelenleg azzal van megoldva:

    void __fastcall TSWService::ServiceExecute(TService *Sender)
    {
    try
    {
    DatModDatabase->AdminDB = "c:\\valami.fdb");
    }
    catch (Exception &e)
    {
    }
    while (!Terminated)
    ServiceThread->ProcessRequests(true);
    }

    void __fastcall TDatModDatabase::SetAdminDB(AnsiString value)
    {
    SCAdmin->Connected = false;
    SCAdmin->Params->Values["Database"] = value;
    SCAdmin->Connected = true;
    }

    Az SCAdmin propertyjei:
    DriverName=Interbase
    RoleName=RoleName
    User_Name=sysdba
    Password=masterkey
    ServerChatSet=
    SQLDialect=1
    BlobSize=-1
    CommitRetain=false
    WaitOnLocks=false
    ErrorResourceFile=
    LocaleCode=0000
    Interbase Transisolation=ReadCommited
    LoginPrompt=false
    Mutasd a teljes hozzászólást!
  • Na, ezt most teljes egeszeben a tied alapjan csinaltam, IBX-el.
    Az eredmeny, harom unavailable database az erroer.txt-ben

    __fastcall TService1::TService1(TComponent* Owner) : TService(Owner) { } TServiceController __fastcall TService1::GetServiceController(void) { return (TServiceController) ServiceController; } void __stdcall ServiceController(unsigned CtrlCode) { Service1->Controller(CtrlCode); } //--------------------------------------------------------------------------- void __fastcall TService1::ServiceStart(TService *Sender, bool &Started) { Started = false; TStringList *sl = new TStringList(); if (FileExists("c:\\error.txt")) sl->LoadFromFile("c:\\error.txt"); DBAdmin->Connected = false; DBAdmin->DatabaseName = "c:\\valami.fdb"; DBAdmin->Params->Clear(); DBAdmin->Params->Add("user_name=SYSDBA"); DBAdmin->Params->Add("password=masterkey"); DBAdmin->Params->Add("sql_role_name=finance"); DBAdmin->Params->Add("lc_ctype=WIN1250"); int i=0; while (!DBAdmin->Connected && i++<3) { try { DBAdmin->Open(); } catch (Exception &e) { sl->Add(e.Message); } } if (DBAdmin->Connected) { Query->Open(); Started = true; } sl->SaveToFile("c:\\error.txt"); delete sl; sl=NULL; } //--------------------------------------------------------------------------- void __fastcall TService1::ServiceExecute(TService *Sender) { while (!Terminated) { ServiceThread->ProcessRequests(true); Query->Next(); if (Query->Eof) Query->First(); } } //--------------------------------------------------------------------------- void __fastcall TService1::ServiceStop(TService *Sender, bool &Stopped) { Query->Close(); DBAdmin->Close(); } //---------------------------------------------------------------------------
    Mutasd a teljes hozzászólást!
  • c:\\valami.fdb ?

    Használj relatív útvonalat.

    Btw: A célgépen van telepítve FB?
    Mutasd a teljes hozzászólást!
  • Ugyanaz. Ez egyebkent a sajat gepemen van, ahol legalabb dbExpressel ment.
    Design time-ban megnyitja, de ha a szolgaltataslistarol elinditom, nem tudja. Mi a franc lehet ez???
    Mutasd a teljes hozzászólást!
  • Uniavialable-t nekem akkor dobott, amikor szórakoztam az embeded változattal, és nem a helyes DLL-t csatoltam az exe mellé...
    Mutasd a teljes hozzászólást!
  • Ugyanazt a DLL-t hasznaljak az alkalmazasok is, azokkal meg megy
    Mutasd a teljes hozzászólást!
  • Ha fogsz egy új alkalmazást, és te indítod kézzel a szolgáltatás managerből, akkor mi a helyzet?

    FBGuard fut? Állítsd le ha igen, és próbáld úgy.
    Mutasd a teljes hozzászólást!
  • Amit masodjara mutattam, azt most irtam, es mindig en szoktam kezzel inditani (annal is inkabb, mert a kivetel miatt rogton leall mindig). Az fbguardot kikapcsoltam, a hiba maradt, de legalabb most mar elbizonytalanodtam: lehet, hogy nem is a file-t nem eri el, hanem ugy globalisan az firebirdot.
    Te milyen FireBirdot hasznalsz pontosan?
    Mutasd a teljes hozzászólást!
  • Firebird-2.0.0.12748-0.

    De ha alkalmazásból megy, akkor szolgáltatás alatt is kéne mennie...
    Mutasd a teljes hozzászólást!
  • Azert is kapisgaltam a felhasznalo fele, mert az az egy kulonbseg van. Mindnesetre megprobalom egy olyan FireBird-el, nalam ugyanis 1.5-os van fent.
    Mutasd a teljes hozzászólást!
  • Na, halvany remeny:
    Jelenleg a sajat gepemen az IBX-el futni latszik, a titok nyitja:
    DatabaseName='127.0.0.1:c:\valami.fdb'.
    Hetfon beszamolok a vegeredmenyrol. Es koszi szepen.
    Mutasd a teljes hozzászólást!
  • Szio!
    Mint emlitettem, a DatabaseName='localhost:c:\valami.fdb' a megoldas. Most lecsereltem a dbExpresses komponenseket IBX-re, es kiprobaltam a tesztgepen, ott is megy.
    Ugyhogy koszonom a jotanacsokat, es termeszetesen elfogadom az Ivn megoldasat, mert o volt az, aki vegig kitartott mellettem.
    Tovabbi szep napot!
    Mutasd a teljes hozzászólást!
  • Lényeg, hogy megoldodott.
    Mutasd a teljes hozzászólást!
  • Figyeltem a topicot, de -mert életemben nem csináltam (még) servicet- nem szóltam bele...

    Csak annyit szeretnék hozzátenni, hogy a delphi "gyári" IBX csomagját cseréld le a továbbfejleszett csomagra!
    Úgy tudom a BDN-ről le tudod tölteni!
    Mutasd a teljes hozzászólást!
  • Koszi a tippet.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd