Реализация системного каталога. Основные хранимые характеристики: отношения, атрибуты с типами связи, индексы
Создание программы средствами языка Delphi, реализующей системный каталог информации базы данных, его характеристики: отношения, атрибуты с типами, связи, индексы. Разработка подпрограмм для ввода таблиц, полей и ключей и приложения для вывода данных.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 12.08.2011 |
Размер файла | 196,1 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Курсовая работа
по дисциплине
Базы данных
тема:
Реализация системного каталога. Основные хранимые характеристики: отношения, атрибуты с типами, связи, индексы
Содержание
- Введение
- 1. Постановка задачи
- 2. Описание решения
- 3. Описание интерфейса приложения
- Заключение
- Список использованной литературы
- Приложение А (обязательное)- Листинг программы
- Введение
Одной из функций СУБД является обеспечение функции системного каталога или словаря данных. Системный каталог -- это набор таблиц и представлений, содержащих важную информацию о базе данных. Системный каталог имеется в любой базе данных. Информация в системном каталоге определяет структуру всей базы данных. Системный каталог фактически является частью базы данных. Системный каталог “содержит данные о данных” - метаданные, т.е. определения других объектов системы. Системный каталог может быть интегрирован в определяемую им базу данных, а значит, должен содержать описание самого себя.
Системный каталог в зависимости от реализации может делиться на логичные группы, чтобы обеспечить доступ к соответствующей информации не только администратору базы данных, но и другим заинтересованным пользователям. Например, пользователю может понадобиться информация о предоставленных ему привилегиях, но совсем не обязательно знать о внутренней структуре или внутренних процессах базы данных. Пользователь, как правило, обращается к системному каталогу за информацией о своих собственных объектах и привилегиях, а администратору базы данных может потребоваться информация о структуре любого объекта и информация о любом событии в базе данных. В некоторых реализациях в системном каталоге имеются такие объекты, которые оказываются доступными только для администратора базы данных.
Каталог состоит из таблиц. Их называют системными таблицами для отличия от обычных пользовательских. В результате пользователь может обращаться к каталогу так же, как к своим данным. Например, в каталоге обычно содержатся системные таблицы TABLES и COLUMNS, назначение которых - описание известных системе таблиц и столбцов этих таблиц.
Содержимое системного каталога может включать информацию по следующим разделам:
· учетные записи пользователей и установки по умолчанию;
· привилегии и другая связанная с безопасностью информация;
· статистика, характеризующая производительность системы;
· размеры объектов;
· динамика роста объектов;
· структура таблиц и параметры их хранения;
· структура индексов и параметры их хранения;
· информация о других объектах базы данных, в частности, представлениях, синонимах, триггерах, сохраненных процедурах;
· ограничения для таблиц и информация о ссылочной целостности данных;
· пользовательские сеансы доступа;
· информация об аудитах;
· внутренние параметры базы данных;
· размещение файлов базы данных;
Системный каталог управляется сервером базы данных. При создании таблицы сервер базы данных вставляет данные об этом в соответствующую таблицу или представление каталога. При изменении пользователем структуры своей таблицы соответствующие объекты словаря данных тоже обновляются.
Таким образом, системный каталог является главным источником информации о структуре и природе базы данных. Он помогает содержать базу данных в порядке не только администратору базы данных и ее пользователям, но и серверу базы данных.
Целью данной работы является создание программы, реализующей системный каталог. Для достижения этой цели были поставлены следующие задачи:
· написание подпрограмм, реализующих ввод таблиц, полей и ключей;
· написание подпрограмм, создающих системный каталог;
· создание приложения, позволяющего добавлять таблицы, поля и ключи, а также выводить данные из системного каталога;
1. Постановка задачи
Задача данной курсовой работы заключается в реализации системного каталога, основными хранимыми характеристиками которого являются отношения, атрибуты с типами, связи, индексы. Кроме того необходимо реализовать интерфейс для других работ, а именно для введения таблиц (отношений), полей таблиц, ключей (первичный и внешние).
Программа должна быть реализована средствами языка Delphi.
2. Описание решения
Содержимое каталога состоит из следующих файлов: файл таблиц, файл полей, файл ключей, файл индексов.
Файл таблиц - tables.txt, состоит из строк, в каждой из которых находится имя таблицы.
Файл полей - field.txt, состоит из строк, каждая из которых имеет следующий формат:
<Имя таблицы>|<Имя поля>|<Тип данных>|<Длина типа данных>
Файл ключей - keys.txt, состоит из строк, каждая из которых имеет структуру следующего вида:
<Имя таблицы>|<Первичный ключ>|<Внешний ключ 1>|
При этом Внешний ключ состоит из пар вида:
<Foreign>|<References>
Файл индексов - index.txt, состоит из строк следующего вида:
<Имя индекса>|<Имя таблицы>|<Имя поля>|
Модуль MyFunction содержит процедуры и функции необходимые для работы с системным каталогом. Процедуры AddTable, AddField, AddKey, AddIndex осуществляют запись таблиц, полей, ключей и индексов в соответствующие файлы, на основании введенных пользователем данных. Процедура AddTable реализована следующим образом.
procedure AddTable(NameTable: string);
begin
AssignFile(Tables,PathToTables);
append(Tables);
WriteLn(Tables,NameTable);
CloseFile(Tables);
end;
В качестве входного параметра выступает имя таблицы. Далее следует обращение к стандартным процедурам AssignFile и Append. AssignFile связывает файловую переменную с именем файла, Append - инициирует запись в существующий файл. Процедуры AddField, AddIndex реализованы анадогично.
Процедура AddKey позволяет вводить первичные ключи и внешние ключи, в зависимости от выбора режима пользователем. Переменная Logic типа boolean показывает, осуществлялись ли ранее записи в файл. Алгоритм этой процедуры представлен на рисунке 1.
Функции InTable, InField, InKey имеют выходное значение типа boolean. Они проверяют наличие соответствующего элемента во введенных данных.
Функции InTable в качестве параметра получает имя таблицы, наличие которой в файле Tables необходимо проверить. Далее выполняются процедуры открытия файла, считывается строка из файла и проверяется ее совпадение с входным параметром. В случае совпадения их значений функция принимает значение True, иначе - False.
Функция InField имеет два параметра: имя таблицы NameTable и имя поля NameField. Данная функция работает следующим образом. Получаем стоку из файла Field. Вид этой строки таков, что сначала записано имя таблицы, а затем принадлежащее ей поле с указанием типа и его размера. Проверяем равенство входного параметра NameTable и первых символов строки, содержащих имя поля, в случае равенства проверяем также соответствие параметра NameField имени поля в данной строке файла. Таким образом просматриваем все строки файла. Функция принимает значение True в том случае если оба параметра совпали с информацией в строке файла.
Функция InKey проверяет существования ключа у таблицы. Имеет 2 входных параметра: NameTable и Why. Результат функции формируется следующим образом. В случае обнаружения в файле Keys записи соответствующей паре значений NameTable и Why функция возвращает значение True, которое свидетельствует о наличии первичного либо внешнего ключа у таблицы. В противном случае возвращается значение False, что говорит об отсутствии ключа с данным именем у таблицы.
Эти функции используются для проверки корректности ввода данных пользователем.
Значения функций FSpisokTables, FSpisokField, FSpisokKeys типа string содержат строку с содержимым соответствующего файла. Формат возвращаемого результата этих функций следующий: каждая строка файла отделена от последующей знаком &. Все эти функции реализованы аналогичным образом. Схема функций представлена на рисунке 2.
Функция FPrintStr возвращает содержимое каталога строкой. В этой строке последовательно представлена информация каталога по каждой таблице, разделенная знаком &. Алгоритм это функции представлен на рисунке 3.
Процедура PrintData использует функцию FPrintStr и на основе ее результата выводит все поля заданной пользователем таблицы в текстовую таблицу StringGrid. Алгоритм работы этой процедуры можно записать следующим образом:
1. SpisokPrint:= FPrintStr;
2. Находим информацию в строке SpisokPrint о требуемой таблице;
3. Заносим имя требуемой таблицы в StringGrid;
Рисунок 1 - Алгоритм процедуры AddKey
Размещено на http://www.allbest.ru/
Рисунок 2 - Схема функций FSpisokTables, FSpisokField, FSpisokKeys
4. Находим информацию о ключах таблицы и заносим в StringGrid;
5. В переменную Column заносим имена всех полей и записываем в таблицу StringGrid;
6. В переменную ColumnType заносим типы полей и записываем в таблицу StringGrid;
Процедура PrintTables выводит имена всех содержащихся в файле Tables.txt отношений и количество полей в каждом из них. Для реализации этой процедуры просматриваем строки файла Tables и выводим из в текстовую таблицу StringGrid.
Рисунок 3 - Алгоритм функции FPrintStr
Далее, просматривая строки файла Field считаем количество полей для каждой таблицы и эти значения также выводим в текстовую таблицу. PrintRelations - процедура, осуществляющая вывод в многострочное текстовое поле Memo информацию о связях между отношениями на основе содержимого файла Keys. Результат выполнения процедуры PrintIndex - вывод в StringGrid имени индекса и его принадлежность к полю и таблице. Работа данной процедуры основывается на просмотре информации файла Index.
3. Описание интерфейса приложения
Разработанное приложение имеет удобный интерфейс. На форме имеется меню, которое позволяет выбрать некоторое действие или выйти из программы. Пользователь может осуществлять следующие действия:
· добавить таблицу
· добавить поле
· добавить ключ
· просмотреть каталог
В случае выбора пункта меню Добавить -> Таблицу на форме появляются однострочное текстовое поле для ввода имени таблицы и кнопка Добавить. При нажатии на нее информация о новой таблице будет занесена в файл.
При выборе пункта меню Добавить -> Поле пользователю, с помощью раскрывающегося списка, предлагается выбрать таблицу, в которое будет добавляться поле, ввести имя поля, выбрать его тип и длину типа. Состояние флага Индекс говорит о наличии или отсутствии индекса для данного поля таблицы. Пример работы приложения в таком состоянии представлена на рисунке 4.
Рисунок 4 - Пример работы приложения
Выбор пункта меню Добавить -> Ключ позволяет выбирать пользователю таблицу, куда требуется добавить ключ и его тип. В случае добавления первичного ключа, требуется ввести имя поля, которое будет однозначно идентифицировать запись таблицы. В случае выбора внешнего ключа пользователь заполняет два поля Foreign(туда записывается имя поля - внешний ключ) и References (содержит имя таблицы).
Пункт меню Просмотр каталога предоставляет пользователю выбор вида выводимой информации. С помощью переключателей можно выбрать режим вывода информации из системного каталога. Пример просмотра каталога представлены на рисунках 5, 6.
Рисунок 5 - Просмотр системного каталога
Рисунок 6 - Просмотр полей системного каталога
Заключение
В данной курсовой работе стояла цель реализовать системный каталог со следующими основными хранимыми характеристиками: отношения, атрибуты с типами, связи, индексы, а также реализовать интерфейс для выполнения других работ. В соответствии с поставленными задачами получены следующие результаты:
· написаны подпрограммы, реализующие ввод таблиц, полей и ключей;
· написаны подпрограммы, создающие системный каталог;
· создано приложение, позволяющее добавлять таблицы, поля и ключи, а также выводить данные из системного каталога;
Поставленная в работе цель достигнута, все задачи выполнены полностью.
Список литературы
1. Швецов, В.И., Визгунов, А.Н., Мееров, И.Б. Базы данных [Текст]. - Учебное пособие. - Нижний Новгород: Издательство ННГУ, 2004.- 217 с.
2. Рыженков, Д.В. Курс лекций по дисциплине «Базы данных», 2009 г.
3. Дейт, К.Дж. Введение в системы баз данных, 6-е издание [Текст]: [пер. С англ.] /К.ДЖ. ДеЙт. - М. [и др.]: Вильямс, 2000. - 848 с.; 24 см. 4000 экз. - ISBN: 5-8459-0019-0.
системный каталог ввод атрибут
Приложение А (обязательное)
Листинг программы
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, Menus, MyFunction;
type
TForm1 = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem; //действие
N2: TMenuItem; //добавить
N3: TMenuItem; //таблицу
N4: TMenuItem; //поле
N5: TMenuItem; //ключ
N6: TMenuItem; //просмотр
N7: TMenuItem; //exit
StringGrid1: TStringGrid;
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
ComboBox1: TComboBox;
Label2: TLabel;
Edit2: TEdit;
Label3: TLabel;
ComboBox2: TComboBox;
Label4: TLabel;
Edit3: TEdit;
Label5: TLabel;
Edit4: TEdit;
Label6: TLabel;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
Memo1: TMemo;
RadioButton4: TRadioButton;
CheckBox1: TCheckBox;
Edit5: TEdit;
procedure N3Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure N4Click(Sender: TObject);
procedure ComboBox1DropDown(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
procedure ComboBox2Change(Sender: TObject);
procedure ComboBox1Select(Sender: TObject);
procedure N5Click(Sender: TObject);
procedure ComboBox2Select(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure RadioButton1Click(Sender: TObject);
procedure RadioButton2Click(Sender: TObject);
procedure RadioButton3Click(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure RadioButton4Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N9Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
MyAction: integer;
Tables: TextFile; //Файл таблиц
Field: TextFile; //Файл полей
Keys: TextFile; //Файл ключей
Index:TextFile;
SpisokTables,SpisokField,SpisokKeys,Content,Temp,Temp1,Temp2, Temp3, Temp4:string;
NameTable, Primary, Foreign, Column, ColumnType,SpisokPrint: string;
Logic:boolean;
row: integer;
implementation
{$R *.dfm}
procedure ClearAll;
var i,j:integer;
begin
Form1.Label1.Visible:=false;
Form1.Label2.Visible:=false;
Form1.Label3.Visible:=false;
Form1.Label4.Visible:=false;
Form1.Label5.Visible:=false;
Form1.Label6.Visible:=false;
form1.Button1.Visible:=false;
form1.Edit1.Visible:=false;
form1.Edit2.Visible:=false;
form1.Edit3.Visible:=false;
form1.Edit4.Visible:=false;
form1.Edit5.Visible:=false;
Form1.Stringgrid1.Visible:=false;
form1.ComboBox1.Visible:=false;
form1.ComboBox2.Visible:=false;
form1.RadioButton1.Visible:=false;
form1.RadioButton2.Visible:=false;
form1.RadioButton3.Visible:=false;
form1.RadioButton4.Visible:=false;
form1.Memo1.Visible:=false;
form1.CheckBox1.Visible:=false;
end;
procedure TForm1.N3Click(Sender: TObject);
begin
ClearAll;
MyAction:=1;
Form1.Label1.Caption:='название таблицы';
Form1.Label1.Visible:=true;
form1.Edit1.Text:='';
form1.Edit1.Visible:=true;
form1.Button1.Visible:=true;
form1.Button1.Caption:='Добавить'
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ClearAll;
end;
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
ind:boolean;
Str,Temp1,Temp2:string;
begin
if (MyAction=1) then
begin
//Добавляем таблицу
if form1.Edit1.Text<>'' then
begin
AddTable(Form1.Edit1.Text);
ShowMessage('Таблица добавлена');
end
end
else
if (MyAction=2) then
//Добавляем поле
begin
if (ComboBox1.Text<>'Выбрать') and (Trim(Edit2.Text)<>'') and (ComboBox2.Text<>'Выбрать') then
begin
AddField(ComboBox1.Text, Edit2.Text, ComboBox2.Text, Edit3.Text);
ShowMessage('Поле добавлено');
end
else
MessageDlg('Не все поля заполнены', mtError, [mbOk], 0);
if CheckBox1.Checked=true and (edit5.Text<>'')then
begin
AddIndex(edit5.Text,ComboBox1.Text, Edit2.Text);
ShowMessage('Индекс добавлен');
end;
ClearAll;
end
else if (MyAction=3) then
begin
//Добавляем ключ
if (Trim(ComboBox1.Text)<>'Выбрать') and (Trim(ComboBox2.Text)='Primary') then
begin
if (Trim(ComboBox1.Text)<>'Выбрать') and (Trim(Edit3.Text)<>'') then
if not InKey(Trim(ComboBox1.Text), 'Primary') then
if InField(Trim(ComboBox1.Text), Trim(Edit3.Text)) then
begin
AddKey(Trim(ComboBox1.Text), Trim(Edit3.Text), '', '', 'Primary');
ShowMessage('Ключ добавлен');
end
else
MessageDlg('Указанного поля не найдено в таблице '+Trim(ComboBox1.Text), mtError, [mbOk], 0)
else
MessageDlg('Такой первичный ключ уже есть в таблице '+Trim(ComboBox1.Text), mtError, [mbOk], 0)
else
MessageDlg('Не все поля заполнены', mtError, [mbOk], 0);
end
else if (Trim(ComboBox2.Text)='Foreign') then
begin
if (Trim(ComboBox1.Text)<>'Выбрать') and (Trim(Edit3.Text)<>'') and (Trim(Edit4.Text)<>'') then
begin
if InField(Trim(ComboBox1.Text), Trim(Edit3.Text)) then
begin
i:=1;
Str:=Trim(Edit4.Text);
while i<=Length(Str) do if Str[i]<>'.' then inc(i) else break;
if i<Length(Str) then
begin
Temp1:=Copy(Str,1,i-1);
Temp2:=Copy(Str,i+1,Length(Str));
if InField(Temp1, Temp2) then
begin
AddKey(Trim(ComboBox1.Text), '', Trim(Edit3.Text), Trim(Edit4.Text), 'Foreign');
ShowMessage('Ключ добавлен');
end
else
MessageDlg('Указанного поля в References '+Temp2+' не найдено в таблице '+Temp1, mtError, [mbOk], 0)
end
else
MessageDlg('Неправльный формат поля References', mtError, [mbOk], 0)
end
else
MessageDlg('Указанного поля в Foreign не найдено в таблице '+Trim(ComboBox1.Text), mtError, [mbOk], 0)
end
else
MessageDlg('Не все поля заполнены', mtError, [mbOk], 0);
end;
ClearAll;
end
else if (MyAction=5) then
//изменяем имя таблицы
begin
AlterTable(Trim(ComboBox1.Text),edit2.Text) ;
end;
if radiobutton2.Checked=true then
begin
Content:=FPrintStr();
PrintData(Content,combobox1.Text, StringGrid1);
end;
end;
//добавляем поле
procedure TForm1.N4Click(Sender: TObject);
begin
ClearAll;
MyAction:=2;
form1.ComboBox1.Visible:=true;
Form1.Label1.Visible:=true;
Form1.Label1.Caption:='Таблица';
Form1.Label2.Visible:=true;
Form1.Label2.Caption:='Имя поля';
Form1.Label3.Visible:=true;
Form1.Label3.Caption:='Тип';
Form1.Label4.Visible:=true;
Form1.Label4.Caption:='Длина';
form1.Edit2.Visible:=true;
form1.Edit3.Visible:=true;
form1.Button1.Visible:=true;
form1.Button1.Caption:='Добавить';
form1.ComboBox2.Visible:=true;
form1.CheckBox1.Visible:=true;
ComboBox2.Items.Clear;
ComboBox2.Items.Add('int');
ComboBox2.Items.Add('char');
ComboBox2.Items.Add('varchar');
ComboBox2.Items.Add('double');
ComboBox2.Text:='Выбрать';
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
form1.Edit5.Visible:=true;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
ComboBox1.Text:='Выбрать';
end;
procedure TForm1.ComboBox2Change(Sender: TObject);
begin
ComboBox2.Text:='Выбрать';
end;
procedure TForm1.ComboBox1Select(Sender: TObject);
var
i, j, k, n, m: integer;
begin
if (MyAction=2) then
begin
//Читаем список полей
SpisokField:=FSpisokField;
// ComboBox2.Items.Clear;
i:=1;
j:=0;
Temp:='';
Content:='';
while i<=Length(SpisokField) do
begin
if (SpisokField[i]<>'&') then Content:=Content+SpisokField[i]
else
begin
k:=0;
while k<=Length(Content) do
begin
if Content[k]='|' then inc(j);
if (Content[k]='|') and (j=2) then
begin
Temp:=Copy(Content,1,k);
j:=1;
Temp1:='';
while j<=Length(Temp) do
begin
if Temp[j]<>'|' then Temp1:=Temp1+Temp[j]
else if Temp1=ComboBox1.Text then
begin
Temp1:=Temp1+'|';
Temp:=Copy(Temp,j+1,Length(Temp)-j-1);
ComboBox2.Items.Add(Temp);
Temp:='';
Temp1:='';
j:=Length(Temp);
end;
inc(j);
end;
Temp:='';
Temp1:='';
j:=0;
k:=Length(Content);
end;
inc(k);
end;
Content:='';
end;
inc(i);
end;
end;
end;
procedure TForm1.N6Click(Sender: TObject);
begin
ClearAll;
MyAction:=4;
Label5.Caption:='Просмотр данных';
Label5.Visible:=true;
form1.RadioButton1.Visible:=true;
form1.RadioButton2.Visible:=true;
form1.RadioButton3.Visible:=true;
form1.RadioButton4.Visible:=true;
end;
procedure TForm1.N7Click(Sender: TObject);
begin
form1.Close;
end;
procedure TForm1.N9Click(Sender: TObject);
begin
ClearAll;
MyAction:=5;
form1.ComboBox1.Visible:=true;
Form1.Label1.Visible:=true;
Form1.Label1.Caption:='Таблица';
Form1.Label2.Visible:=true;
Form1.Label2.Caption:='Новое Имя';
form1.Edit2.Visible:=true;
form1.Button1.Visible:=true;
end;
procedure TForm1.RadioButton1Click(Sender: TObject);
var i,j:integer;
begin
form1.Memo1.Visible:=false;
for i:=0 to Form1.StringGrid1.RowCount do
for j:=0 to Form1.StringGrid1.ColCount do
Form1.StringGrid1.Cells[i,j]:='';
StringGrid1.Visible:=true;
form1.StringGrid1.ColCount:=2;
Form1.StringGrid1.Cells[0,0]:='Таблица';
Form1.StringGrid1.Cells[1,0]:='Кол-во полей';
printTables(stringGrid1);
end;
procedure TForm1.RadioButton2Click(Sender: TObject);
var i,j:integer;
begin
form1.Memo1.Visible:=false;
combobox1.Visible:=true;
label1.Visible:=true;
form1.Button1.Visible:=true;
form1.Button1.Caption:='Показать';
for i:=0 to Form1.StringGrid1.RowCount do
for j:=0 to Form1.StringGrid1.ColCount do
Form1.StringGrid1.Cells[i,j]:='';
StringGrid1.Visible:=true;
form1.StringGrid1.ColCount:=5;
Form1.StringGrid1.Cells[0,0]:='Таблица';
Form1.StringGrid1.Cells[1,0]:='Поле';
Form1.StringGrid1.Cells[2,0]:='Тип';
Form1.StringGrid1.Cells[3,0]:='Primary';
Form1.StringGrid1.Cells[4,0]:='Foreign';
end;
procedure TForm1.RadioButton3Click(Sender: TObject);
begin
form1.Memo1.Visible:=true;
PrintRelations(Memo1);
end;
procedure TForm1.RadioButton4Click(Sender: TObject);
var i,j:integer;
begin
form1.Memo1.Visible:=false;
StringGrid1.Visible:=true;
form1.StringGrid1.ColCount:=3;
for i:=0 to Form1.StringGrid1.RowCount do
for j:=0 to Form1.StringGrid1.ColCount do
Form1.StringGrid1.Cells[i,j]:='';
Form1.StringGrid1.Cells[0,0]:='Индекс';
Form1.StringGrid1.Cells[1,0]:='Таблица';
Form1.StringGrid1.Cells[2,0]:='Поле';
printIndex(StringGrid1);
end;
procedure TForm1.N5Click(Sender: TObject);
begin
ClearAll;
MyAction:=3;
form1.ComboBox1.Visible:=true;
Form1.Label1.Visible:=true;
Form1.Label1.Caption:='Таблица';
Form1.Label3.Visible:=true;
Form1.Label3.Caption:='Тип';
form1.Button1.Visible:=true;
form1.Button1.Caption:='Добавить';
form1.ComboBox2.Visible:=true;
ComboBox2.Items.Clear;
ComboBox2.Items.Add('Foreign');
ComboBox2.Items.Add('Primary');
ComboBox2.Text:='Выбрать';
end;
//выбираем имя таблицы для заполнения поля
procedure TForm1.ComboBox1DropDown(Sender: TObject);
var
i, j, k, n, m: integer;
begin
if (MyAction=2)or (MyAction=3) or (MyAction=4) then
begin
SpisokTables:=FSpisokTables;
ComboBox1.Items.Clear;
i:=1;
Temp:='';
while i<=Length(SpisokTables) do
begin
if SpisokTables[i]<>'&' then Temp:=Temp+SpisokTables[i]
else
begin
ComboBox1.Items.Add(Temp);
Temp:='';
end;{else}
inc(i);
end; {while}
end; {if}
end; {pocedure}
procedure TForm1.ComboBox2Select(Sender: TObject);
begin
if (MyAction=3) then
begin
if (ComboBox2.Text='Primary') then
begin
label4.Visible:=true;
label4.Caption:='Primary';
edit3.Visible:=true;
label6.Visible:=false;
edit4.Visible:=false;
end {if}
else if (ComboBox2.Text='Foreign')
then
begin
label4.Visible:=true;
label4.Caption:='Foreign';
edit3.Visible:=true;
label6.Visible:=true;
label6.Caption:='References';
// label4.Caption:='Foreign';
edit4.Visible:=true;
end;{then}
end;{if}
end;
end.
unit MyFunction;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids;
procedure AddTable(NameTable: string);
procedure AddField(NameTable: string; NameField: string; NameType: string; LengthType: string);
procedure AddKey(NameTable: string; Primary: string; Foreign: string; References: string; Why: string);
procedure AddIndex(NameInd,NameTable,NameField:string);
function InTable(NameTable: string):boolean;
function InField(NameTable: string; NameField: string):boolean;
function InKey(NameTable: string; Why: string):boolean;
function FPrintStr():string;
procedure PrintData(PrintStr,name:string; StringGrid1:TStringGrid);
procedure printTables(StringGrid1:TStringGrid);
procedure PrintRelations(Memo1:Tmemo);
procedure PrintIndex(StringGrid1:TStringGrid);
function FSpisokTables:string;
function FSpisokField:string;
function FSpisokKeys:string;
function AlterTable(OldName: string; NewName: string):boolean;
const
PathToTables: string='syscatalog\tables.txt';
PathToField: string='syscatalog\field.txt';
PathToKeys: string='syscatalog\keys.txt';
PathToInd: string='syscatalog\index.txt';
var
Tables: TextFile; //Файл таблиц
Field: TextFile; //Файл полей
Keys: TextFile; //Файл ключей
Index:TextFile;
SpisokTables,SpisokField,SpisokKeys,Content,Temp,Temp1,Temp2, Temp3, Temp4:string;
NameTable, Primary, Foreign, Column, ColumnType,SpisokPrint: string;
Logic:boolean;
row: integer;
implementation
procedure AddTable(NameTable: string);
begin
AssignFile(Tables,PathToTables);
append(Tables);
WriteLn(Tables,NameTable);
CloseFile(Tables);
end;
procedure AddField(NameTable: string; NameField: string; NameType: string; LengthType: string);
begin
AssignFile(field, PathToField);
append(field);
Temp:=Trim(NameTable)+'|'+Trim(NameField)+'|'+Trim(NameType)
+'|'+Trim(LengthType);
WriteLn(field, Temp);
CloseFile(field);
end;
procedure AddKey(NameTable: string; Primary: string; Foreign: string; References: string; Why: string);
var
i: integer;
begin
Logic:=false;
AssignFile(Keys, PathToKeys);
append(Keys);
SpisokKeys:='';
while not eof(Keys) do
begin
ReadLn(Keys, Content);
i:=1;
Temp:='';
while i<=Length(Content) do
begin
if (Content[i]<>'|') then Temp:=Temp+Content[i];
if (Content[i]='|') then
begin
if NameTable<>Temp then SpisokKeys:=SpisokKeys+Content+'&'
else if (Why='Primary') and (NameTable=Temp) then begin SpisokKeys:=SpisokKeys+NameTable+'|'+Primary+'|'+Copy(Content,i+1,Length(Content)-i)+'&'; Logic:=true; end
else if (Why='Foreign') and (NameTable=Temp) then begin SpisokKeys:=SpisokKeys+Content+'|'+Foreign+'|'+References+'&'; Logic:=true; end;
Temp:='';
i:=Length(Content);
end;
inc(i);
end;
end;
if not Logic then
begin
if Why='Primary' then
SpisokKeys:=SpisokKeys+NameTable+'|'+Primary+'&'
else if Why='Foreign' then
SpisokKeys:=SpisokKeys+NameTable+'|'+Foreign+'|'+References+'&';
end;
Rewrite(Keys);
i:=1;
Temp:='';
while i<=Length(SpisokKeys) do
begin
if SpisokKeys[i]<>'&' then Temp:=Temp+SpisokKeys[i]
else
begin
WriteLn(Keys, Temp);
Temp:='';
end;
inc(i);
end;
CloseFile(Keys);
end;
procedure AddIndex(NameInd,NameTable,NameField:string);
begin
Temp:='';
AssignFile(Index, PathToInd);
append(index);
Temp:=NameInd+'|'+NameTable+'|'+NameField ;
WriteLn(Index, Temp);
CloseFile(Index);
end;
//Существование таблицы
function InTable(NameTable: string):boolean;
begin
Logic:=false;
AssignFile(Tables, PathToTables);
Reset(Tables);
Content:='';
while not eof(Tables) do
begin
ReadLn(Tables, Temp);
if (NameTable=Temp) then Logic:=true
end;
CloseFile(Tables);
InTable:=Logic;
end;
//Существование поля в таблице
function InField(NameTable: string; NameField: string):boolean;
var
i, j, k, n, m: integer;
begin
AssignFile(Field, PathToField);
k:=0;
m:=0;
n:=1;
Temp:='';
while n<=Length(NameField) do
begin
if NameField[n]<>',' then Temp:=Temp+NameField[n];
if (NameField[n]=',') or (n=Length(NameField)) then
begin
inc(m);
Temp:=NameTable+'|'+Trim(Temp);
Reset(Field);
while not eof(Field) do
begin
ReadLn(Field, Content);
i:=1;
j:=0;
Temp1:='';
while i<=Length(Content) do
begin
if (Content[i]<>'|') and (j<>2) then Temp1:=Temp1+Content[i]
else if Content[i]='|' then begin Temp1:=Temp1+Content[i]; inc(j); end;
if (Content[i]='|') and (j=2) then
begin
if Temp1[Length(Temp1)]='|' then Temp1:=Copy(Temp1,1,Length(Temp1)-
1);
if Temp=Temp1 then inc(k);
Temp1:='';
i:=Length(Content);
end;
inc(i);
end;
end;
Temp:='';
CloseFile(Field);
end;
inc(n);
end;
if m=k then Logic:=true
else Logic:=false;
InField:=Logic;
end;
//Существование ключа в таблице
function InKey(NameTable: string; Why: string):boolean;
var
i, j, n:integer;
begin
Logic:=false;
AssignFile(Keys, PathToKeys);
reset(Keys);
SpisokKeys:='';
while (not eof(Keys)) and (not Logic) do
begin
ReadLn(Keys, Content);
i:=1;
j:=0;
Temp:='';
while i<=Length(Content) do
begin
if Content[i]<>'|' then Temp:=Temp+Content[i]
else if Content[i]='|' then
begin
if (Temp=NameTable) and (not Logic) then Logic:=true;
if Logic then inc(j);
end;
inc(i);
end;
end;
if (Logic) then
begin
if Why='Primary' then
begin
n:=j mod 2;
if n=1 then Logic:=true
else Logic:=false;
end
else if Why='Foreign' then
begin
if j>1 then Logic:=true
else Logic:=false;
end
end;
CloseFile(Keys);
InKey:=Logic;
end;
//Список таблиц
function FSpisokTables:string;
begin
AssignFile(Tables, PathToTables);
Reset(Tables);
SpisokTables:='';
while not eof(Tables) do
begin
ReadLn(Tables, Temp);
SpisokTables:=SpisokTables+Temp+'&';
end;
CloseFile(Tables);
FSpisokTables:=SpisokTables;
end;
//Список полей
function FSpisokField:string;
begin
AssignFile(Field, PathToField);
reset(Field);
SpisokField:='';
while not eof(Field) do
begin
ReadLn(Field, Temp);
SpisokField:=SpisokField+Temp+'&';
end;
CloseFile(Field);
FSpisokField:=SpisokField;
end;
//Список ключей
function FSpisokKeys:string;
begin
AssignFile(Keys, PathToKeys);
Reset(Keys);
SpisokKeys:='';
while not eof(Keys) do
begin
ReadLn(Keys, Temp);
SpisokKeys:=SpisokKeys+Temp+'&';
end;
CloseFile(Keys);
FSpisokKeys:=SpisokKeys;
end;
function FPrintStr():string;
var
i, j, k:integer;
begin
SpisokTables:=FSpisokTables;
i:=1;
Content:='';
SpisokPrint:='';
while i<=Length(SpisokTables) do
begin
if SpisokTables[i]<>'&' then Content:=Content+SpisokTables[i]
else
begin
SpisokPrint:=SpisokPrint+Content;
Logic:=false;
SpisokKeys:=FSpisokKeys;
j:=1;
Temp:='';
while j<=Length(SpisokKeys) do
begin
if (SpisokKeys[j]<>'&') then Temp:=Temp+SpisokKeys[j]
else
begin
k:=0;
while k<=Length(Temp) do
begin
if Temp[k]='|' then
begin
if Content=Copy(Temp,1,k-1) then
begin
Logic:=true;
SpisokPrint:=SpisokPrint+'|'+Copy(Temp,k+1,Length(Temp)-k)+'|'
end;
k:=Length(Temp);
end;
inc(k);
end;
Temp:='';
end;
inc(j);
end;
if not Logic then
SpisokPrint:=SpisokPrint+'|||';
SpisokPrint:=SpisokPrint+'$';
Logic:=false;
SpisokField:=FSpisokField;
j:=1;
Temp:='';
while j<=Length(SpisokField) do
begin
if (SpisokField[j]<>'&') then Temp:=Temp+SpisokField[j]
else
begin
k:=0;
while k<=Length(Temp) do
begin
if Temp[k]='|' then
begin
if Content=Copy(Temp,1,k-1) then
begin
Logic:=true;
SpisokPrint:=SpisokPrint+Copy(Temp,k+1,Length(Temp)-k)+'|$';
end;
k:=Length(Temp);
end;
inc(k);
end;
Temp:='';
end;
inc(j);
end;
if not Logic then
SpisokPrint:=SpisokPrint+'|||';
SpisokPrint:=SpisokPrint+'&';
Content:='';
end;
inc(i);
end;
FPrintStr:=SpisokPrint;
end;
//Выводим данные каталога в StringGrid
procedure PrintData(PrintStr,name:string; StringGrid1:TStringGrid);
var
i, j, k, n:integer;
begin
//Смотрим
row:=1;
SpisokPrint:=PrintStr;
i:=1;
Content:='';
while i<=Length(SpisokPrint) do
begin
if SpisokPrint[i]<>'&' then Content:=Content+SpisokPrint[i]
else
begin
NameTable:='';
Primary:='';
Foreign:='';
j:=1;
while j<=Length(Content) do if Content[j]<>'$' then inc(j) else break;
Temp3:=Copy(Content,1,j-1);
Temp4:=Copy(Content,j+1,Length(Content));
j:=1;
while j<=Length(Temp3) do if Temp3[j]<>'|' then inc(j) else break;
NameTable:=Copy(Temp3,1,j-1);
if NameTable=Name then
begin
Temp3:=Copy(Temp3,j+1,Length(Temp3));
if InKey(Trim(NameTable), 'Primary') then
begin
j:=1;
while j<=Length(Temp3) do if Temp3[j]<>'|' then inc(j) else break;
Primary:='primary key ('+Copy(Temp3,1,j-1)+')';
Temp3:=Copy(Temp3,j+1,Length(Temp3));
end;
j:=0;
k:=1;
Temp1:='';
Temp2:='';
while (k<=Length(Temp3)) do
begin
if (Temp3[k]<>'|') and (j mod 2 = 0) then Temp1:=Temp1+Temp3[k];
if (Temp3[k]<>'|') and (j mod 2 <> 0) then Temp2:=Temp2+Temp3[k];
if (Temp3[k]='|') or (k=Length(Temp3)) then begin Logic:=true; inc(j); end;
if (Logic) and (j mod 2 = 0) then
begin
if (Temp1<>'') and (Temp2<>'') then
Foreign:=Foreign+'foreign key ('+Temp1+') references '+Temp2+' ';
Logic:=false;
end;
if (Temp3[k]='|') and (j mod 2 = 0) then begin Temp1:=''; Temp2:=''; end;
inc(k);
end;
Content:=Temp4;
StringGrid1.Cells[0,row]:=NameTable;
StringGrid1.Cells[3,row]:=Primary;
StringGrid1.Cells[4,row]:=Foreign;
StringGrid1.RowCount:=row+1;
//Собираем поля
Logic:=false;
Temp:='';
n:=1;
while n<=Length(Content) do
begin
if Content[n]<>'$' then Temp:=Temp+Content[n]
else
begin
Logic:=true;
j:=0;
k:=1;
Column:='';
ColumnType:='';
while k<=Length(Temp) do
begin
if Temp[k]='|' then
begin
inc(j);
if j=1 then Column:=Copy(Temp,1,k-1);
if (j=2) and (Copy(Temp,1,k-1)<>'') then ColumnType:=Copy(Temp,1,k-1);
if (j=3) and (Copy(Temp,1,k-1)<>'') then ColumnType:=ColumnType+' ('+Copy(Temp,1,k-1)+')';
Temp:=Copy(Temp,k+1,Length(Temp)-k);
k:=0;
end;
if j=3 then k:=Length(Temp);
inc(k);
end;
Temp:='';
StringGrid1.Cells[1,row]:=Column;
StringGrid1.Cells[2,row]:=ColumnType;
StringGrid1.RowCount:=row+1;
inc(row);
end;
inc(n);
end;
end;
if not Logic then inc(row);
Content:='';
end;
inc(i);
end;
end;
procedure printTables(StringGrid1:TStringGrid);
var i,j,n,count,rows:integer;
content:string;
begin
i:=1; j:=1; n:=1; count:=0; rows:=0;
SpisokTables:=FSpisokTables;
while i<=length(SpisokTables) do
begin
while SpisokTables[i]<>'&' do i:=i+1;
stringGrid1.Cells[0,j]:=copy(SpisokTables,n,i-n);
rows:=rows+1;
i:=i+1;
n:=i;
j:=j+1;
end;
j:=1;
i:=1;
for i:=1 to rows do
begin
AssignFile(Field, PathToField);
reset(Field);
while not eof (Field) do
begin
j:=1;
Readln(field,Content);
while (content[j]<>'|') and (i<=length(content)) do j:=j+1;
if StringGrid1.Cells[0,i]=copy(content,1,j-1) then
begin
count:=count+1;
end;
end;
stringGrid1.cells[1,i]:=inttostr(count);
count:=0;
CloseFile(Field);
end;
end;
procedure PrintRelations(Memo1:Tmemo);
var i,n:integer;
NameTable1,NameTable2,primary1,primary2,s:string;
f:boolean;
begin
AssignFile(Keys, PathToKeys);
reset(Keys);
while not eof (keys) do
begin
f:=false;
readln(keys,content);
for i:=1 to length(content) do
if content[i]='.' then f:=true;
if f=true then
begin
i:=1;n:=i;
NameTable1:=''; NameTable2:='';primary1:='';primary2:='';
foreign:='';
while (content[i]<>'|') and (i<=length(content)) do i:=i+1;
NameTable1:=copy(content,n,i-n);
i:=i+1; n:=i;
while (content[i]<>'|') and (i<=length(content)) do i:=i+1;
primary1:=copy(content,n,i-n);
i:=i+1; n:=i;
while (content[i]<>'|') and (i<=length(content)) do i:=i+1;
foreign:=copy(content,n,i-n);
i:=i+1; n:=i;
while (content[i]<>'.') and (i<=length(content)) do i:=i+1;
NameTable2:=copy(content,n,i-n);
i:=i+1; n:=i;
while i<=length(content) do i:=i+1;
primary2:=copy(content,n,i-n);
i:=i+1; n:=i;
s:='Таблица '+NameTable1+' ('+primary1+' - primary key'+')'
+' связана внешним ключом '+ foreign+ ' с таблицей '+NameTable2+' ('
+ primary2+' - primary key)';
memo1.Lines.Add(s);
memo1.Lines.Add('');
s:='';
end;
end;
closeFile(keys);
end;
procedure PrintIndex(StringGrid1:TStringGrid);
var i,n,rows:integer;
content:string;
begin
AssignFile(Index, PathToInd);
reset(Index);
rows:=1;
while not eof(index) do
begin
i:=1; n:=i;
readln(Index,Content);
while content[i]<>'|' do i:=i+1;
StringGrid1.Cells[0,rows]:= copy(content,n,i-n);
i:=i+1; n:=i;
while content[i]<>'|' do i:=i+1;
StringGrid1.Cells[1,rows]:= copy(content,n,i-n);
i:=i+1; n:=i;
while i<=length(content) do i:=i+1;
StringGrid1.Cells[2,rows]:= copy(content,n,i-n);
i:=i+1; n:=i;
rows:=rows+1;
end;
end;
//Изменение таблицы
function AlterTable(OldName: string; NewName: string):boolean;
var
i:integer;
begin
Logic:=false;
AssignFile(Tables, PathToTables);
Reset(Tables);
Content:='';
while not eof(Tables) do
begin
ReadLn(Tables, Temp);
if (OldName<>Temp) then Content:=Content+Temp+'|'
else begin Content:=Content+NewName+'|'; Logic:=true; end;
end;
CloseFile(Tables);
Rewrite(Tables);
i:=1;
Temp:='';
while i<=Length(Content) do
begin
if Content[i]<>'|' then Temp:=Temp+Content[i]
else
begin
WriteLn(Tables, Temp);
Temp:='';
end;
inc(i);
end;
CloseFile(Tables);
//Изменяем в списке полей
AssignFile(Field, PathToField);
Reset(Field);
SpisokField:='';
while not eof(Field) do
begin
ReadLn(Field, Content);
i:=1;
Temp:='';
while i<=Length(Content) do
begin
if Content[i]<>'|' then Temp:=Temp+Content[i]
else
begin
if OldName<>Temp then SpisokField:=SpisokField+Content+'&'
else SpisokField:=SpisokField+NewName+Copy(Content, i, Length(Content)-i+1)+'&';
Temp:='';
i:=Length(Content);
end;
inc(i);
end;
end;
CloseFile(Field);
Rewrite(Field);
i:=1;
Temp:='';
while i<=Length(SpisokField) do
begin
if SpisokField[i]<>'&' then Temp:=Temp+SpisokField[i]
else
begin
WriteLn(Field, Temp);
Temp:='';
end;
inc(i);
end;
CloseFile(Field);
//Изменяем в списке ключей
AssignFile(Keys, PathToKeys);
Reset(Keys);
SpisokKeys:='';
while not eof(Keys) do
begin
ReadLn(Keys, Content);
i:=1;
Temp:='';
while i<=Length(Content) do
begin
if Content[i]<>'|' then Temp:=Temp+Content[i]
else
begin
if OldName<>Temp then SpisokKeys:=SpisokKeys+Content+'&'
else SpisokKeys:=SpisokKeys+NewName+Copy(Content, i, Length(Content)-i+1)+'&';
Temp:='';
i:=Length(Content);
end;
inc(i);
end;
end;
CloseFile(Keys);
Rewrite(Keys);
i:=1;
Temp:='';
while i<=Length(SpisokKeys) do
begin
if SpisokKeys[i]<>'&' then Temp:=Temp+SpisokKeys[i]
else
begin
WriteLn(Keys, Temp);
Temp:='';
end;
inc(i);
end;
CloseFile(Keys);
AlterTable:=Logic;
end;
end.
Размещено на Allbest.ru
Подобные документы
Сущности и функциональные зависимости базы данных. Атрибуты и связи. Таблицы базы данных. Построение ER-диаграммы. Организация ввода и корректировки данных. Реляционная схема базы данных. Реализация запросов, получение отчетов. Защита базы данных.
курсовая работа [2,4 M], добавлен 06.02.2016Проектирование и создание информационной базы данных для управления предприятием "Завод металлоизделий". Данные для базы, предметная область, атрибуты объектов базы данных. Объектные отношения, их ключи, связи объектов и отношений базы данных предприятия.
реферат [26,9 K], добавлен 04.12.2009Особенности модификации таблиц базы данных средствами СУБД Access. Описание свойств полей, задания ограничений, масок ввода данных. Создание и модификации таблиц, установка их свойств. Схема связи таблиц. Представление результатов задания в виде таблицы.
лабораторная работа [243,5 K], добавлен 13.06.2014Теоретические основы разработки приложения для автоматизации данных по Олимпиаде. Основные свойства объектов, связей, их атрибуты. Создание отчета на примере "спортсмены занявшие места с 1 по 3". Структура запросов, таблиц базы данных в Microsoft Access.
курсовая работа [1,1 M], добавлен 09.12.2013Создание базы данных и таблиц. Определение таблиц и информации, которую они будут содержать. Определение индексированных полей и организации связи между ними. Создание формы в окне базы данных. Создание отчета "Список улиц". Выбор внешнего вида макета.
контрольная работа [1,4 M], добавлен 11.04.2012Создание инфологической и даталогической модели базы данных, которые отображают сущности и атрибуты, отношения и поля. Разработка информационной системы учета пролеченных в дневном стационаре (DSP) с помощью СУБД MS Access и среды разработки Delphi 7.
курсовая работа [1,5 M], добавлен 03.07.2012Понятие баз данных и принципы проектирования информационных систем. Разработка программы для отслеживания финансовой стороны работы компании в среде Delphi 7. Создание таблиц и схемы данных. Разработка клиентского приложения и процедуры добавления данных.
курсовая работа [1,4 M], добавлен 25.04.2012Процесс разработки базы данных для хранения и обработки информации. Ключи, индексы, триггеры, хранимые процедуры. Разработка пользовательского интерфейса и базы данных. Основные инструментальные средства для разработки клиентской и серверной частей.
дипломная работа [225,0 K], добавлен 18.05.2013Сущность и характеристика типов моделей данных: иерархическая, сетевая и реляционная. Базовые понятия реляционной модели данных. Атрибуты, схема отношения базы данных. Условия целостности данных. Связи между таблицами. Общие представления о модели данных.
курсовая работа [36,1 K], добавлен 29.01.2011Правила создания баз данных в Access. Основы строения таблиц базы "Оператор сотовой связи" с помощью Конструктора; изучение их связи. Определение полей и типов данных. Создание параметрических универсальных запросов, главной кнопочной формы и отчетов.
курсовая работа [1,7 M], добавлен 22.04.2014