пражнение 8: Ъ ЪЪ ¡ Я ¡ ¡ Х Я...
TRANSCRIPT
© 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)
© 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'
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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
© 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 след приключване на етапа на проектиране.
© 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 г. Експерт: _______________________
(Радослава Кралева)
© 2013 Радослава Кралева 13