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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π‘ΠΎΠ²Π΅Ρ‚Ρ‹ ΠΏΠΎ Delphi. ВСрсия 1.4.3 ΠΎΡ‚ 1.1.2001Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 38

Автор Π’Π°Π»Π΅Π½Ρ‚ΠΈΠ½ ΠžΠ·Π΅Ρ€ΠΎΠ²

 end; {ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибки}

end;

Бвойство Params

Π­Ρ‚ΠΎΠ³ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ достаточно для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Π·Π½Π°ΡŽΡ‰Π΅Π³ΠΎ SQL. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π΅ Π·Π½Π°Π΅Ρ‚ этого языка. Π˜Ρ‚Π°ΠΊ, ваша Ρ€Π°Π±ΠΎΡ‚Π° ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² прСдоставлСнии интСрфСйса ΠΈ создании SQL-запроса. Π’ Delphi, для создания SQL-запроса Π½Π° Π»Π΅Ρ‚Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ динамичСскиС запросы. ДинамичСскиС запросы Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ использованиС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Для опрСдСлСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² запросС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ (:), Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ SQL-запроса с использованиСм динамичСского ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°:

select * from EMPLOYEE

where DEPT_NO = :Dept_no

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈΠ»ΠΈ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ для ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ свойство Params ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Query1. Π©Π΅Π»ΠΊΠ½ΠΈΡ‚Π΅ Π½Π° ΠΊΠ½ΠΎΠΏΠΊΠ΅ '…'. Π”ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π΄ΠΈΠ°Π»ΠΎΠ³ настройки ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Dept_no. Π—Π°Ρ‚Π΅ΠΌ Π² Π²Ρ‹ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΌ спискС Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Integer. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°Π΄Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π²Π²Π΅Π΄ΠΈΡ‚Π΅ Π½ΡƒΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² ΠΏΠΎΠ»Π΅ рСдактирования Β«ValueΒ».

Для измСнСния SQL-запроса Π²ΠΎ врСмя выполнСния прилоТСния, ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ (bind). ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, запрос Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, Π° Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒΡΡ. Для нСпосрСдствСнного рСдактирования значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ свойство Params ΠΈΠ»ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ ParamByName. Бвойство Params прСдставляСт ΠΈΠ· сСбя массив TParams. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ для получСния доступа ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅Π³ΠΎ индСкс. Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°,

Query1.params[0].asInteger := 900;

Бвойство asInteger Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ Integer (Π½Π°Π·Π²Π°Π½ΠΈΠ΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ само Π·Π° сСбя). Π­Ρ‚ΠΎ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½ΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏ Integer. НапримСр, Ссли Ρ‚ΠΈΠΏ поля VARCHAR(10), Delphi осущСствит ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ…. Π’Π°ΠΊ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΌΠΎΠ³ Π±Ρ‹ Π±Ρ‹Ρ‚ΡŒ записан Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

Query1.params[0].asString := '900';

ΠΈΠ»ΠΈ Ρ‚Π°ΠΊ:

Query1.params[0].asString := edit1.text;

Если вмСсто Π½ΠΎΠΌΠ΅Ρ€Π° индСкса Π²Ρ‹ Ρ…ΠΎΡ‚Π΅Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ имя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Ρ‚ΠΎ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ΡΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ ParamByName. Π”Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ TParam с Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ. НапримСр:

Query1.ParamByName('DEPT_NO').asInteger := 900;

Π’ листингС 2 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°.

Листинг 2

procedure TForm1.BitBtn1Click(Sender: TObject);

begin

 Query1.close; {Π”Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌ запрос Π² качСствС ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΌΠ΅Ρ€ прСдостороТности }

 if not Query1.prepared then

  Query1.prepare; {УбСдимся Ρ‡Ρ‚ΠΎ запрос ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½}

 {Π‘Π΅Ρ€Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΠΈ замСняСмим ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€.}

 if edit1.text <> '' {ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌ Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ пустого Π²Π²ΠΎΠ΄Π°} then

  Query1.ParamByName('DEPT_NO').AsString := edit1.text

 else Begin

  Query1.ParamByName('DEPT_NO').AsInteger := 0;

  edit1.text := '0';

 end;

 try {ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊ ошибок}

  Query1.Open; {ВыполняСм запрос ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…}

 except {сСкция ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок}

 On e : EDatabaseError do {e – Π½ΠΎΠ²Ρ‹ΠΉ дСскриптор ошибки}

  messagedlg(e.message, mtError, [mbOK],0); {ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ свойство message ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° e}

 end; {ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибки}

end;

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π΄Π΅Π»ΠΎΠΌ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»ΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽ запрос. ΠŸΡ€ΠΈ Π²Ρ‹Π·ΠΎΠ²Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° prepare, Delphi посылаСт SQL запрос Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹ΠΉ сСрвСр. Π‘Π΅Ρ€Π²Π΅Ρ€ выполняСт грамматичСский Ρ€Π°Π·Π±ΠΎΡ€ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ запроса. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ запроса состоит Π² Π΅Π³ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ€Π°Π·Π±ΠΎΡ€Π΅ ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²ΠΎΠΉ здСсь ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° сСрвСром запроса ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π΅Π³ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ. Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ запрос ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½, ΠΏΠΎΠ΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΈ запрос выполняСтся.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ Π΄Π°Π½Π½Ρ‹Ρ…

Π’ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠ³ ввСсти Π½ΠΎΠΌΠ΅Ρ€ ΠΎΡ‚Π΄Π΅Π»Π°, ΠΈ послС выполнСния запроса отобраТался список сотрудников этого ΠΎΡ‚Π΄Π΅Π»Π°. А ΠΊΠ°ΠΊ насчСт использования Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ DEPARTMENT, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π΅ΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π»Π΅Π³ΠΊΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒΡΡ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌΠΈ ΠΈ ΠΎΡ‚Π΄Π΅Π»Π°ΠΌΠΈ?

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ TTable с ΠΈΠΌΠ΅Π½Π΅ΠΌ Table1. Для Table1 имя Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… IBLOCAL, имя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ – DEPARTMENT. DataSource2 TDatasource связан с Table1. Π’Π°Π±Π»ΠΈΡ†Π° Ρ‚Π°ΠΊΠΆΠ΅ Π°ΠΊΡ‚ΠΈΠ²Π½Π° ΠΈ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ записи Π² TDBGrid.

Бпособ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ TQuery ΠΊ TTable – Ρ‡Π΅Ρ€Π΅Π· TDatasource. Π•ΡΡ‚ΡŒ Π΄Π²Π° основных способа ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠ΄ Π² ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ΅ события TDatasource OnDataChange. НапримСр, листинг 3 дСмонстрируСт эту Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ.

Листинг 3 – Использования события OnDataChange для просмотра Π΄ΠΎΡ‡Π΅Ρ€Π½ΠΈΡ… записСй

procedure TForm1.DataSource2DataChange(Sender: TObject; Field: TField);

begin

 Query1.Close;

 if not Query1.prepared then Query1.prepare;

 Query1.ParamByName('Dept_no').asInteger := Table1Dept_No.asInteger;

 try

  Query1.Open;

 except On e : EDatabaseError do

  messageDlg(e.message, mtError, [mbOK], 0);

 end;

end;

Π’Π΅Ρ…Π½ΠΈΠΊΠ° с использованиСм OnDataChange ΠΎΡ‡Π΅Π½ΡŒ Π³ΠΈΠ±ΠΊΠ°, Π½ΠΎ Π΅ΡΡ‚ΡŒ Π΅Ρ‰Π΅ Π»Π΅Π³Ρ‡Π΅ способ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Query ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ TQuery ΠΈΠΌΠ΅Π΅Ρ‚ свойство Datasource. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡ TDatasource для свойства Datasource, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ TQuery сравниваСт ΠΈΠΌΠ΅Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Π² SQL-запросС с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΠΎΠ»Π΅ΠΉ Π² TDatasource. Π’ случаС ΠΎΠ±Ρ‰ΠΈΡ… ΠΈΠΌΠ΅Π½, Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π·Π°ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ автоматичСски. Π­Ρ‚ΠΎ позволяСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΡƒ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ написаниС ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ Π² листингС 3 (*** ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ Π²Ρ‹ΡˆΠ΅ ***).

ЀактичСски, Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° использования Datasource Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ кодирования. Для ΠΏΠΎΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ запроса ΠΊ Ρ‚Π°Π±Π»ΠΈΡ†Π΅ DEPT_NO Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ дСйствия, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π² листингС 4.

Листинг 4 – БвязываниС TQuery c TTable Ρ‡Π΅Ρ€Π΅Π· свойство Datasource

Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Ρƒ Query1 свойство SQL ΠΈ Π²Π²Π΅Π΄ΠΈΡ‚Π΅:

select * from EMPLOYEE

where DEPT_NO = :dept_no

Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ свойство Datasource ΠΈ Π½Π°Π·Π½Π°Ρ‡ΡŒΡ‚Π΅ источник Π΄Π°Π½Π½Ρ‹Ρ…, связанный с Table1 (Datasource2 Π² нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅)

Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ свойство Active ΠΈ установитС Π΅Π³ΠΎ Π² True

Π­Ρ‚ΠΎ всС, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ограничСния Π½Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ запросы. ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Ρ‹ значСниями. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с ΠΈΠΌΠ΅Π½Π΅ΠΌ Column ΠΈΠ»ΠΈ Table. Для создания запроса, динамичСски измСняСмого имя Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹, Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ строки. Другая Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² использовании ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Format.

Команда Format

Команда Format замСняСт ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ форматирования (%s, %d, %n ΠΈ ΠΏΡ€.) ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ значСниями. НапримСр,

Format('Select * from %s', ['EMPLOYEE'])

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚ 'Select * from EMPLOYEE'. Ѐункция Π±ΡƒΠΊΠ²Π°Π»ΡŒΠ½ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π·Π°ΠΌΠ΅Π½Ρƒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² форматирования значСниями массива. ΠŸΡ€ΠΈ использовании Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² форматирования, Π·Π°ΠΌΠ΅Π½Π° происходит слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ. НапримСр,

tblName := 'EMPLOYEE';

fldName := 'EMP_ID';

fldValue := 3;

Format('Select * from %s where %s=%d', [tblName, fldName, fldValue])

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ форматирования Π±ΡƒΠ΄Π΅Ρ‚ 'Select * from EMPLOYEE where EMP_ID=3'. Вакая Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ обСспСчиваСт Ρ‡Ρ€Π΅Π·Π²Ρ‹Ρ‡Π°ΠΉΠ½ΡƒΡŽ Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ динамичСском Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ запроса. ΠŸΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Π½ΠΈΠΆΠ΅ Π² листингС 5, позволяСт вывСсти Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°Ρ… ΠΏΠΎΠ»Π΅ salary. Для поля salary ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ.

Листинг 5 – ИспользованиС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Format для создания SQL-запроса

procedure TForm1.BitBtn1Click(Sender: TObject);

var

 sqlString : string; {здСсь хранится SQL-запрос}

 fmtStr1, fmtStr2 : string; {здСсь хранится строка, пСрСдаваСмая для форматирования}

begin

 { Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ каркаса запроса }

 sqlString := 'Select EMP_NO %s from employee where SALARY %s';

 if showSalaryChkBox.checked {Если checkbox Salary ΠΎΡ‚ΠΌΠ΅Ρ‡Π΅Π½} then

  fmtStr1 := ', SALARY'

 else fmtStr1 := '';

 if salaryEdit.text <> '' { Если ΠΏΠΎΠ»Π΅ рСдактирования Salary Π½Π΅ пустоС } then

  fmtStr2 := salaryEdit.text

 else fmtStr2 := '>0';

 Query1.Close; {Π”Π΅Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌ запрос Π² качСствС ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΌΠ΅Ρ€ прСдостороТности }

 Query1.SQL.Clear; {Π‘Ρ‚ΠΈΡ€Π°Π΅ΠΌ любой ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ запрос}

 Query1.SQL.Add(Format(sqlString,[fmtStr1, fmtStr2])); {ДобавляСм}

 {Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΡƒΡŽ строку ΠΊ свойству SQL}

 try {ΠΏΠ΅Ρ€Π΅Ρ…Π²Π°Ρ‚Ρ‡ΠΈΠΊ ошибок}

  Query1.Open; {ВыполняСм запрос ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ Π½Π°Π±ΠΎΡ€ Π΄Π°Π½Π½Ρ‹Ρ…}

 except {сСкция ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок}

 On e : EDatabaseError do {e – Π½ΠΎΠ²Ρ‹ΠΉ дСскриптор ошибки}

  messageDlg(e.message, mtError,[mbOK],0);

  {ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ свойство message ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° e}

 end; {ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибки}

end;

Π’ этом ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Clear ΠΈ Add свойства SQL. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Β«ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½Π½Ρ‹ΠΉΒ» запрос ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ рСсурсы сСрвСра, ΠΈ Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ Ρ‡Ρ‚ΠΎ Π½ΠΎΠ²Ρ‹ΠΉ запрос Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π΅ ΠΆΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈ столбцы, Delphi, ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ свойства SQL, осущСствляСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ Β«ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ΅Β» (unprepare). Если TQuery Π½Π΅ Π±Ρ‹Π» ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²Π»Π΅Π½ (Ρ‚.Π΅. свойство Prepared установлСно Π² False), Delphi автоматичСски ΠΏΠΎΠ΄Π³ΠΎΡ‚Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² нашСм случаС, Π΄Π°ΠΆΠ΅ Ссли Π±Ρ‹ Π±Ρ‹Π» Π²Ρ‹Π·Π²Π°Π½ ΠΌΠ΅Ρ‚ΠΎΠ΄ Prepare, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΎΡ‚ этого Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·Ρ‹.