[Delphi]Kontrola existence DB a její připojení

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod dyžon 14. 1. 2019 12:18

Zdravím,
obracím se na Vás s prosbou jak postupovat.
v programu s DB dělám nejdříve kontrolu, zda soubor DB na síti existuje, pokud ano, připojím se k němu,
bohužel formát pro FileExists je \\SERVERNAME\SharedFolder\Folder3\soubor.fdb což je string, kterej získám z OpenDialogu.
a formát pro DatabaseName (TIBDatabase) je IP:Disk:\Folder1\Folder2\SharedFolder\Folder3\soubor.fdb
dá se nějak zjistit z '\\SERVERNAME\' to co je ve skutečnosti opravdová cesta 'IP:Disk:\Folder1\Folder2 ??
vím, jak zjistím ze SERVERNAME IP, ale už nevím, jak se dostanu k písmenu disku a složkám před ShareFolder.
program při prvním spuštění otevře okno NASTAVENÍ, kde se vyplní potřebné info.
Pro DBPath se uloží string právě z TOpenDilog.FileName, což je \\SERVERNAME\SharedFolder\Folder3\soubor.fdb
a já z toho potřebuju udělat IP:Disk:\Folder1\Folder2\SharedFolder\Folder3\soubor.fdb pro připojení DB.
nějaké nápady prosím ??
když do DBPath uložím cestu IP:Disk:\Folder1\Folder2\SharedFolder\Folder3\soubor.fdb, tak potom zase funkce FileExist vrátí False a nepomáhá ani s lomítkama před IP ... \\IP:Disk:\Folder1\Folder2\SharedFolder\Folder3\soubor.fdb
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod Nargon 14. 1. 2019 14:28

To máš blbý. Jedno používá síťové UNC cesty a to druhé používá IP a lokální cestu. Tohle vzájemně převést nejde. Nebo tedy lze to převést pouze na tom jednom konkrétním PC, kde ten soubor je uložený. Žádný jiný PC na síti to udělat nemůže.
Jediná možnost z jiného PC je využít WMI Objekt (netuším jak ho v delphi použít) a zjistit sdílené složky přes Querry: "Select * From Win32_Share" z toho serveru v síti.
Tam zjistíš, že sdílená složka "SharedFolder" je v cestě "Disk:\Folder1\Folder2\SharedFolder\" a z toho už si to budeš moci poskládat.

Ale jak píšu, netuším jak se v delphi pracuje s WMI objekty a taky netuším co všechno musí být povoleno, aby se na WMI dalo přistoupit přes síť.
Desktop: Ryzen 7 1800X (3.95GHz, 1.35V), Asus Crosshair VI Hero, 16GB DDR4 Ram (3200MHz), 128GB SSD + 3TB HDD, Nvidia GTX 1080
Notebook: Asus UL50VT 15.6" (SU7300@1.7GHz, 4GB ram, 500GB HDD, Intel GMA 4500MHD + nVidia G210M, dlouha vydrz cca 7+ hod)
Nargon
Moderátor

Odeslat příspěvekod JanFiala 14. 1. 2019 15:05

Proč neběží na tom serveru FB a ty se k němu nepřipojuješ jako k SQL serveru?
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod dyžon 15. 1. 2019 11:12

to Nargon:určitě se na to podívám,
kdysi jsem viděl nějakej kód, kterej pracoval s namapovanýma jednotkama ale nevím, jestli by to řešilo tohle, navíc byl v C++, ale mrknu se, třeba něco objevím ..
to JanFiala: nikdy jsem to neřešil (nepotřeboval), ale zní to celkem jednoduše, tak něco načtu a zase se ozvu jak to dopadlo ... jak vytvořit FB server zhruba vím (Database WorkBench),
a jaké bys použil komponenty na to přihlášení jako k SQL Serveru ?
doma něco nastuduju ...
děkuji zatím oboum,
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod dyžon 23. 1. 2019 11:38

o WMI jsem něco načet, ale v Delphi je to zřejmě jen o infu o Disku, nic jinýho jsem nenašel.

pane Fialo, nakonec se v tom ztrácím, .. zkusil jsem už kde co, ale pořád tomu moc nerozumím.
můžeš mi to prosím trochu rozepsat, nebo podstrčit link, kde se to řeší a vysvětluje ??

jde mi o to, že uživatel z kteréhokoliv PC v síti, v NASTAVENÍ programu přes třeba TOpenDialog najde cestu k souboru databáze (jiny PC v síti), která se uloží do DBPath: String;
po spuštění programu se nejdříve ověří existence souboru z DBPath a pokud existuje, tak se k databázi připojí.
pořád si s tím nevím rady ..
Proč neběží na tom serveru FB

Firebird mám nainstalovaný na všech PC
a ty se k němu nepřipojuješ jako k SQL serveru?

tady nevím, ale stejně přece potřebuju tu cestu k Databázi né ??
omlouvám se za svoji tupost, ale čím víc pročítám net, tím víc jsem z toho zmatenej.
potřeboval bych nějakej příklad, ze kterýho pochopím o co go.
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 23. 1. 2019 14:56

Připojovat se ze všech stanic natvrdo k souboru mi přijde divné.
Proč na tom serveru neběží firebird server a uživatelé se nepřipojují k němu? Pokud je třeba víc databází, tak se vytvoří víc databází a uživatel si vybere. Pak nemusíš řešit žádné soubory, protože uživatel se připojuje k serveru, ne k souboru s DB.

Jinak pokud jde o tvůj výtvor, pak si na server nahraj soubor, kde budeš mít seznam souborů s oběma tvary cesty.
Uživatel si pak vybere připojení ke konkrétnímu souboru z toho seznamu.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod dyžon 19. 2. 2019 11:58

s tím souborem s cestama ni to přišlo zajimavý a asi by mi to i stačilo, nicméně jsem pořád přemýšlel nad tou variantou:
Proč na tom serveru neběží firebird server a uživatelé se nepřipojují k němu?

pořád jsem nevěděl jak to myslíš, ale už zřejmě vím ...
pomocí DataSnap Serveru.
to je řešení, o kterym jsem netušil a přitom je geniální.
Bohužel to pro mě není úplně bez zádrhelů.
Do ServerMethodsUnit jsem strčil FDConnection, FDQuery a DataSetProvider, vzájemě propojil a načetl databázi.
Zkompiloval a spustil. (/zatím bez problémů/)
přidal jsem novej projekt frmClient a nasázel na něj: SQLConnection, DSProviderConnection, ClientDataset, DataSource, a DBGrid.
opět všechno propojil, nastavil
Kód: Vybrat vše
SQLConnection.Driver:= DataSnap;
DSProviderConnection.SrverClassName:= TServerMethods1;

když nyní nastavím ClientDataset.Active = True; tak všechno běží, DBGrid se naplní daty.
když to ale zkompiluju, tak vznikají problémy:
ve Win 7 na PC, kde je spuštěnej server běží všechno v pohodě.
ve Win 10 na PC, kde je spuštěnej server vyskočí vyjímka: Access violation on address xxxxx
ve Win 7 na PC, který je na síti vyskočí vyjímka: Access violation on address xxxxx
ve Win 10 na PC, který je na síti vyskočí vyjímka: Access violation on address xxxxx
a to i v případě, že na všech PC povypínám Firewall.
je třeba divný, že i na Win 10, v designtime běží všechno správně, ale po kompilaci už hází vyjímku.
databázi mám na HDD, kde není systém ve složce s právy everyone - úplné řízení, ale to na to podle mě nemá vliv ...
vůbec nevím, kde může být problém, ani na netu jsem se toho moc nedočetl.
někde říkají, že problém může být ve špatných ovladačích DBEXpress, podle mě ovladače mám dobrý, když vše funguje v DesignTime ...
nevíte někdo, čím by to mohlo být ??
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 20. 2. 2019 09:21

Nemyslel jsem rovnou DataSnap, ale myslel jsem normální Firebird komponenty (Connection, Query) k připojení serveru.
Pro připojení se pak připojuješ na IP a port, nespouštíš lokalně server přes soubor databáze natažený ze sítě.
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar

Odeslat příspěvekod dyžon 20. 2. 2019 12:34

aha, ...
no u toho DataSNapu mi to háže vyjimku když se pokusím poslat SQL dotaz do Tabulky. (třeba: 'Select * from TABLE')
bohužel nemůžu přijít na to, co to způsobuje.
chtěl bych tě poprosit,
vím, že se to nedělá a že jsem hrozně otravnej, ale nemohl by jsi vytvořit nějakej jednoduchej model/project toho, o čem píšeš a postnout někam .rar s celym projektem, abych se mohl podívat jak to řešíš.
používám Firebird 2.5 a Delphi 10.2
moc by mi to pomohlo jako základ.
protože přesně jak píšeš:
Připojovat se ze všech stanic natvrdo k souboru mi přijde divné.

a tak bych se chtěl naučit tu správnou cestu, jak to dělat.
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod dyžon 5. 3. 2019 08:53

nevadí,
jak jsem psal, mám to jako koníček, nikdo mi za to neplatí, ...
nějak se k tomu prokoušu časem sám ...
každopádně i tak děkuji.
AMD FX-6300; Gigabyte 970A-DS3P; DDR3 8192MBytes; AMD Radeon HD 6700 Series
dyžon
Junior
Uživatelský avatar

Odeslat příspěvekod JanFiala 5. 3. 2019 09:43

Správná cesta je spustit na stanici, kde je soubor/soubory Firebird server. Pokud máš víc souborů, můžeš mít na serveru víc databází a k nim se připojovat.
Pro připojení pak používáš FBClient komponenty - connection, Query, storedProc.
Připojuješ se na IP/jméno počítače + port
Seznam databází, ke kterým se můžeš připojit ti vrátí FB server jako výsledek SQL dotazu

Ty jsi do toho navíc namíchal datasnap jako další vrstvu, kterou nepotřebuješ
Co můžeš udělat dnes, odlož na včerejšek
JanFiala
Expert
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků