Термінова допомога студентам
Дипломи, курсові, реферати, контрольні...

Створення баз даних у InterBase SQL Server

РефератДопомога в написанніДізнатися вартістьмоєї роботи

Поняття процедур і тригерів має, колись всього, асоціюватися з визначенням бизнес-логика. Процедури реалізують документований інтерфейс до даних в БД, а тригери — перевірку коректності впроваджуються даних, і залаштунковий роботу. Якщо в Вас є можливість перекласти всю бизнес-логику на сервер як тригерів і процедур, те й треба чинити. Навіть якщо взяти Ви у програмі контролюєте правильність… Читати ще >

Створення баз даних у InterBase SQL Server (реферат, курсова, диплом, контрольна)

Создание баз даних в InterBase SQL Server

Я захаращувати текст докладним описом всіх операторів до створення об'єктів базі даних. Щодо цього є документація. Навпаки, на простих прикладах постараюся показати як і коли це потрібно робити однак. Тут описується роботу з SQL сервером InterBase 6.0.

Создание бази данных

База даних створюється простим скриптом. Тут й надалі я буду SQL оператори виділяти жирним шрифтом.

CREATE DATABASE " …PFO_POKAZATELI.GDB «USER «ADM_PFO_POK «PASSWORD «12 345 «.

PAGE_SIZE = 8192.

DEFAULT CHARACTER SET WIN1251;

CREATE DATABASE — і є оператор, що створить базі даних. База даних представлятиме з себе файл, який створений каталозі, зазначеному після оператора. Розширення файла може бути будь-якою, але прийнято, що GDB — розширення для файла бази даних, а, наприклад, GBP — для резервної копии.

USER і PASSWORD задають ім'я користувача і пароль. Цей користувач має бути зареєстрований на сервері аж до створення бази даних, інакше InterBase видасть повідомлення про ошибке.

PAGE SIZE задає розмір сторінки даних в файлі за умовчанням. Сторінка буде скачиваться з жорсткого диска лише повністю. Тому, вважатимуться, що це мінімальний розмір буфера роботи з файлом бази даних. Сторінка має бути такої розміру, щоб у неї вмістилося хоча тільки запис у кожній із таблиць. Тут непотрібно враховувати розмір BLOB поля, т.к. щодо його зберігання виділяються додаткові сторінки. Розміри сторінок може бути від 1024 до 8192 Kb. Розмір сторінок впливає швидкодію і ступінь заповнення даними файла бази даних. Тож якщо наступна запис не поміщається цілком у активну сторінку, то тут для неї буде виділено нову сторінку. Тому треба йти до кратному сторінці розміру записи. Це, звісно вельми проблематичне, т.к. у Вас в БД може бути кілька таблиць з різними розмірами записи. Завеликі розмір сторінки призводить до зчитуванню з диска записів, які можуть опинитися не знадобитися в вихідних даних запиту, що має знижувати швидкодія всієї системи загалом. Вочевидь, це відбувається за маленьких розмірах записи проти розміром сторінки. Проте, численні досліди показують, що швидкодія може і знижується, але таку маленьку величину, яку можна зафіксувати і виміряти в реальних грамотно побудованих приложениях.

DEFAULT CHARACTER SET визначає кодування символів базі даних. Якщо ви маєте намір застосовувати російську мову мову, то Вам слід встановити значення WIN 1251. Для інших мов таки є свої кодировочные таблиці. Зазвичай базі даних створюють на IBConsole. Там потрібно вибрати пункт меню «Database|Create Database ». У який з’явився вікні заповнити поля введення параметрів операторів до створення БД.

Можете створити БД з кількох файлів, які заповнюватися даними почергово. Або створити дзеркало іншою жорсткому диску захисту від катастрофи основного жорсткого диска (див. документацию).Создание таблиц.

InterBase — не зовсім те, що писав Кодд. Тут не повністю реалізовано поняття домену. Домени служать в InterBase задля зв’язку таблиць по первинному і зовнішньому ключу, а описи типу поля, певного користувачем. Понад те, коли почнете створювати таблиці з полями стандартного типу, то кожному з цих полів буде поставлено у відповідність свій домен. Це спричиняє з того що кількість об'єктів базі даних приростає за рахунок доменів прямо пропорційно кількості полів всіх таблиць. Тому, зазвичай створюють достатньо доменів для описи таблиць в БД, і потім створюють самі таблиці. Ось витяг із реальної бази даних до створення доменов:

CREATE DOMAIN IZMER_NUM INTEGER NOT NULL;

CREATE DOMAIN ACTIVITIES_NUM INTEGER NOT NULL;

.. .

CREATE DOMAIN NAMES_TYPE VARCHAR (45) COLLATE PXW_CYRL;

CREATE DOMAIN FLOAT_TYPE DOUBLE PRECISION;

CREATE DOMAIN BOOL_TYPE CHAR (1) DEFAULT «F «CHECK (VALUE = «T «OR VALUE = «F »);

CREATE DOMAIN FORMULA_TYPE BLOB SUB_TYPE 1 SEGMENT SIZE 256 CHARACTER SET WIN1251;

CREATE DOMAIN INTEGER_TYPE INTEGER;

.. .

CREATE DOMAIN BY_USER VARCHAR (30) DEFAULT USER;

CREATE DOMAIN BY_DATE TIMESTAMP DEFAULT «now » ;

Команда CREATE DOMAIN створює новий домен. Далі, йде ім'я домену. Потім — його тип. Є безліч типів даних, які підтримують InterBase. Можете дізнатися цю інформацію з документації. Далі, можна поставити обмеження на значення, заводимое на полі таблиці типу цього домену. Наприклад, NOT NULL зобов’язує завжди заводити якісь дані до цього полі при додаванні нової рядки у таблицю, тобто. це полі обов’язково має бути заповнене. DEFAULT «F «заповнює полі значенням за умовчанням — символом «F ». Конструкція CHECK (VALUE = «T «OR VALUE = «F ») перевіряє вихід значення поля за задані кордону. Конструкція COLLATE PXW_CYRL дозволяє правильно вести сортування рядків таблиці полем типу цього домену. Ця конструкція застосовується під час створення домену або за оголошенні індексу (про це згодом). Конструкція CREATE DOMAIN FORMULA_TYPE BLOB SUB_TYPE 1 SEGMENT SIZE 256 CHARACTER SET WIN1251 створює домен типу BLOB, тобто. набір байтів, які розглядаються як текст (SUB_TYPE 1), сторінки в файлі БД при цьому тексту виділяються по 256 байт відразу й текст у тому полі записується в кодуванні WIN1251. Останні два домену можуть зберігати інформацію про користувачі і дату і час про нього зміні записи. Тепер створимо якусь таблицу.

CREATE TABLE IZMER_NAMES.

(.

ID_NUM IZMER_NUM,.

NAME NAMES_TYPE,.

USER_NAME BY_USER,.

CHANGE_DATE BY_DATE,.

PRIMARY KEY (ID_NUM).

);

Оператор CREATE TABLE власне, створює таблицю, далі йде її унікальне не більше БД ім'я. Між дужками стоять визначення стовпчиків таблиці і висуваються додаткові оператори. Ми, що таблиця складається з чотирьох стовпчиків, які тип описаний через домени, які ми описали раніше. Якщо ви створите ще одне таблицю з полем типу NAMES_TYPE, то кількість доменів у Вас збільшено, і якби Ви створили дві таблиці, у яких можна було за одним полю типу VARCHAR (45), це призвело б до створенню двох доменів, що описують ці поля. Причому, імена цих доменів присвоились б за умовчанням, отже, цілком нечитабельные. Оператор PRIMARY KEY пределяет ім'я чи імена полів, що розглядаються як первинний ключ. Поля первинного ключа мали бути зацікавленими NOT NULL поєднання їх значень має бути унікально не більше таблиці. Це хіба що відбиток пальців записи — набір значень полів, за якими завжди зможемо відрізнити одну запис одної. Якщо ви не можете виділити первинний ключ в таблиці для зберігання Ваших даних, отже, швидше за все, Ви недостатньо добре продумали всі питання із зберігання даних в таблице. Связывание таблиц.

Зв’язати можна хоча б дві таблиці, тому визначимо другу:

CREATE TABLE ACTIVITIES.

(.

ID_NUM ACTIVITIES_NUM,.

ID_IZMER_NAMES IZMER_NUM,.

POZITION INTEGER_TYPE,.

NAME NAMES_TYPE,.

IS_DECCIPHERAD_INFO BOOL_TYPE,.

USER_NAME BY_USER,.

CHANGE_DATE BY_DATE,.

PRIMARY KEY (ID_NUM),.

FOREIGN KEY (ID_IZMER_NAMES) REFERENCES IZMER_NAMES (ID_NUM));

У другій таблиці є полі з типом IZMER_NUM — це домен, що використовується У першій таблиці визначення поля первинного ключа. Ми можемо створити зовнішній ключ для зв’язку двох таблиць: FOREIGN KEY (ID_IZMER_NAMES) REFERENCES IZMER_NAMES (ID_NUM). Що буквально означає: «Зовнішній ключ полем ID_IZMER_NAMES як посилання в таблицю IZMER_NAMES полем ID_NUM ». Така зв’язок гарантує нам, що у таблиці IZMER_NAMES завжди житиме рядок з номером, який ми запишемо на полі ID_IZMER_NAMES. Якщо хтось спробує видалити з довідника одиниць виміру рядок, що її використовуємо в довіднику діяльності, то станеться виняткова ситуація. Така поведінка БД називається контроль ссылочной цілісності. Тепер, трохи слів план побудови БД. Добре, якщо у Вас є який ніякої Case інструмент, наприклад, Rational Rose. Кажуть, що в Microsoft Office з’явився Visio. Я підозрюю, що це щось дуже то, що потрібно, але зараз працювати хоч і чимось, ніж довго чекати хороший інструмент. Та якщо немає Case, слід враховувати низка невеличких правил:

Составьте текст БД, і потім вводите запити. Текст знадобиться Вам для перевірки перед введенням. У процесі введення, Ви знайдете ряд помилок, що відразу заносите до тексту БД (скрипт).

Сначала створюються довідники, які мають зовнішніх економічних зв’язків, потім ті таблиці, які мають для цієї довідники тощо. від простого до складного, чи Вам доведеться-таки зв’язку визначати після створення таблиць.

Не використовуйте до створення БД візуальні програми типу Database Desctop чи SQL Explorer. Вводите всі у вигляді SQL запитів, наприклад, у Interactive SQL. По крайнього заходу, Ви влучно знатимете що саме запит Ви виконати.

Суррогатные ключи

Є дві типу ключових полів. Перше — це природні ключі. Візьмемо, приміром, медичну карту в поліклініці. Природний ключ — це номер медичної карти. На медичну карту «чіпляються «талони (зв'язок головний — підлеглі), які мають природний ключ — це номер медичної карти хворого, звітний рік і номер талона (з Нового року нумерація починається з одиниці). До талонах «чіпляються «відвідин, які мають природний ключ — номер медичної карти хворого, звітний рік, номер талона й час відвідин. До відвідинам — послуги тощо. Ми, що розмір первинного ключа збільшується, по крайнього заходу, одне полі з новою таблицею. Відповідно, зростає обчислювальна навантаження, що можна оцінити потужністю домену, на сервер БД. Які ж можна протистояти розростання первинного ключа? Багато програмістів, і зробив у тому числі, вважають, що унікальність запису і первинний ключ — це поняття, взагалі-то різні, тому ми завжди, де це потрібно, застосовуємо т.зв. скорочення первинного ключа. І тому використовуються сурогатні (тобто. неприродні) ключі. Що таке сурогатний ключ? Це полі цілого типу, що має унікальне значення, який утворює домен коїться з іншими таблицями. Візьмемо, приміром, випадок із поліклініки. Для таблиці з талонами вводиться унікальне полі цілого типу, в якому зберігається послідовність цілих чисел 1, 2, 3 … N тощо. Це полі оголошено первинним ключем, а ніж завести кілька талонів з однаковими номерами, оголошується унікальний індекс полями звітний рік і номер талона. Зовнішній ключ, як повинно бути — полем номери медичної карти. Через війну, ми скоротили розмір первинного ключа, який тепер сурогатним. Ці цілі числа використовуватимуться на таблиці з відвіданням, де теж скорочувати первинний ключ. Зауважте, що у таблиці з відвіданням, тепер, непотрібно зберігати не номер медичної карти, не звітний рік, не номер талона, лише значення первинного ключа, тобто. одне число на запись.

Ось лише кілька прикладів до роботи з сурогатними ключами.

Для початку, треба створити механізм підтримки унікальності значень сурогатного ключа. CREATE GENERATOR GET_IZMER_NAMES_NUM;

Этот оператор створює т.зв. генератор, де буде зберігається попереднє значення нашої унікальної послідовності цілих чисел. Механізм гарантує, лише одна користувач може мати доступом до генератору водночас часу. Інші чекатимуть, поки генератор не освободится.

SET GENERATOR GET_IZMER_NAMES_NUM TO 50;

Этим оператором ми встановили початкова значення генератора. Далі, можна або створити тригер, який спрацює при додаванні нової запис у таблицю, або створити простеньку процедуру, яка поверне чергове значення з генератора:

SET TERM !! ;

CREATE PROCEDURE SET_IZMER_NAMES_NUM.

RETURNS (NUM INTEGER).

AS.

BEGINNUM = GEN_ID (GET_IZMER_NAMES_NUM, 1);

END!

SET TERM; !!

GEN_ID — це вбудована процедура, яка просто збільшує значення генератора на величину, передану у другому параметрі і повертає результат. Якщо ви використовуєте тригер, то після додавання нової записи, Вам доведеться оновлювати весь набір даних, аби знати значення первинного ключа, тому краще використовувати процедуру.

" Дерев’яні «списки

Трапляється, коли ставлення главный-подчиненный властиво записів одному й тому ж таблиці, наприклад, відносини між відділами організації, або між структурами держапарату тощо. тощо. Одна запис то, можливо головною для інших, які у своє чергу можуть бути головними до таких. Така структура нагадує дерево з гілками, розташованими вниз за таблицею. Перша запис (записи) — головний вузол (вузли) від яких йдуть галузі (підлеглі записи). Якщо такі записи мають підлеглі (вкладені) записи, всі вони утворюють такі по ієрархічному списку вузли. Найпростіше, уявити цю у просторі як верств записів. Кожна запис може містити у собі вкладений шар записами. Попри що здається складність, реалізація такої структури проста. Треба лише мати, як мінімум, два стовпчика в таблиці: перший стовпчик — це сурогатний первинний ключ, а другий — посилання перший стовпчик багатозначно первинного ключа записи — власника. Ось реалізація такої таблиці:

CREATE TABLE ACTIVITIES.

(.

ID_NUM ACTIVITIES_NUM,.

ID_OWNER ACTIVITIES_NUM,.

ID_IZMER_NAMES IZMER_NUM,.

POZITION INTEGER_TYPE,.

NAME NAMES_TYPE,.

USER_NAME BY_USER,.

CHANGE_DATE BY_DATE,.

PRIMARY KEY (ID_NUM),.

FOREIGN KEY (ID_IZMER_NAMES) REFERENCES IZMER_NAMES (ID_NUM));

Таблиця містить первинний ключ на полі ID_NUM, посилання головну запис на полі ID_OWNER, посилання одиницю виміру перетворилася на полі ID_IZMER, полі POZITION цілого типу, що б позицію записи, для можливості переміщення записи вгору й за низ, найменування виду дечтельности в полі NAME. Далі, йдуть лічильник і процедуру до роботи з первинним ключем.

CREATE GENERATOR GET_ACTIVITIES_NUM;

SET GENERATOR GET_ACTIVITIES_NUM TO 50;

SET TERM !! ;

CREATE PROCEDURE SET_ACTIVITIES_NUM.

RETURNS (NUM INTEGER).

AS.

BEGINNUM = GEN_ID (GET_ACTIVITIES_NUM, 1);

END!

SET TERM; !!

Далі, йде індекс для сортування рядків по позиції. Ім'я POZITION прийнято мною не тому що не знаю англійському слові POSITION, тому, що POSITION — зарезервований ідентифікатор SQL.

CREATE UNIQUE INDEX ACTIVITIES_POSITION ON ACTIVITIES (ID_OWNER, POZITION);

Тригер UPDATE_ACTIVITIES оновлює значення полів, идентифицирующиз користувача який зробив останні зміни.

SET TERM !! ;

CREATE TRIGGER UPDATE_ACTIVITIES FOR ACTIVITIES.

BEFORE UPDATE AS.

BEGIN.

NEW.USER_NAME = USER;

NEW.CHANGE_DATE = «now «.

END!

SET TERM; !!

Нарешті, додано зовнішній індекс таблиці на себе. У описі таблиці це не можна сделать, т.к. ні поля ID_OWNER, ні поля ID_NUM, ні самій таблиці немає.

ALTER TABLE ACTIVITIES.

ADD.

FOREIGN KEY (ID_OWNER) REFERENCES ACTIVITIES (ID_NUM) ON DELETE CASCADE;

Далі, йде процедура переміщення рядки у шарі даних вгору чи низ. Припускається, що у шарі трохи більше 2 147 483 646 рядків.

SET TERM !! ;

CREATE PROCEDURE SET_ACTIVITIES_POSITION (OWNER_NUM INTEGER, OLD_POSITION INTEGER, NEW_POSITION INTEGER).

AS.

BEGINUPDATE ACTIVITIES.

SET.

POZITION = 2 147 483 647.

WHERE.

POZITION = :NEW_POSITION AND.

ID_OWNER = :OWNER_NUM;

UPDATE ACTIVITIES.

SET.

POZITION = :NEW_POSITION.

WHERE.

POZITION = :OLD_POSITION AND.

ID_OWNER = :OWNER_NUM;

UPDATE ACTIVITIES.

SET.

POZITION = :OLD_POSITION.

WHERE.

POZITION = 2 147 483 647 AND.

ID_OWNER = :OWNER_NUM;

END!

SET TERM; !!

Не вистачає лише триггера для початкового встановлення значення поля POZITION. Гадаю, що ви зможете самостійно створити тригер як проби сил.

Работа з событиями

Це зовсім просто:

SET TERM !! ;

CREATE TRIGGER CHANGE_ACTIVITIES FOR ACTIVITIES.

AFTER UPDATE POSITION 0 AS.

BEGIN.

POST_EVENT «Update Activities ! » ;

END!

SET TERM; !!

Залишилося тільки зареєструвати це події додатку користувача, і коли вона відбудеться сервері, то додаток користувача його отримає. Так, наприклад, стежити змінами курсів валют біржі. При зміні курсу, клієнт отримує подія і пере відкриває запит, аби побачити изменения.

Работа з исключениями

Спочатку, виняток слід визначити в БД.

CREATE EXCEPTION DELETE_MAIN_PARENT «DO NOT DELETE THIS RECORD ! THIS RECOCT IS PARENT FOR ALL RECORDS. » ;

Далі, слід визначити тригер, який впіймає виняткову ситуацію. Наприклад, під час видалення головного вузда дерева, піде вся БД повністю. Зрозуміло, що таке не має. Давайте спіймаємо це виняток.

SET TERM !! ;

CREATE TRIGGER CHECK_DELETE_TYPES FOR ACTIVITIES.

BEFORE DELETE POSITION 0 AS.

BEGIN.

IF (ACTIVITIES.ID_NUM = ACTIVITIES. ID_OWNER) THEN.

EXCEPTION DELETE_MAIN_PARENT;

END!

SET TERM; !!

Якщо виняткова ситуація настане, то користувачеві щось залишиться зробити, інакше як скасувати транзакцию.

Процедуры, триггеры

Поняття процедур і тригерів має, колись всього, асоціюватися з визначенням бизнес-логика. Процедури реалізують документований інтерфейс до даних в БД, а тригери — перевірку коректності впроваджуються даних, і залаштунковий роботу. Якщо в Вас є можливість перекласти всю бизнес-логику на сервер як тригерів і процедур, те й треба чинити. Навіть якщо взяти Ви у програмі контролюєте правильність впроваджуються даних, не забудьте в БД продублювати це ж у триггере. Такий їхній підхід гарантує, що під час написання додаткового модуля або ще однієї програми, що оперує з даними БД, Вам вдасться порушити правила роботи з цими. Гадаю, що прикладів тригерів і процедур було чимало. Але, початківці програмісти часто зрікаються використання цього наймогутнішого механізму БД з за прикрих помилок в синтаксисі запитів. Їм, що у додатку користувача легше зробити те саме саме, при цьому й працює воно швидше… Це оману. Одна річ, коли ви пишете і тестируете програму локально, і зовсім інше, коли до БД підключені користувачі. Ніяка програма зробить зміни у БД як і швидко і коректно, як вбудовані механізми. І тоді вони працюватимуть локально, а ваша програма — через мережу. Тому мені дам без коментарів приклад процедури з велику кількість операторів. На цьому прикладу стане зрозуміло де ставити, чи немає точки з комами, двокрапки тощо. Гадаю, що це Вам в Ваших розробках.

SET TERM !! ;

CREATE PROCEDURE CHECK_USER_SECURITY (ID_USER INTEGER, ID_DOC INTEGER, UP_TREE INTEGER).

RETURNS (IS_SHOW CHAR (1), IS_EDIT CHAR (1), IS_APPEND CHAR (1), IS_DELETE CHAR (1)).

AS.

DECLARE VARIABLE TREE_NUMBER INTEGER;

DECLARE VARIABLE TREE_OWNER INTEGER;

DECLARE VARIABLE USER_NUM INTEGER;

DECLARE VARIABLE DOC_NUM INTEGER;

DECLARE VARIABLE EDITING CHAR (1);

DECLARE VARIABLE APPENDING CHAR (1);

DECLARE VARIABLE DELETING CHAR (1);

BEGINIS_EDIT = «F » ;

IS_APPEND = «F » ;

IS_DELETE = «F » ;

IS_SHOW = «F » ;

FOR SELECT ID_NUM, ID_OWNERFROM DATA_LIST.

WHERE DATA_LIST.ID_NUM = :ID_DOC.

INTO TREE_NUMBER, TREE_OWNER.

DO.

BEGIN.

IF (TREE_NUMBER = UP_TREE) THEN EXIT;

FOR SELECT ID_USER, ID_DOC, IS_EDIT, IS_APPEND, IS_DELETE.

FROM DOCS_USERS.

WHERE DOCS_USERS.ID_USER = :ID_USER.

INTO USER_NUM, DOC_NUM, EDITING, APPENDING, DELETING.

DO.

BEGIN.

IF (TREE_NUMBER = DOC_NUM) THEN.

BEGIN.

IS_EDIT = EDITING;

IS_APPEND = APPENDING;

IS_DELETE = DELETING;

IS_SHOW = «T » ;

EXIT;END.

END.

ID_DOC = TREE_OWNER;END.

END!

SET TERM; !!

Цю процедуру використовується сервером додатків для перевірки прав користувача в таблиці як ієрархічного дерева. Зрозуміло, визначити права користувача до окремому записі стандартними шляхами не можна, тож уся БД працює під керівництвом серверу додатків і з допомогою DCOM дає інтерфейси клієнтам. Т.к. сервер додатків запущено у адресному просторі серверу, такий підхід до Security можна вважати оправданным.

UDF функции

Зазвичай, тут дають приклад, як вважати якусь математичну формулу, й повернути її результат як стовпчик відповіді на запит. А я вирішив показати приклад із рядками, т.к. це перше, тоді зазвичай вперше спотикається. Це приклад. У реальної БД такого бути не роблять. Отже, додамо в таблицю ACTIVITIES полі TREE_INFO VARCHAR (255). Будемо у ньому зберігати шлях від головного вузла. Цей шлях найпростіше будувати в триггере по додаванню запис у таблицю. Однак саме рядок з шляхом створюватиметься в DLL. Спочатку оголосимо нащу функцію в DLL:

DECLARE EXTERNAL FUNCTION CREATEPATH (CSTRING (256), INTEGER).

RETURNS CSTRING (256).

ENTRY_POINT «CreatePath «.

MODULE_NAME «UDF_INCL » ;

Ми показали ім'я в БД, передані переметры, яке значення, ім'я в DLL, й ім'я самої DLL. Ця бібліотека повинна перебуває у каталозі UDF. Я це D: Program FilesBorlandInterBaseUDF. А використовувати функцію будемо так:

SET TERM !! ;

CREATE TRIGGER INSERT_ACTIVITIES FOR ACTIVITIES.

BEFORE INSERT.

AS.

DECLARE VARIABLE PATH_TREE VARCHAR (256);

BEGIN.

SELECT TREE_INFO.

FROM ACTIVITIESWHERE (NEW.ID_OWNER = ID_NUM).

INTO PATH_TREE;

NEW.TREE_INFO = CREATEPATH (PATH_TREE, NEW. ID_NUM);

END!

SET TERM; !!

У InterBase все UDF передають у параметрах посилання, тому рядок передають як покажчик. Використовуються VARCHAR рядки, т.к. вони року доповнюються прогалинами до максимальної довжини. Інакше, Ви вже нічого до неї не додали. Ось реалізація DLL в Delphi:

library UDF_INCL;

// Copyright 2000 Bannikov N.A. Stikriz Technology.

uses.

SysUtils,.

Classes;

{$R *.RES}.

function CreatePath (MainPath: PChar; var IntVal: LongInt): PChar; cdecl; export;

begin.

Result:=PChar (AnsiString (MainPath)+IntToStr (IntVal)+ «»);

end;

exports.

CreatePath;

begin.

end.

Список литературы

Банников Н. А. Створення баз даних в InterBase SQL Server.

Для підготовки даної роботи було використані матеріали із сайту internet .

Показати весь текст
Заповнити форму поточною роботою