embeded Firebird server
20 отговора
647 прегледа
embeded Firebird server
Опитвам се да направя, така че дадено приложение да работи с embeded firebird server. От sourceforge.net изтеглих embeded firebird изпълних всички инструкции за инсталация в Readme-to но не мога да осъществя връзка с базата.Някакви идеи?
AJ™
Забравих да спомена, че не искам да използвам BDE.
AJ™
Забравих да спомена, че не искам да използвам BDE.
Редактирано от AJ™ на
Re: embeded Firebird server
Какви компоненти за връзка ползваш? Дай повече инфо, какво точно правиш!
Mixy
Mixy
Какъв протокол...
ползваш за връзка към сървъра? Embeded версията може да се върже само локално. Например не можеш да използваш 192.168.1.1:C:\SomeDir\SomeDB.fdb или дори 127.0.0.1 или localhoht. Трябва да е само C:\SomeDir\SomeDB.fdb.
Ако не е това причината - кажи за да видим какъв му е проблема
Ако не е това причината - кажи за да видим какъв му е проблема
Re: Какъв протокол...
Там е работата, че незнам какви компоненти да използвам да не говорим за протокол.Опитах с IB компонентите, също и със Zeos но нищо.Явно не правя нещо както трябва.Имаше една тема до скоро във форума в която ти обясняваше как стават нещата но тя(темата) много се разводни и Phantomas я махна.Така че ако не те затруднявам би ли обяснил отново стъпките които трябва да се направят за да се направи връзка с базата, както и компонентите и протокола който трябва да се използва.
Трябва да се използва ODBC драйвер?
10x
AJ™
Трябва да се използва ODBC драйвер?
10x
AJ™
Re: Какъв протокол...
Казваш, че не знаеш какви компоненти ползваш. А имаш ли сорса на приложението или само се опитваш да подкараш някоя програма да работи с embeded вместо с пълната версия на FB?
От тук вариантите са два:
1) Нямаш кода на приложениято - намираш как му се указва към коя база данни да се свързва. Сещам се за няколко начина, по които може да се направи това - да бъде записано в ini или някакъв друг конфигурационен файл, вероятно в директорията на приложението; да бъде записано в регистратурата (тука ще трябва да се попотърси малко. Или пък можеш да ползваш някакви тулчета за следене на регистратурата, за да видиш къде рови); да се подава като параметър на командния ред; и в най-лошия за нас случай да бъде твърдо зададено в програмата.
Та като изключим последния вариант, при който нищо не можем да направим, като намери къде се задава това нещо виждаш дали има зададен сървър или е само локален път. Обърни внимание, че сървърът може да не е зададен на същото място, както базата. Например да имаш ключове ServerName=192.168.1.1 и DatabaseName=C:\SomeDir\SomeFile.fdb. Ако има зададен сървър - махни го.
2) Ако имаш кода на приложението - пак трябва да минеш през т. 1, но кодът може да те улесни в търсенето. След като се прочете пътят до базата, той ще се запише в някакъв компонент за връзка към нея. Не познавам zeos, но в IBX това ще е IBDatabase, а ако пък случайно се ползва BDE ще е Database (тогава можеш да имаш alias за описване на пътя до базата - това е допълнение към т. 1.). Виждал съм някои програми, които ако няма зададен сървър си добавят отпред сами localhost или 127.0.0.1. Така че ако случаят е такъв или пък пътят е зададен твърдо в програмата, ще трябва кодът да го попреправиш.
Предполагам последният ти въпрос е "трябва ли да се ползва ODBC?". Може да се използва, но не е препоръчително. Има и по-ефективни начини за връзка към IB/FB. За да използваш ODBC трябва да имаш някаква причина. Например да искаш твоето приложение да може да се вързва към различни видове бази, а не само към FB.
По въпроса за инсталацията на firebird embeded - този zip, който си изтеглил, трябва да го разархивираш в директорията на програмата ти и да преименуваш fbembed.dll на gds32.dll или ако програмата ти е с някои по-качествени компоненти, като FIBPlus например, и е настроена подходящо, на fbclient.dll. Ако не си сигурен - копирай го и ги преименувай и на двете. Разбира се, ако те дразнят (щото мене ме дразнят
) можеш да изтриеш readme-тата и разните други документи, но останалите неща е по-добре да си ги оставиш.
Айде успех сега и кажи какво е станало!
От тук вариантите са два:
1) Нямаш кода на приложениято - намираш как му се указва към коя база данни да се свързва. Сещам се за няколко начина, по които може да се направи това - да бъде записано в ini или някакъв друг конфигурационен файл, вероятно в директорията на приложението; да бъде записано в регистратурата (тука ще трябва да се попотърси малко. Или пък можеш да ползваш някакви тулчета за следене на регистратурата, за да видиш къде рови); да се подава като параметър на командния ред; и в най-лошия за нас случай да бъде твърдо зададено в програмата.
Та като изключим последния вариант, при който нищо не можем да направим, като намери къде се задава това нещо виждаш дали има зададен сървър или е само локален път. Обърни внимание, че сървърът може да не е зададен на същото място, както базата. Например да имаш ключове ServerName=192.168.1.1 и DatabaseName=C:\SomeDir\SomeFile.fdb. Ако има зададен сървър - махни го.
2) Ако имаш кода на приложението - пак трябва да минеш през т. 1, но кодът може да те улесни в търсенето. След като се прочете пътят до базата, той ще се запише в някакъв компонент за връзка към нея. Не познавам zeos, но в IBX това ще е IBDatabase, а ако пък случайно се ползва BDE ще е Database (тогава можеш да имаш alias за описване на пътя до базата - това е допълнение към т. 1.). Виждал съм някои програми, които ако няма зададен сървър си добавят отпред сами localhost или 127.0.0.1. Така че ако случаят е такъв или пък пътят е зададен твърдо в програмата, ще трябва кодът да го попреправиш.
Предполагам последният ти въпрос е "трябва ли да се ползва ODBC?". Може да се използва, но не е препоръчително. Има и по-ефективни начини за връзка към IB/FB. За да използваш ODBC трябва да имаш някаква причина. Например да искаш твоето приложение да може да се вързва към различни видове бази, а не само към FB.
По въпроса за инсталацията на firebird embeded - този zip, който си изтеглил, трябва да го разархивираш в директорията на програмата ти и да преименуваш fbembed.dll на gds32.dll или ако програмата ти е с някои по-качествени компоненти, като FIBPlus например, и е настроена подходящо, на fbclient.dll. Ако не си сигурен - копирай го и ги преименувай и на двете. Разбира се, ако те дразнят (щото мене ме дразнят
Айде успех сега и кажи какво е станало!
Re: Какъв протокол...
Мое приложение което иначе работи на Interbase 7.5 server инсталиран на моята машина искам да го подкарам с embeded Firebird server, за да го пускам без инсталация на сървър където и да е, т.е. всичко да е в една папка и да се стартира просто едно .exe.
1.Unzip-вам firebird embeded server в папката на моето приложение.
2.Преименувам fbembed.dll на fbclient.dll
- получава се следното:
c:\my_app\app.exe
c:\my_app\my_database.fdb
c:\my_app\fbclient.dll
c:\my_app\ib_util.dll
c:\my_app\firebird.conf
c:\my_app\firebird.msg
c:\my_app\intl\fbintl.dll
c:\my_app\udf\fbudf.dll
3.Спирам Interbase server-a инсталиран на моята машина.
4.Пускам приложението и очаквам то да заработи с embeded firebird, но
оставам само с очакването.Приложението изхвърля изключение за
ненамерена база данни.
Използвам Interbase компонентите за връзка, като
IBDatabase.DatabaseName = c:\my_app\my_database.fdb
А ето и инструкциите за инсталация на Firebird embeded server:
USAGE:
Just copy fbembed.dll into the directory with your
application. Then rename it to either fbclient.dll or
gds32.dll depending on your database connectivity software.
Then start your application and it will use the embedded
server as a client library and will be able to access
local datasases. You should also copy firebird.msg and
firebird.conf (if necessary) to the same directory.
If external libraries are required for your application,
then you should have them separately. Most probably, it
will be INTL support (fbintl.dll) or UDF libraries. To
be able to use them, you should place them into the
directory tree which emulates the Firebird server one,
i.e. has subdirectories like /intl or /udf:
c:\my_app\app.exe
c:\my_app\gds32.dll
c:\my_app\ib_util.dll
c:\my_app\firebird.conf
c:\my_app\firebird.msg
c:\my_app\intl\fbintl.dll
c:\my_app\udf\fbudf.dll
Всичко трябва да е наред според инструкциите за инсталация но не е.Та това е въпроса ми какво не е ред?
AJ™
1.Unzip-вам firebird embeded server в папката на моето приложение.
2.Преименувам fbembed.dll на fbclient.dll
- получава се следното:
c:\my_app\app.exe
c:\my_app\my_database.fdb
c:\my_app\fbclient.dll
c:\my_app\ib_util.dll
c:\my_app\firebird.conf
c:\my_app\firebird.msg
c:\my_app\intl\fbintl.dll
c:\my_app\udf\fbudf.dll
3.Спирам Interbase server-a инсталиран на моята машина.
4.Пускам приложението и очаквам то да заработи с embeded firebird, но
оставам само с очакването.Приложението изхвърля изключение за
ненамерена база данни.
Използвам Interbase компонентите за връзка, като
IBDatabase.DatabaseName = c:\my_app\my_database.fdb
А ето и инструкциите за инсталация на Firebird embeded server:
USAGE:
Just copy fbembed.dll into the directory with your
application. Then rename it to either fbclient.dll or
gds32.dll depending on your database connectivity software.
Then start your application and it will use the embedded
server as a client library and will be able to access
local datasases. You should also copy firebird.msg and
firebird.conf (if necessary) to the same directory.
If external libraries are required for your application,
then you should have them separately. Most probably, it
will be INTL support (fbintl.dll) or UDF libraries. To
be able to use them, you should place them into the
directory tree which emulates the Firebird server one,
i.e. has subdirectories like /intl or /udf:
c:\my_app\app.exe
c:\my_app\gds32.dll
c:\my_app\ib_util.dll
c:\my_app\firebird.conf
c:\my_app\firebird.msg
c:\my_app\intl\fbintl.dll
c:\my_app\udf\fbudf.dll
Всичко трябва да е наред според инструкциите за инсталация но не е.Та това е въпроса ми какво не е ред?
AJ™
Re: Какъв протокол...
Щом ползваш IBX библиотеката трябва да ти се казва gds32.dll, а не fbclient.dll. Опита ли така?
Re: Какъв протокол...
Ами за мое голямо разочарование, пак не става
Error: unavailable database my_dadabase.fdb.
какви компоненти трябва да се използват ако се преименуава fembed.dll на
fbclient.dll ?
AJ™
Error: unavailable database my_dadabase.fdb.
какви компоненти трябва да се използват ако се преименуава fembed.dll на
fbclient.dll ?
AJ™
Re: Какъв протокол...
Ами FIBPlus например.
Знаеш ли какво ще ти предложа - направи си едно просто проектче. Само да се вързва към някаква база и ако искаш да показва съдържанието на някава табличка. Абе съвсем минимално. Подкарай него най-напред. Ако то тръгне - проблемът е някъде с твоето приложение. Ако и то не тръгва, значи най-вероятно има друг проблем или ти не правиш нещо както трябва. Опитай засега това.
Успех!
Знаеш ли какво ще ти предложа - направи си едно просто проектче. Само да се вързва към някаква база и ако искаш да показва съдържанието на някава табличка. Абе съвсем минимално. Подкарай него най-напред. Ако то тръгне - проблемът е някъде с твоето приложение. Ако и то не тръгва, значи най-вероятно има друг проблем или ти не правиш нещо както трябва. Опитай засега това.
Успех!
Re: embeded Firebird server
Андрей вече те е насочил, та аз засега нямам какво да добавя. Наистина, най добре е първо да поекспериментираш, само връзка и заявка към примерна таблица и след това да видиш как това ще се отнесе към готовото приложение.
Mixy
Mixy
Re: Какъв протокол...
Ще пробвам това което ми предлагаш.
Сега открих друг проблем:
след като не тръгнаха нещата с embeded firebird си продължих работата с Interbase 7.1 инсталиран на моята машина. Когато данните за връзка с базата данни са зададени at DesignView т.е.
всичко е наред.Когато предавам Login параметрите at Run-time ми изхвърля
следното съобщение:
Error: unsuported on-disk structure for file SALES.gdb; found 11, support 10
Ха сега разбери какво става?
AJ™
Сега открих друг проблем:
след като не тръгнаха нещата с embeded firebird си продължих работата с Interbase 7.1 инсталиран на моята машина. Когато данните за връзка с базата данни са зададени at DesignView т.е.
object dbSales: TIBDatabase
DatabaseName = 'C:\SALES.GDB'
Params.Strings = (
'user_name=SYSDBA'
'password=masterkey')
LoginPrompt = False
DefaultTransaction = tSales
IdleTimer = 0
SQLDialect = 1
TraceFlags = []
Left = 16
Top = 8
end;
всичко е наред.Когато предавам Login параметрите at Run-time ми изхвърля
следното съобщение:
Error: unsuported on-disk structure for file SALES.gdb; found 11, support 10
Ха сега разбери какво става?
AJ™
:) ODS 10
ODS 10 (или по точно 10.1) е форматът на файла с данните на Firebird 1.5 (този, който си изтеглил). 11 е на Interbase 7. Разбирай, че FB не може да работи с база на IB 7. Точно това се случва при тебе - програмата ти намира FB embedded сървъра, а не IB 7-цата.
Възможно е точно заради това да не ти е тръгвала програмата досега. Въпреки, че си мисля, че трябва да даде по-смислено съобщение от "unavailable database" ама карай...
За да работиш с FB 1.5 върху база на IB 7 трябва да направиш бекъп на базата с gbak на IB 7, след което да я ресторнеш с gbak на FB 1.5. Освен това не трябва да си използвал никакви специфични неща за IB версия от 6 нагоре (6.5, 7.0, 7.1 или 7.5), защото FB не ги поддържа. Ако ти е само проста базичка - ще стане. Виж ако не е... ще трябва да се откажеш от идеята за Firebird embedded.
пустия му kredor, как омотва писаното, като не се усетиш
Възможно е точно заради това да не ти е тръгвала програмата досега. Въпреки, че си мисля, че трябва да даде по-смислено съобщение от "unavailable database" ама карай...
За да работиш с FB 1.5 върху база на IB 7 трябва да направиш бекъп на базата с gbak на IB 7, след което да я ресторнеш с gbak на FB 1.5. Освен това не трябва да си използвал никакви специфични неща за IB версия от 6 нагоре (6.5, 7.0, 7.1 или 7.5), защото FB не ги поддържа. Ако ти е само проста базичка - ще стане. Виж ако не е... ще трябва да се откажеш от идеята за Firebird embedded.
пустия му kredor, как омотва писаното, като не се усетиш
Редактирано от andrew_nikoloff на
Re: Какъв протокол...
В отговор на:Error: unsuported on-disk structure for file SALES.gdb; found 11, support 10
Прилича ми на база създадена от сървър с по-висока версия от този, с който се опитваме да я отворим без бекъп/рестор.
В отговор на:Когато данните за връзка с базата данни са зададени at DesignView...
всичко е наред.Когато предавам Login параметрите at Run-time ми изхвърля
Вероятно имаш клиентска длл в системната директория (която се ползва в Дизайн), и ембедед в директорията на приложението. (Прочети за пътищата в които търси Loadlibrari)
В отговор на:SQLDialect = 1
За предпочитане е SQLDialect = 3.
В параметрите ти не виждам lc_ctype=WIN1251. Следващия ти проблем очаквам да е, че не работи на кирилица.
Предполагам, че юзър и пасуърд си включил само заради тестовете. Не се препоръчва да остане така в реалната система.
PS. Ех този ранобудник andrew, не стига че ме изпревари, ами и грешки ми откри
Редактирано от NDeu на
Re: Имам въпрос
Какъв трябва да е размера на PageSize?Има ли значение от SQL Dialect-а дали е 3 или 1?
AJ™
AJ™
Re: Имам въпрос
Е хубаво диалект 3 ама следната процедура се компилира при диалект 1 а при диалект 3 дава грешка и не мога да разбера къде бъркам в синтаксиса:
SET TERM ^ ;
CREATE PROCEDURE INSERT_SALE_ITEM (
ISALE_NUMBER INTEGER,
ISTOCK_NO VARCHAR(10),
IQTY SMALLINT)
AS
BEGIN
EXIT;
END^
ALTER PROCEDURE INSERT_SALE_ITEM (
ISALE_NUMBER INTEGER,
ISTOCK_NO VARCHAR(10),
IQTY SMALLINT)
AS
DECLARE VARIABLE Actual_Qty VARCHAR(10);
BEGIN
/* Check if iQTY items exist in Stocks table */
SELECT QUANTITY FROM STOCKS
WHERE STOCK_NUMBER = :iSTOCK_NO
INTO Actual_Qty;
IF (Actual_Qty < iQTY) THEN
EXCEPTION EXP_EXCESS_ORDER;
ELSE BEGIN
/* First remove the quantity of stock from the Stock table */
UPDATE STOCKS
SET QUANTITY = (:Actual_Qty - :iQty)
WHERE STOCK_NUMBER = :iSTOCK_NO;
/* Now Insert the new order */
INSERT INTO ITEMS(
SALE_NUMBER,
STOCK_NO,
QTY)
VALUES(
:iSALE_NUMBER,
:iSTOCK_NO,
:iQTY);
END
END
^
SET TERM ; ^
SQL кода на базата данни може да се види Тук
Хаиде сега помагайте.
AJ™
SET TERM ^ ;
CREATE PROCEDURE INSERT_SALE_ITEM (
ISALE_NUMBER INTEGER,
ISTOCK_NO VARCHAR(10),
IQTY SMALLINT)
AS
BEGIN
EXIT;
END^
ALTER PROCEDURE INSERT_SALE_ITEM (
ISALE_NUMBER INTEGER,
ISTOCK_NO VARCHAR(10),
IQTY SMALLINT)
AS
DECLARE VARIABLE Actual_Qty VARCHAR(10);
BEGIN
/* Check if iQTY items exist in Stocks table */
SELECT QUANTITY FROM STOCKS
WHERE STOCK_NUMBER = :iSTOCK_NO
INTO Actual_Qty;
IF (Actual_Qty < iQTY) THEN
EXCEPTION EXP_EXCESS_ORDER;
ELSE BEGIN
/* First remove the quantity of stock from the Stock table */
UPDATE STOCKS
SET QUANTITY = (:Actual_Qty - :iQty)
WHERE STOCK_NUMBER = :iSTOCK_NO;
/* Now Insert the new order */
INSERT INTO ITEMS(
SALE_NUMBER,
STOCK_NO,
QTY)
VALUES(
:iSALE_NUMBER,
:iSTOCK_NO,
:iQTY);
END
END
^
SET TERM ; ^
SQL кода на базата данни може да се види Тук
Хаиде сега помагайте.
AJ™
Малко си объркал типовете
Виж тази част от процедурата ти:
UPDATE STOCKS
SET QUANTITY = (:Actual_Qty - :iQty)
WHERE STOCK_NUMBER = :iSTOCK_NO;
Actual_Qty ти е от тип Varchar(10), а iQty е smallint. Това според мен (а явно и според създателите на IB) е грешка. За да се компилира този код трябва изрично да кастнеш Actual_Qty до Integer, но по-добре то да ти е също smallint.
UPDATE STOCKS
SET QUANTITY = (:Actual_Qty - :iQty)
WHERE STOCK_NUMBER = :iSTOCK_NO;
Actual_Qty ти е от тип Varchar(10), а iQty е smallint. Това според мен (а явно и според създателите на IB) е грешка. За да се компилира този код трябва изрично да кастнеш Actual_Qty до Integer, но по-добре то да ти е също smallint.
Re: Малко си объркал типовете
Ами защо минава при диалект 1? При него не се ли прави проверка на типовете?
И още един въпрос:
Конвертирането на типовете в IB както в Делфи ли се прави?Досега не ми се е налагало да го правя.
AJ™
И още един въпрос:
Конвертирането на типовете в IB както в Делфи ли се прави?Досега не ми се е налагало да го правя.
AJ™