Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠœΠΈΡ€ InterBase. АрхитСктура, администрированиС ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… Π² InterBase/FireBird/YaffilΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 43

Автор А Ковязин

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ любоС свойство Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ ΠΈΠ· SQLNavigator, ΠΈ Π½ΠΎΠ²ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ сохранСно SQLNavigator позволяСт Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Для этого достаточно ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΡ‹ (рис. 2.55).





Рис 2.55. Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ SQL Navigator

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ значСния Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… свойств Π²ΠΎ внСшнСм Ρ„Π°ΠΉΠ»Π΅ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Save selected SQLs ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΈΡ… ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ прямо Π² SQLNavigator ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Check selected SQLs Записанный Ρ„Π°ΠΉΠ» с Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ запросами ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для дальнСйшСго Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ спСциализированных инструмСнтов

Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ SQLNavigator для поиска тСкста Π² SQL Π² Ρ€Π°ΠΌΠΊΠ°Ρ… всСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° НапримСр, Π½Π° рис. 2 56 Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ всС свойства Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ содСрТат строку "ID"

ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ наТатия Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π½Π°ΠΉΠ΄Π΅Π½Π½ΠΎΠΌ элСмСнтС SQLNavigator Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈ свойство, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΌΠΎΠ³ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ SQL.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, SQLNavigator прСдставляСтся ΠΎΡ‡Π΅Π½ΡŒ эффСктивным инструмСнтом для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с SQL-ΠΊΠΎΠ΄ΠΎΠΌ Π² клиСнтской части прилоТСния Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, СдинствСнным Π² своСм Ρ€ΠΎΠ΄Π΅





Рис 2.56. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ поиска тСкста Π² запросах FIBPIus

Π‘ΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ возмоТности FIBPIus

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…

ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ устойчивых ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΈ, ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ, самым Π²Π°ΠΆΠ½Ρ‹ΠΌ вопросом ΠΏΡ€ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π² условиях Π½Π΅ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΊΠ°Π½Π°Π»Π° связи (Π² частности, ΠΏΡ€ΠΈ использовании dial-up).

FIBPIus прСдоставляСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ срСдств для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ: Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ всС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, "Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ" (Ρ‚. Π΅. Π΄Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹) само ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ прилоТСния ΠΈΠ»ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π²ΠΎΡΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±Π΅Π· закрытия запросов.

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ситуации являСтся TpFTBErrorHandler. Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡ‚Π΅Ρ€ΡŽ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° TpFIBDatabase Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ события OnLostConnect, ΠΎΠ΄Π½Π°ΠΊΠΎ Π±Π΅Π· "Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ" ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Π° Π² TpFIBErrorHandler ΠΌΡ‹ Π½Π΅ смоТСм ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒΡΡ ΠΎΡ‚ Π»ΠΈΡˆΠ½ΠΈΡ… сообщСний ΠΎ ΠΏΠΎΡ‚Π΅Ρ€Π΅ подсоСдинСния.

Π˜Ρ‚Π°ΠΊ, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ простоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅Π΅ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² TDBGrid ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΠΎΡ‚Π΅Ρ€ΡŽ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… трСмя способами, ΠΏΡ€ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ упомянуто (рис. 2.57).





Рис 2.57. Π’Π½Π΅ΡˆΠ½ΠΈΠΉ Π²ΠΈΠ΄ Π³Π»Π°Π²Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Connection Lost

Π—Π°ΠΏΠΎΠ»Π½ΠΈΠΌ SelectSQL для CompaniesDataSet: select * from "Companies" ΠΈ прСдоставим CompaniesDataSet ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ запросы (рис. 2.58).





Рис 2.58. Бвойства AutoUpdateOptions ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° CompaniesDataSet

Π’ΠΊΠ»ΡŽΡ‡ΠΈΠΌ Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΠΆΠΈΠΌ CachedUpdates (CompaniesDataSet.CachedUpdates := True), Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ восстановлСниС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ cmbKindOnLost: TComboBox Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ список Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Ρ… Ρ€Π΅Π°ΠΊΡ†ΠΈΠΉ Π½Π° ΠΏΠΎΡ‚Π΅Ρ€ΡŽ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π²ΠΎ врСмя выполнСния прилоТСния ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ всС возмоТности:

Close pFIBDataBase

Terminate application

Restore connect

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΠΌ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ pFIBErrorHandlerl (рис. 2.59).

TpFIBErrorHandler ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ "особым" ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π΄Π²Π° Ρ‚ΠΈΠΏΠ° ошибок: ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΈ ΠΏΠΎΡ‚Π΅Ρ€ΡŽ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π’ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Π·Π°Π»ΠΎΠΆΠ΅Π½Π° Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок, связанных с Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ΠΌ ссылочной цСлостности, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… вСрсиях FIBPlus данная функция Π΅Ρ‰Π΅ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π°.

TpFIBErrorHandler ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ событиС - OnFIBErrorEvent, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ Π½Π°ΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π² частности, ΠΏΠΎΡ‚Π΅Ρ€ΡŽ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ…:

procedure TForml.pFibErrorHandlerlFIBErrorEvent(Sender:

TObject;

ErrorValue: EFIBError; KindlBError: TKindlBError; var

DoRaise: Boolean);

begin

if KindlBError = keLostConnect then begin

DoRaise := false;

Abort;

end;

end;





Puc 2.59. Бвойства ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° pFIBErrorHandlerl

Π’ΠΎΡ‚ Π² ΠΎΠ±Ρ‰Π΅ΠΌ-Ρ‚ΠΎ ΠΈ вСсь ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ - ΠΌΡ‹ просто Π·Π°ΠΏΡ€Π΅Ρ‰Π°Π΅ΠΌ Π²Ρ‹Π²ΠΎΠ΄ стандартного сообщСния ΠΎ ΠΏΠΎΡ‚Π΅Ρ€Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π²Ρ‹ смоТСтС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ OnFIBEnorEvent для Π±ΠΎΠ»Π΅Π΅ слоТной ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Ρ€ΠΎΠ΄Π° ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ErrorValue. Для нашСго случая Π²Π°ΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π½Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ, ΠΊΡ€ΠΎΠΌΠ΅ срабатывания QnFIBErrorEvent, TpFIBErrorHandler ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΠ΅Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ OnLostConnection Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² TpFIBDatabase ИмСнно здСсь ΠΌΡ‹ ΠΈ сосрСдоточим ΠΎΡΠ½ΠΎΠ²Π½ΡƒΡŽ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ подсоСдинСния.

procedure TForml.DatabaseLostConnect(Database: TFIBDatabase; E:

EFIBError;

var Actions: TOnLostConnectActions);

begin

AttemptRest := 0;

case cmbKindOnLost.Itemlndex of 0: begin

Actions := laCloseConnect;

MessageDlg('Connection lost. TpFIBDatabase will be closed'',

mtlnformamon, [mbOk] , 0

);

end;

1: begin

Actions := laTerminateApp;

MessageDlg('Connection lost. Application will be closed',

mtlnformation, [mbOk], 0

);

end;

2: Actions := laWaitRestore;

end;

end;

Бмысл ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΎΡ‡Π΅Π²ΠΈΠ΄Π΅Π½ - Π² зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ значСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° cmbKindOnLost нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π»ΠΈΠ±ΠΎ "Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚" Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ всС ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, Π»ΠΈΠ±ΠΎ Π·Π°ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ всС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π»ΠΈΠ±ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ€Π΅ΠΆΠΈΠΌ восстановлСния подсоСдинСния. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π° случая ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹ ΠΈ Π² ΠΎΠ±Ρ‰Π΅ΠΌ-Ρ‚ΠΎ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… шагов, ΠΊΡ€ΠΎΠΌΠ΅ установлСния значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Actions. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΌΡ‹ остановимся Π½Π° восстановлСнии ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ CompaniesDataSet находится Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ CachedUpdates, Ρ‚ΠΎ потСря ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π½Π΅ влияСт Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ рСдактирования Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС измСнСния Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒΡΡ Π² локальном Π±ΡƒΡ„Π΅Ρ€Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° CompaniesDataSet Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π² Π·Π°Π΄Π°Ρ‡Ρƒ TpFIBDataBase Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎ: пСриодичСски ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ восстано'Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΈ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎΠ± ΡƒΠ΄Π°Ρ‡Π½Ρ‹Ρ… ΠΈ Π½Π΅ΡƒΠ΄Π°Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ°Ρ…. Когда подсоСдинСниС Π±ΡƒΠ΄Π΅Ρ‚ восстановлСно, ΠΌΡ‹ просто ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌ "ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅" измСнСния ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΡ‚Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ смогут Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ сСрвСром, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ восстановлСния ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ наши Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Π˜Ρ‚Π°ΠΊ, напишСм Π΄Π²Π° простых ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ для события Database OnErrorRestoreConnect

procedure TForml.DatabaseErrorRestoreConnect(Database:

TFIBDatabase;

E: EFIBError; var Actions: TOnLostConnectActions);

begin

Inc(AttemptRest);

Label4.Caption := IntToStr(AttemptRest);

Label4.Refresh;

end;

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Label4 Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ счСтчик ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ восстановлСния подсоСдинСния. Π’Ρ‚ΠΎΡ€ΠΎΠ΅ событиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ нас интСрСсуСт, - AfterRestoreConnect:

procedure TForml DatabaseAfterRestoreConnect;

begin

MessageDlg('Connection restored. You can apply cached updates',

mtlnformation, [mbOk], 0

) ;

end;

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΊ Π±Π°Π·Π΅ восстановлСно, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ сообщСниС ΠΈ смоТСм ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ всС сдСланныС измСнСния.

procedure TForml.ButtonlClick(Sender: TObject);

begin

with CompaniesDataSet do

try

if not DataBase.Connected then begin

try

DataBase.Connected . = True;

except

MessageDlg('Can''t restore connect',

mtlnformation, [mbOk], 0

);

Exit;

end

end;

if not Transaction.Active then Transaction StartTransaction;

ApplyUpdToBase;

Transaction.CoimutRetaining;

CommitUpdToCach;

except

if Transaction.Active then Transaction.RollBack;

end;

end;

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ автоматичСски Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ примСнСния Π΄Π°Π½Π½Ρ‹Ρ… сразу ΠΈΠ· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° AfterRestoreConnect. Π’ самой ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ слСдуСт ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ApplyUpdToBase ΠΈ CommitUpdToCach. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ стандартного ΠΌΠ΅Ρ‚ΠΎΠ΄Π° ApplyUpdates, наслСдованного ΠΎΡ‚ TDataSet, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ "Π½Π΅ Π·Π°ΠΌΠ΅Ρ‡Π°Π΅Ρ‚" скрытыС Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ локальной Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ записи (Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ этот вопрос Π±ΡƒΠ΄Π΅Ρ‚ рассмотрСн Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ "Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡ"), ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ApplyUpdToBase ΠΈ CommitUpdToCach ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ эту ΠΎΡˆΠΈΠ±ΠΊΡƒ VCL

Эмуляция Boolean-ΠΏΠΎΠ»Π΅ΠΉ

Π’Ρ‹ ΡƒΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ InterBase Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ логичСского Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ…. Π§Π΅ΠΌ Π±Ρ‹ это Π½ΠΈ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π·Π²Π°Π½ΠΎ, Π½Π°ΠΌ остаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ³ΠΎΡ€Ρ‡ΠΈΡ‚ΡŒΡΡ этим Ρ„Π°ΠΊΡ‚ΠΎΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ логичСский Ρ‚ΠΈΠΏ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π΅Π½. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ InterBase, Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½Ρ‹ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ, вводя ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° мноТСство допустимых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π² Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… создаСтся ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΄ΠΎΠΌΠ΅Π½ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· Π΄Π²ΡƒΡ… Π²ΠΈΠ΄ΠΎΠ².

CREATE DOMAIN TBOOLEAN_CHAR AS CHAR(1)

DEFAULT 'F' NOT NULL

CHECK (VALUE IN ('F', 'T'))

CREATE DOMAIN TBOOLEAN_INT AS INTEGER

DEFAULT 0 NOT NULL

CHECK (VALUE IN (0, 1))

ΠŸΡ€ΠΈ использовании любой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ для доступа ΠΊ InterBase ΠΎΠ±Π° способа ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Ρ€Π°Π²Π½ΠΎΡ†Π΅Π½Π½Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для ΠΏΠΎΠ»Π΅ΠΉ, созданных с Ρ‚Π°ΠΊΠΈΠΌΠΈ Π΄ΠΎΠΌΠ΅Π½Π°ΠΌΠΈ, Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ всС Ρ€Π°Π²Π½ΠΎ Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Boolean-поля. Π’ΠΎ Π΅ΡΡ‚ΡŒ Ссли ΠΌΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ логичСскоС ΠΏΠΎΠ»Π΅ ΠΊ нашСй Ρ‚Π°Π±Π»ΠΈΡ†Π΅:

ALTER TABLE "Categories" ADD IS_ACTIVE TBOOLEAN_INT

NOT NULL

А ΠΏΠΎΡ‚ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ IBX, сдСлаСм Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° TIBDataSet:

SELECT "Categories"."Name", "Categories".IS_ACTIVE

FROM "Categories"

Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ создаст Π΄Π²Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° для ΠΏΠΎΠ»Π΅ΠΉ:

* TIBStringField для поля "Name" и

* TmtergerField для поля "IS_ACTIVE"

ПослСднСС ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π²Π΅Ρ€Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»Π΅ "IS_ACTIVE" Π½Π΅ являСтся логичСским. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, всС Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Ρ‚ΠΈΠΏΠ° TDBGnd ΠΈ Π΅Π³ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ Π°Π½Π°Π»ΠΎΠ³ΠΈ ΠΎΡ‚ сторонних ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»Π΅ΠΉ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π½Π°ΠΌ Π±Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ. НапримСр, Ссли Π΄Π°ΠΆΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ "Π³Π°Π»ΠΎΡ‡ΠΊΠΈ" для Boolean-ΠΏΠΎΠ»Π΅ΠΉ, значСния ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ€Π°Π²Π½ΠΎ True, Ρ‚ΠΎ ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ "Π²ΠΈΠ΄Π΅Ρ‚ΡŒ" всСго лишь цСлочислСнноС ΠΏΠΎΠ»Π΅, Ρ‚ΠΎ ΠΈ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ "0" ΠΈ "1" РазумССтся, Ссли ΠΌΡ‹ напишСм ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ событий, Ρ‚ΠΎ смоТСм Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ»ΠΈ ΠΌΠ΅Π½Π΅Π΅ сносного отобраТСния логичСских Π²Π΅Π»ΠΈΡ‡ΠΈΠ½ для поля TIntergerField, ΠΎΠ΄Π½Π°ΠΊΠΎ FIBPlus прСдоставляСт Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ простоС ΠΈ качСствСнноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅