Работа с AutoIncremental (AutoInc) полета, DelphiSite

Най-четени

Работа с AutoIncremental (AutoInc) полета

Работа с тип поле с автоматично нарастване В приложения на Delphi, когато се използват таблици, съдържащи полета с автоматично нарастване или полета, които автоматично увеличават стойността си по някакъв непознат за приложението начин, могат да се наблюдават проблеми. Таблиците на Paradox, InterBase, Sybase и Informix имат способността автоматично да вмъкват и актуализират стойности на полета без намесата на услуги или крайни приложения. Въпреки това, не всяка операция на таблица се поддържа от този механизъм. Този документ има за цел да демонстрира основни методи за работа с тези типове полета в Paradox 5.0, Informix 5.x, MS/Sybase SQL Server 4.x, InterBase 4.0 и локални InterBase таблици. Всеки тип маса има свой собствен механизъм зад кулисите. Таблиците на Paradox поддържат типа поле Autoincrement. Когато нови записи се добавят към такива таблици, Borland Database Engine определя текущата максимална стойност в тази колона, добавя един и актуализира новия ред с новата стойност. За таблиците на Informix това поведение се осигурява от специфичен тип поле на Informix, наречен Serial. Серийните колони се различават от полетата на Autoincrement Paradox по това, че в таблиците на Informix стойностите на този тип поле могат да се променят, докато в таблиците на Paradox те са само за четене. Таблиците на InterBase и MS/Sybase SQL Server нямат специален тип поле, който поддържа тази функция, но тригерите могат да се използват за изпълнение на същата задача. Тригерите са специализирани процедури, които се намират на сървъра на базата данни и се изпълняват автоматичноотговор на някакво събитие, като добавяне към таблица, актуализиране и изтриване. Използването на таблици със свързани тригери може да бъде особено проблематично, тъй като тригерите могат да направят много повече от просто увеличаване на стойностите на увеличена колона. Три функционални области, които могат да повлияят на този тип поле в случай на просто вмъкване, групови премествания и свързване на таблици. Обработване на актуализация и/или добавяне на пакетни премествания Парадоксни таблици Тъй като типът на полето за автоматично нарастване е само за четене, опитът за пакетно преместване на тази колона в целевата таблица може да доведе до грешка. За да заобиколите това, свойството TBatchMove Mappings на компонента трябва да бъде настроено така, че полетата на изходната таблица да съвпадат с тези на целевата таблица, с изключение на нейните полета за автоматично нарастване. Таблици на Informix Груповото преместване на редове в таблица на Informix с колони от тип Serial няма да причини грешка. Трябва обаче да бъдете предупредени за възможни проблеми, тъй като серийните колони могат да се актуализират и често се използват като първичен ключ. Таблици на InterBase Таблици на MS/Sybase SQL Server Тригерите в таблиците на InterBase и SQL Server могат да проследяват всички неправилни промени, направени в таблицата, но това зависи изцяло от настройките на самия тригер. Тук също трябва да бъдете предупредени за възможни проблеми, тъй като колоните, актуализирани от тригера, могат да се използват като първичен ключ. Свързване на таблици чрез MasterSource & MasterFields Таблици на Paradox Таблици на Informix Ако свойствата MasterFields и MasterSource се използват за свързване на таблици с релации главен-детайл и едно от полетата в таблицата с детайли се увеличава автоматично, илиСерийно поле, тогава съответното поле в "главната" таблица трябва да е от тип Long Integer или да бъде Серийно поле. Ако "главната" таблица не е таблица на Paradox, тогава ключовото поле на "главната" таблица може да бъде поле от произволен цял тип, който поддържа. InterBase таблици MS/Sybase SQL Server таблици Свързването с помощта на този тип таблица не създава проблеми, ако използвате полета, които са модифицирани от тригер. Единственото изискване е да съвпадат с необходимите типове колони и на двете таблици. Прости вмъквания/актуализации Таблици на Paradox Тъй като полетата за автоматично нарастване на Paradox имат атрибут само за четене, те обикновено не са предназначени за актуализиране и вмъкване на нови записи. Следователно свойството Required за компоненти на поле, базирано на полета с автоматично нарастване, винаги трябва да бъде зададено на False. Това може да се направи от Delphi с помощта на редактора на полета чрез дефиниране на компоненти на поле по време на проектиране (щракване два пъти върху TQuery или TTable компонент) или по време на изпълнение със следния код:

Table1.Fields[0].Required := False; или

Таблици на Informix Въпреки че серийните полета на Informix могат да се актуализират, ако те трябва да използват функцията за автоматично нарастване, тогава свойството Required за компоненти на поле, базирано на такова поле, трябва да бъде зададено на False. Направете всичко по същия начин, както е описано за таблиците на Paradox. InterBase таблици MS/Sybase SQL Server таблици Обработката на вмъкването на тези типове таблици с възможност за промяна на тригера изисква няколко стъпки. Допълнителните стъпки са особено необходими, ако вмъкването се извършва чрез стандартни контроли на база данни като DBEdits или DBMemos. Вмъкването на редове в таблици, модифицирани от задействания на InterBase и SQL Server, може много вероятно да причини съобщение за грешка „Записът/ключът е изтрит“. Това съобщение за грешка се появява, въпреки че таблицата се актуализира правилно на сървъра. Това се случва, ако: 1. Тригерът актуализира първичния ключ. Грешката може да възникне не само при използване на тригер, но тригерът е най-вероятната причина за грешката. 2а. Други колони в таблицата имат свързани стойности по подразбиране. Това се прави от DEFAULT при създаване на InterBase таблица или се съхранява в SQL Server от sp_bindefault. или 2b. Вмъкването на нов ред актуализира полета от тип Blob. или 2b. Изчисляваните полета са дефинирани в таблицата InterBase. Основната причина за тези грешки е, че когато запис (или ключ за самоличност) се промени на сървъра, BDE вече няма начин да идентифицира записа, за да го търси отново. Това означава, че записът вече не се появява, както би изглеждал, ако е бил „публикуван“, следователно BDE ще смята, че записът е изтрит (или ключът е променен). Първо, компонентите на полето на задействаните полета трябва да имат свойството Required, зададено на False. Направете всичко по същия начин, както е описано за таблиците на Paradox. Второ, за да избегнете случайни грешки, подредете таблицата по индекс, който не използва полетата, актуализирани от тригера. Освен това ще предотврати изчезването на нововъведения запис веднага след поставянето му. Накрая, ако условие 1 по-горе не е възможно, но събития 2a, 2b или 2c са възможни, тогава трябва да създадете манипулатор на събитие AfterPost за компонента TTable, както е показано по-долу:

процедура TForm1. Table1AfterPost( DataSet: TDataset ) ;

МетодRefresh препрочита стойностите, променени от сървъра. Ако условия 2a, 2b или 2c не са възможни, тогава таблицата може да се актуализира без контролите на базата данни Delphi. Това може да се направи с TQuery компонент, препращащ към същата таблица. След като бъде изпратена заявка за опресняване, всички TTables, използващи същата таблица, трябва да бъдат обновени.