пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я...

13
© 2013 Радослава Кралева 1 ЮГОЗАПАДЕН УНИВЕРСИТЕТ ,,НЕОФИТ РИЛСКИ” БЛАГОЕВГРАД Проект № BG051PO001-3.1.07-0036 ,,Актуализиране на учебните програми в Природо-математически факултет на ЮЗУ ,,Неофит Рилски“ в съответствие с изискванията на пазара на труда“ Проектът се осъществява с финансовата подкрепа на Оперативна програма „Развитие на човешките ресурси“, съфинансирана от Европейския социален фонд на Европейския съюз Инвестира във вашето бъдеще! Упражнение 8: СЪЗДАВАНЕ НА СЪРВЪРНИ И КЛИЕНТСКИ ПРИЛОЖЕНИЯ ЗА РАБОТА С БАЗИ ОТ ДАННИ С ТЕХНОЛОГИЯТА DATASNAP Радослава Кралева В настоящето упражнение ще бъде представено поетапното разработване на едно многослойно приложение за работа с бази от данни. Ще бъде използвана класическа трислойна архитектура, съставена от сървър за бази от данни (в случая MS SQL Server), приложен сървър (използван на средния слой за управление на бизнес правилата, в случая DataSnap сървър (AppServer)) и "тънко" клиентско Windows приложение (Ex8ClientApp), което ще предоставя пълни възможности за работа с данните. На Фиг. 8.1 е представена принципна схема на разработеното приложение с трислойна архитектура. Фигура 8.1: Принципна схема на разработеното приложение. Примерна сесия на работа с AppServer и приложението Ex8ClientApp е показана на Фиг. 8.2 и Фиг. 8.3. Фигура 8.2: Примерна сесия на работа с AppServer. Сървър за бази от данни MS SQL Server Приложен сървър (AppServer.exe) Клиентско приложение (Ex8ClientApp.exe)

Upload: others

Post on 04-Sep-2020

23 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я DATASNAPtimetable.swu.bg/lecture/WebSite_ProjectBG510PO001/...Проект BG051PO001-3.1.07-0036 ,,Актуализиране на

© 2013 Радослава Кралева 1

ЮГОЗАПАДЕН УНИВЕРСИТЕТ ,,НЕОФИТ РИЛСКИ” БЛАГОЕВГРАД

Проект № BG051PO001-3.1.07-0036

,,Актуализиране на учебните програми

в Природо-математически факултет на ЮЗУ ,,Неофит Рилски“

в съответствие с изискванията на пазара на труда“

Проектът се осъществява с финансовата подкрепа на Оперативна програма „Развитие на човешките

ресурси“, съфинансирана от Европейския социален фонд на Европейския съюз

Инвестира във вашето бъдеще!

Упражнение 8: СЪЗДАВАНЕ НА СЪРВЪРНИ И КЛИЕНТСКИ ПРИЛОЖЕНИЯ ЗА РАБОТА С БАЗИ ОТ ДАННИ С ТЕХНОЛОГИЯТА DATASNAP

Радослава Кралева В настоящето упражнение ще бъде представено поетапното разработване на едно многослойно приложение за работа с бази от данни. Ще бъде използвана класическа трислойна архитектура, съставена от сървър за бази от данни (в случая MS SQL Server), приложен сървър (използван на средния слой за управление на бизнес правилата, в случая DataSnap сървър (AppServer)) и "тънко" клиентско Windows приложение (Ex8ClientApp), което ще предоставя пълни възможности за работа с данните. На Фиг. 8.1 е представена принципна схема на разработеното приложение с трислойна архитектура.

Фигура 8.1: Принципна схема на разработеното приложение.

Примерна сесия на работа с AppServer и приложението Ex8ClientApp е показана на Фиг. 8.2 и Фиг. 8.3.

Фигура 8.2: Примерна сесия на работа с AppServer.

Сървър за бази от

данни

MS SQL Server

Приложен

сървър

(AppServer.exe)

Клиентско

приложение

(Ex8ClientApp.exe)

Page 2: пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я DATASNAPtimetable.swu.bg/lecture/WebSite_ProjectBG510PO001/...Проект BG051PO001-3.1.07-0036 ,,Актуализиране на

© 2013 Радослава Кралева 2

Фигура 8.3: Примерна сесия на работа с приложението Ex8ClientApp.

Приложението Ex8ClientApp ще визуализира и ще предоставя възможност за редактиране на данни от таблицата Products част от базата от данни Northwind.

1. СЪЗДАВАНЕ НА ПРИЛОЖЕНИЕТО AppServer

А. Стартирайте RAD Studio и изпълнете следните стъпки:

Стъпка 1: От главното меню изберете File ► New ► VCL Forms Application – Delphi (или C++ Builder) в зависимост от езика, който искате да използвате.

Стъпка 2: От главното меню изберете File ► Save All... Задайте име на модула, който ще съдържа кода с имплементация на главната форма, което да бъде: MainUnit.pas (за Delphi) или MainUnit.cpp (за C++ Builder), а проектния файл запишете като: AppServer.dproj (за Delphi) или AppServer.cbproj (за C++ Builder). Стъпка 3: Задайте следните настройки за главната форма на приложението:

object AppSrvMainForm: TAppSrvMainForm

Left = 0

Top = 0

BorderIcons = [biSystemMenu, biMinimize]

BorderStyle = bsSingle

Caption = 'AppSrvMainForm'

ClientHeight = 51

ClientWidth = 231

Color = clBtnFace

Font.Charset = DEFAULT_CHARSET

Font.Color = clWindowText

Font.Height = -11

Font.Name = 'Tahoma'

Page 3: пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я DATASNAPtimetable.swu.bg/lecture/WebSite_ProjectBG510PO001/...Проект BG051PO001-3.1.07-0036 ,,Актуализиране на

© 2013 Радослава Кралева 3

Font.Style = []

OldCreateOrder = False

PixelsPerInch = 96

TextHeight = 13

end

Стъпка 4: От страницата Standard на палитрата с компоненти (Tool Palette) добавете един компонента от тип TLabel и го настроите, както е показано по-долу:

object Label1: TLabel

Left = 0

Top = 0

Width = 231

Height = 51

Align = alClient

Alignment = taCenter

Caption = 'Application Server'

Font.Charset = RUSSIAN_CHARSET

Font.Color = clWindowText

Font.Height = -19

Font.Name = 'Calibri'

Font.Style = [fsBold]

ParentFont = False

Layout = tlCenter

ExplicitWidth = 146

ExplicitHeight = 23

end

След като бъдат изпълнени стъпки от 1 до 4, главната форма сървърното приложение по време на проектиране, трябва да изглежда подобно на тази показана на Фиг. 8.3.

Фигура 8.4: Главната форма на сървърното приложение AppServer след приключване на етапа на проектиране.

Стъпка 5: От главното меню изберете File ► New ► Other... От появилата се диалогова кутия New Items, от секцията Item Categories: изберете категорията Delphi Projects и след това изберете подкатегорията Multitier. В десния панел изберете Remote Data Module и натиснете бутона OК. Ще се появи помощника Remote Data Module Wizard. В полето CoClass Name: въведете "Application Server" и натиснете бутона OK. Към проекта ще бъде добавен нов модул (в случая отдалечен модул за данни). От главното меню изберете Save и задайте име на модула, който ще съдържа кода с имплементация на отдалечения модул за данни, например: RemoteDataModuleUnit.pas (за Delphi) или RemoteDataModuleUnit.cpp (за C++ Builder).

Стъпка 6: От страницата dbExpress на палитрата с компоненти (Tool Palette) добавете един компонент TSQLConnection и го настроите, както е показано по-долу:

object SQLConnectionNorthwind: TSQLConnection

Page 4: пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я DATASNAPtimetable.swu.bg/lecture/WebSite_ProjectBG510PO001/...Проект BG051PO001-3.1.07-0036 ,,Актуализиране на

© 2013 Радослава Кралева 4

DriverName = 'MSSQL'

GetDriverFunc = 'getSQLDriverMSSQL'

LibraryName = 'dbxmss30.dll'

LoginPrompt = False

Params.Strings = (

'HostName=USER\SQLEXPRESS'

'DataBase=Northwind'

'User_Name='

'Password='

'BlobSize=-1'

'ErrorResourceFile='

'LocaleCode=0000'

'MSSQL TransIsolation=ReadCommited'

'OS Authentication=True'

'Prepare SQL=False')

VendorLib = 'oledb'

Connected = True

Left = 56

Top = 32

end

Стъпка 7: От страницата dbExpress на палитрата с компоненти (Tool Palette) добавете един компонент TSQLTable и го настроите, както е показано по-долу:

object SQLTablePRODUCTS: TSQLTable

MaxBlobSize = -1

SQLConnection = SQLConnectionNorthwind

TableName = 'PRODUCTS'

Left = 200

Top = 32

object SQLTablePRODUCTSProductID: TIntegerField

FieldName = 'ProductID'

Required = True

end

object SQLTablePRODUCTSProductName: TWideStringField

FieldName = 'ProductName'

Required = True

Size = 80

end

object SQLTablePRODUCTSSupplierID: TIntegerField

FieldName = 'SupplierID'

end

object SQLTablePRODUCTSCategoryID: TIntegerField

FieldName = 'CategoryID'

end

object SQLTablePRODUCTSQuantityPerUnit: TWideStringField

FieldName = 'QuantityPerUnit'

Size = 40

end

object SQLTablePRODUCTSUnitPrice: TFMTBCDField

FieldName = 'UnitPrice'

Precision = 19

Size = 4

end

object SQLTablePRODUCTSUnitsInStock: TSmallintField

FieldName = 'UnitsInStock'

end

object SQLTablePRODUCTSUnitsOnOrder: TSmallintField

Page 5: пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я DATASNAPtimetable.swu.bg/lecture/WebSite_ProjectBG510PO001/...Проект BG051PO001-3.1.07-0036 ,,Актуализиране на

© 2013 Радослава Кралева 5

FieldName = 'UnitsOnOrder'

end

object SQLTablePRODUCTSReorderLevel: TSmallintField

FieldName = 'ReorderLevel'

end

object SQLTablePRODUCTSDiscontinued: TBooleanField

FieldName = 'Discontinued'

Required = True

end

end

Стъпка 8: От страницата Data Access на палитрата с компоненти (Tool Palette) добавете един компонент TDataSetProvider и го настроите както е показано по-долу:

object DataSetProvider: TDataSetProvider

DataSet = SQLTablePRODUCTS

Left = 328

Top = 32

end

След като бъдат добавени и настроени всички компоненти към отдалечения модул за данни, неговата форма по време на проектиране, трябва да изглежда подобно на тази показана на Фиг. 8.5.

Фигура 8.5: Отдалечения модул за данни на сървърното приложение AppServer след приключване на етапа на проектиране.

Автоматично ще бъде генериран от средата метод с име UpdateRegistry за регистриране на приложния сървър. Съществената част от кода на RemoteDataModuleUnit е показан по-долу:

type

TApplicationServer = class(TRemoteDataModule, IApplicationServer)

...

protected

class procedure UpdateRegistry

(Register: Boolean; const ClassID, ProgID: string); override;

...

end;

...

class procedure TApplicationServer.UpdateRegistry;

begin

if Register then

begin

Page 6: пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я DATASNAPtimetable.swu.bg/lecture/WebSite_ProjectBG510PO001/...Проект BG051PO001-3.1.07-0036 ,,Актуализиране на

© 2013 Радослава Кралева 6

inherited UpdateRegistry(Register, ClassID, ProgID);

EnableSocketTransport(ClassID);

EnableWebTransport(ClassID);

end else

begin

DisableSocketTransport(ClassID);

DisableWebTransport(ClassID);

inherited UpdateRegistry(Register, ClassID, ProgID);

end;

end;

2. СЪЗДАВАНЕ НА ПРИЛОЖЕНИЕТО Ex8ClientApp

А. Стартирайте RAD Studio и изпълнете следните стъпки:

Стъпка 1: От главното меню изберете File ► New ► VCL Forms Application – Delphi (или C++ Builder) в зависимост от езика, който искате да използвате.

Стъпка 2: От главното меню изберете File ► Save All... Задайте име на модула, който ще съдържа кода с имплементация на главната форма, което да бъде: MainUnit.pas (за Delphi) или MainUnit.cpp (за C++ Builder), а проектния файл запишете като: Ex8ClientApp.dproj (за Delphi)

или Ex8ClientApp.cbproj (за C++ Builder). Стъпка 3: Задайте следните настройки за главната форма на приложението:

object MainForm: TMainForm

Left = 0

Top = 0

BorderIcons = [biSystemMenu]

BorderStyle = bsSingle

Caption = 'Ex8ClientApp'

ClientHeight = 441

ClientWidth = 511

Color = clBtnFace

Font.Charset = DEFAULT_CHARSET

Font.Color = clWindowText

Font.Height = -11

Font.Name = 'Tahoma'

Font.Style = []

OldCreateOrder = False

OnCreate = FormCreate

PixelsPerInch = 96

TextHeight = 13

end

Стъпка 4: От страницата Additional на палитрата с компоненти (Tool Palette) добавете два компонента от тип TShape. Настроите тези компоненти както е показано по-долу:

object Shape1: TShape

Left = 8

Top = 40

Width = 497

Height = 2

Page 7: пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я DATASNAPtimetable.swu.bg/lecture/WebSite_ProjectBG510PO001/...Проект BG051PO001-3.1.07-0036 ,,Актуализиране на

© 2013 Радослава Кралева 7

end

object Shape2: TShape

Left = 6

Top = 136

Width = 497

Height = 2

end

Стъпка 5: От страницата Standard на палитрата с компоненти (Tool Palette) добавете десет компонента от тип TLabel, и ги настроите както е показано по-долу:

object Label1: TLabel

Left = 8

Top = 48

Width = 48

Height = 13

Caption = 'ProductID'

FocusControl = DBEdit1

end

object Label2: TLabel

Left = 64

Top = 48

Width = 64

Height = 13

Caption = 'ProductName'

FocusControl = DBEdit2

end

object Label5: TLabel

Left = 304

Top = 48

Width = 77

Height = 13

Caption = 'QuantityPerUnit'

FocusControl = DBEdit5

end

object Label6: TLabel

Left = 64

Top = 88

Width = 42

Height = 13

Caption = 'UnitPrice'

FocusControl = DBEdit6

end

object Label7: TLabel

Left = 144

Top = 88

Width = 60

Height = 13

Caption = 'UnitsInStock'

FocusControl = DBEdit7

end

object Label8: TLabel

Left = 224

Top = 88

Width = 66

Height = 13

Caption = 'UnitsOnOrder'

FocusControl = DBEdit8

end

object Label9: TLabel

Left = 304

Top = 88

Width = 64

Height = 13

Caption = 'ReorderLevel'

FocusControl = DBEdit9

end

object Label10: TLabel

Left = 8

Top = 144

Width = 54

Height = 13

Caption = 'PRODUCTS'

FocusControl = DBEdit1

end

Стъпка 6: От страницата DataSnap на палитрата с компоненти (Tool Palette) добавете един компонент TDCOMConnection и го настроите, както е показано по-долу:

object DCOMConnection: TDCOMConnection

Connected = True

ServerGUID = '{...}'

ServerName = 'AppServer.ApplicationServer'

Left = 64

Top = 224

end

Page 8: пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я DATASNAPtimetable.swu.bg/lecture/WebSite_ProjectBG510PO001/...Проект BG051PO001-3.1.07-0036 ,,Актуализиране на

© 2013 Радослава Кралева 8

Стъпка 7: От страницата Data Access на палитрата с компоненти (Tool Palette) добавете един компонент TClientDataSet и един компонент TDataSource и ги настроите, както е показано по-долу (в реда в който са показани):

object ClientDataSetProducts: TClientDataSet

Aggregates = <>

Params = <>

ProviderName = 'DataSetProvider'

RemoteServer = DCOMConnection

Left = 64

Top = 280

object ClientDataSetProductsProductID: TIntegerField

FieldName = 'ProductID'

Required = True

end

object ClientDataSetProductsProductName: TWideStringField

FieldName = 'ProductName'

Required = True

Size = 80

end

object ClientDataSetProductsSupplierID: TIntegerField

FieldName = 'SupplierID'

end

object ClientDataSetProductsCategoryID: TIntegerField

FieldName = 'CategoryID'

end

object ClientDataSetProductsQuantityPerUnit: TWideStringField

FieldName = 'QuantityPerUnit'

Size = 40

end

object ClientDataSetProductsUnitPrice: TFMTBCDField

FieldName = 'UnitPrice'

Precision = 19

Size = 4

end

object ClientDataSetProductsUnitsInStock: TSmallintField

FieldName = 'UnitsInStock'

end

object ClientDataSetProductsUnitsOnOrder: TSmallintField

FieldName = 'UnitsOnOrder'

end

object ClientDataSetProductsReorderLevel: TSmallintField

FieldName = 'ReorderLevel'

end

object ClientDataSetProductsDiscontinued: TBooleanField

FieldName = 'Discontinued'

Required = True

end

end

object DataSourceProducts: TDataSource

DataSet = ClientDataSetProducts

Left = 64

Top = 336

end

Page 9: пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я DATASNAPtimetable.swu.bg/lecture/WebSite_ProjectBG510PO001/...Проект BG051PO001-3.1.07-0036 ,,Актуализиране на

© 2013 Радослава Кралева 9

Стъпка 8: От страницата Data Controls на палитрата с компоненти (Tool Palette) добавете девет компонента от тип TDBEdit и един компонент от тип TDBCheckBox и ги настроите, както е показано по-долу:

object DBEdit1: TDBEdit

Left = 8

Top = 64

Width = 49

Height = 21

DataField = 'ProductID'

DataSource = DataSourceProducts

TabOrder = 1

end

object DBEdit2: TDBEdit

Left = 64

Top = 64

Width = 233

Height = 21

DataField = 'ProductName'

DataSource = DataSourceProducts

TabOrder = 2

end

object DBEdit5: TDBEdit

Left = 304

Top = 64

Width = 201

Height = 21

DataField = 'QuantityPerUnit'

DataSource = DataSourceProducts

TabOrder = 3

end

object DBEdit6: TDBEdit

Left = 64

Top = 104

Width = 73

Height = 21

DataField = 'UnitPrice'

DataSource = DataSourceProducts

TabOrder = 4

end

object DBEdit7: TDBEdit

Left = 144

Top = 104

Width = 73

Height = 21

DataField = 'UnitsInStock'

DataSource = DataSourceProducts

TabOrder = 5

end

object DBEdit8: TDBEdit

Left = 224

Top = 104

Width = 73

Height = 21

DataField = 'UnitsOnOrder'

DataSource = DataSourceProducts

TabOrder = 6

end

object DBEdit9: TDBEdit

Left = 304

Top = 104

Width = 73

Height = 21

DataField = 'ReorderLevel'

DataSource = DataSourceProducts

TabOrder = 7

end

object DBCheckBox1: TDBCheckBox

Left = 408

Top = 104

Width = 81

Height = 17

Caption = 'Discontinued'

DataField = 'Discontinued'

DataSource = DataSourceProducts

TabOrder = 8

ValueChecked = 'True'

ValueUnchecked = 'False'

end

Стъпка 9: От страницата Data Controls на палитрата с компоненти (Tool Palette) добавете един компонент TDBNavigator и го настроите, както е показано по-долу:

object DBNavigator1: TDBNavigator

Left = 8

Top = 8

Width = 400

Height = 25

DataSource = DataSourceProducts

TabOrder = 9

end

Page 10: пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я DATASNAPtimetable.swu.bg/lecture/WebSite_ProjectBG510PO001/...Проект BG051PO001-3.1.07-0036 ,,Актуализиране на

© 2013 Радослава Кралева 10

Стъпка 10: От страницата Data Controls на палитрата с компоненти (Tool Palette) добавете един компонент TDBGrid и го настройте, както е показано по-долу:

object DBGrid1: TDBGrid

Left = 8

Top = 160

Width = 497

Height = 273

DataSource = DataSourceProducts

Options = [dgTitles, dgIndicator, dgColumnResize,

dgColLines, dgRowLines, dgTabs, dgRowSelect,

dgAlwaysShowSelection, dgConfirmDelete,

dgCancelOnExit]

TabOrder = 0

TitleFont.Charset = DEFAULT_CHARSET

TitleFont.Color = clWindowText

TitleFont.Height = -11

TitleFont.Name = 'Tahoma'

TitleFont.Style = []

Columns = <

item

Expanded = False

FieldName = 'ProductID'

Title.Caption = 'ID'

Width = 22

Visible = True

end

item

Expanded = False

FieldName = 'ProductName'

Width = 163

Visible = True

end

item

Expanded = False

FieldName = 'QuantityPerUnit'

Width = 102

Visible = True

end

item

Expanded = False

FieldName = 'UnitPrice'

Title.Caption = 'Price'

Width = 37

Visible = True

end

item

Expanded = False

FieldName = 'UnitsInStock'

Title.Caption = 'Units'

Width = 33

Visible = True

end

item

Expanded = False

FieldName = 'UnitsOnOrder'

Title.Caption = 'UnOrd'

Width = 36

Visible = True

end

Page 11: пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я DATASNAPtimetable.swu.bg/lecture/WebSite_ProjectBG510PO001/...Проект BG051PO001-3.1.07-0036 ,,Актуализиране на

© 2013 Радослава Кралева 11

item

Expanded = False

FieldName = 'ReorderLevel'

Title.Caption = 'Lev'

Width = 22

Visible = True

end

item

Expanded = False

FieldName = 'Discontinued'

Title.Caption = 'Discont'

Visible = True

end>

end

Стъпка 11: От страницата Additional на палитрата с компоненти (Tool Palette) добавете един компонент TBitBtn и го настройте, както е показано по-долу:

object BitBtn1: TBitBtn

Left = 416

Top = 8

Width = 89

Height = 25

Caption = 'Applay Updates'

TabOrder = 10

OnClick = BitBtn1Click

end

След като бъдат добавени и настроени всички компоненти, формата по време на проектиране трябва да изглежда подобно на тази показана на Фиг. 8.6.

Фигура 8.6: Главната форма на клиентското приложение Ex8ClientApp след приключване на етапа на проектиране.

Page 12: пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я DATASNAPtimetable.swu.bg/lecture/WebSite_ProjectBG510PO001/...Проект BG051PO001-3.1.07-0036 ,,Актуализиране на

© 2013 Радослава Кралева 12

Стъпка 12: Създайте манипулатор (обработчик) на събитието OnCreate на главната форма и въведете следния код в редактора за код (Code Editor):

procedure TMainForm.FormCreate(Sender: TObject);

begin

DCOMConnection.Open;

ClientDataSetProducts.Open;

end;

Стъпка 13: Създайте манипулатор (обработчик) на събитието OnClick на бутона BitBtn1 и въведете следния код в редактора за код (Code Editor):

procedure TMainForm.BitBtn1Click(Sender: TObject);

begin

ClientDataSetProducts.ApplyUpdates(0);

end;

Дата: 20.12.2013 г. Експерт: _______________________

(Радослава Кралева)

Page 13: пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я DATASNAPtimetable.swu.bg/lecture/WebSite_ProjectBG510PO001/...Проект BG051PO001-3.1.07-0036 ,,Актуализиране на

© 2013 Радослава Кралева 13