СУБД в архитектуре клиент-сервер

Содержание

Слайд 2

СУБД в архитектуре «клиент-сервер» Группы функций программной системы: Функции отображения и

СУБД в архитектуре «клиент-сервер»

Группы функций программной системы:
Функции отображения и ввода данных Уровень

представления, Presentation Layer, PrezLayer
Прикладные функции – логика предметной области Уровень бизнес- логики, Business Layer, BizLayer
Функции доступа к базам данных Уровень данных, Database Layer, DataLayer
Слайд 3

Модель «Файловый сервер» (File Server) Достоинства: Использование единых ресурсов сервера (больших

Модель «Файловый сервер» (File Server)

Достоинства:
Использование единых ресурсов сервера (больших НМД)
Недостатки:
Низкая защищенность (уровень

файловой системы)
Слайд 4

Модель удаленного доступа к данным (Remote Data Access) Достоинства: Повышенная защищенность

Модель удаленного доступа к данным (Remote Data Access)

Достоинства:
Повышенная защищенность данных
Возможность управления транзакциями
Недостатки:
Высокий

сетевой трафик
Сложность координации многопользовательских приложений
Слайд 5

Модель сервера баз данных (Database Server) Основные черты: БД соответствует предметной

Модель сервера баз данных (Database Server)

Основные черты:
БД соответствует предметной области (концептуальная

модель)
БД активна – реагирует на изменения данных
Имеет средства ограничения доступа к данным
Имеет средства восстановления данных
Основа – хранимые процедуры и триггеры
Слайд 6

Модель сервера баз данных (Database Server) Достоинства: Уменьшение сетевой нагрузки Уменьшение

Модель сервера баз данных (Database Server)

Достоинства:
Уменьшение сетевой нагрузки
Уменьшение дублирования кода
Недостатки:
Высокая загрузка

сервера (BL, DL, СУБД)
Сложность разработки, если бизнес-логика частично реализуется на клиенте
Слайд 7

Модель сервера приложений (Application Server) Трехуровневая архитектура «клиент-сервер» Клиент – уровень

Модель сервера приложений (Application Server)

Трехуровневая архитектура «клиент-сервер»
Клиент – уровень представления
Бизнес логика

– на отдельном сервере
СУБД – на отдельном сервере
Слайд 8

Модель сервера приложений (Application Server) Достоинства: «Тонкий клиент» - менее дорогая

Модель сервера приложений (Application Server)

Достоинства:
«Тонкий клиент» - менее дорогая аппаратура
Централизация бизнес-логики

– централизация сопровождения (поддержка, замена оборудования, администрирование)
Модульность – простая модификация и замена ПО
Возможность равномерного распределения нагрузки
Недостатки:
Сложность реализации
Слайд 9

Модель сервера приложений (Application Server) Web-приложение

Модель сервера приложений (Application Server)

Web-приложение

Слайд 10

Модель сервера приложений (Application Server) Достоинства: Простота реализации HTML Независимость браузеров

Модель сервера приложений (Application Server)

Достоинства:
Простота реализации HTML
Независимость браузеров от платформы
Высокий уровень

стандартизации уровня представления (HTML)
Масштабируемость – доступ с произвольного клиента, нет необходимости разворачивать на клиенте сложное ПО
Недостатки:
Низкая надежность из-за ненадежности глобальной сети
Слабая защищенность данных, передаваемых между клиентом и сервером приложения
Отсутствие контроля масштабируемости (неожиданно высокая нагрузка на сервер)
Ограниченная функциональность HTML
Слайд 11

Знакомство с DLL DLL – динамически связываемая библиотека p.cpp #include y

Знакомство с DLL

DLL – динамически связываемая библиотека

p.cpp
#include
y = get(5)

p.obj

p.exe

odbc.h
int get(int x)

odbc.lib
имя:

get
адрес: 1108

odbc.dll

после трансляции

после загрузки в память

единый процесс

Слайд 12

ODBC Приложение Менеджер драйверов Драйвер Драйвер Драйвер источники данных ODBC –

ODBC

Приложение

Менеджер драйверов

Драйвер

Драйвер

Драйвер

источники данных

ODBC – Open Database Connectivity открытая система связи с

базами данных

ODBC API

ODBC API

Слайд 13

ODBC Задачи, выполняемые приложением: выбор источника данных предоставление SQL операторов на

ODBC

Задачи, выполняемые приложением:
выбор источника данных
предоставление SQL операторов на выполнение
получение результата
обработка ошибок
запрос

на выполнение фиксации или отката транзакции
отсоединение от источника данных

Задачи, выполняемые Менеджером драйверов:
предоставляет стандартный интерфейс
вызывает функции драйвера по указателю
поддерживает список источников данных
подгружает и выгружает не нужные драйверы
проверяет часть ошибок

Задачи, выполняемые Драйвером драйверов:
подсоединяется к источнику данных
выявляет ошибки
преобразует SQL операторы в запросы, специфические для источника данных
передает данные и выполняет преобразование типов

Слайд 14

ODBC

ODBC

Слайд 15

ODBC

ODBC

Слайд 16

ODBC hEnv hDbc hStmt Приложение ODBC.DLL Информация о среде выполнения Информация

ODBC

hEnv

hDbc

hStmt

Приложение

ODBC.DLL

Информация о среде
выполнения

Информация о соединении

Информация о команде

Преобразование дескриптора в адрес

Дескрипторы и объекты

Слайд 17

ODBC 1. Соединение с СУБД SQLAllocEnv(&hEnv) SQLAllocConnect(hEnv, &hDbc) SQLDriverConnect(hDbc, …) SQLAllocStmt(hDbc,

ODBC

1. Соединение с СУБД
SQLAllocEnv(&hEnv)
SQLAllocConnect(hEnv, &hDbc)
SQLDriverConnect(hDbc, …)
SQLAllocStmt(hDbc, &hstmt)

2. Выполнение запроса
SQLExecDirect(hstmt, command, …)

SQL запрос к СУБД

3. Получить результат запроса
SQLBindCol(hstmt, 1, …) привязка колонок к переменным
SQLFetch(hstmt) перемещение курсора

4. Отсоединение от СУБД
SQLDisconnect(hDbc)
SQLFreeConnect(hDbc)
SQLFreeEnv(hEnv)

Слайд 18

ODBC #include "stdafx.h" #include #undef UNICODE #include #include #include #include #include

ODBC

#include "stdafx.h"
#include
#undef UNICODE
#include
#include
#include
#include
#include
#include
#include
using namespace

std;
SQLCHAR connectionStringDSN[256] = "DSN=NorthWindConnection;UID=norcal; PWD=norcal;";
SQLCHAR connectionStringDriver[256] =
"DRIVER={SQL Server};SERVER=LENA\\SQLEXPRESS;"
"UID=norcal;PWD=norcal;DATABASE=Northwind;";
void errorMessage(const char* s)
{
cout<< "*** Error *** " << s << endl;
}
void Message(const char* s)
{
cout << s << endl;
}
Слайд 19

ODBC void DoSelect(SQLCHAR connectionString[256]) { HENV hEnv; HDBC hDbc; HSTMT hStmt

ODBC

void DoSelect(SQLCHAR connectionString[256])
{
HENV hEnv;
HDBC hDbc;
HSTMT hStmt = SQL_NULL_HSTMT;
RETCODE rc;
SQLSMALLINT cbOutConStr

= 0;
// Получить соединение с СУБД
SQLCHAR outConnectionString[256];
SQLAllocEnv(&hEnv);
SQLAllocConnect(hEnv, &hDbc);
rc = SQLDriverConnect(hDbc, NULL,
connectionString, SQL_NTS,
outConnectionString, sizeof(outConnectionString),
&cbOutConStr, SQL_DRIVER_COMPLETE);
//SQL_DRIVER_NOPROMPT SQL_DRIVER_COMPLETE
if(!(rc == SQL_SUCCESS) && !(rc == SQL_SUCCESS_WITH_INFO))
{
errorMessage("Error SQLDriverConnect");
return;
}
Слайд 20

ODBC SQLHSTMT hstmt; rc = SQLAllocStmt(hDbc, &hstmt); SQLCHAR command[256] = "SELECT

ODBC

SQLHSTMT hstmt;
rc = SQLAllocStmt(hDbc, &hstmt);
SQLCHAR command[256] = "SELECT EmployeeId, Address FROM

Employees";
rc = SQLExecDirect(hstmt, command, SQL_NTS);
SQLINTEGER EmployeeId;
SQLCHAR Address[60];
SQLINTEGER cbEmployeeId, cbAddress;
if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO) {
SQLBindCol(hstmt, 1, SQL_C_ULONG, &EmployeeId, 0, &cbEmployeeId);
SQLBindCol(hstmt, 2, SQL_C_CHAR, Address, 60, &cbAddress);
while (TRUE) {
rc = SQLFetch(hstmt);
if (rc == SQL_ERROR)
{
errorMessage("Error in the fetch");
}
if (rc == SQL_SUCCESS || rc == SQL_SUCCESS_WITH_INFO)
{
cout << EmployeeId << " " << Address << endl;
} else {
break;
}
}
SQLDisconnect(hDbc);
SQLFreeConnect(hDbc);
SQLFreeEnv(hEnv);
}
else
errorMessage("Exec SQL error");
}
Слайд 21

ODBC void ListDSN() { const short SQL_MAX_DSN_LENGTH_ = SQL_MAX_DSN_LENGTH; UCHAR szDSN[SQL_MAX_DSN_LENGTH+1];

ODBC

void ListDSN()
{
const short SQL_MAX_DSN_LENGTH_ = SQL_MAX_DSN_LENGTH;
UCHAR szDSN[SQL_MAX_DSN_LENGTH+1];
UCHAR szDescription[256];
short wDSNLen;
SQLSMALLINT wDesLen;
int retCode;
SQLHENV

hEnv = NULL;
string DSNName;
string resultString;
string Descr;
SQLAllocEnv(&hEnv);
retCode = SQLDataSources(hEnv, SQL_FETCH_FIRST, szDSN, SQL_MAX_DSN_LENGTH_+1,
&wDSNLen, szDescription, 256, &wDesLen);
while(retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO)
{
DSNName = (string)((char *) szDSN);
Descr = (string)((char *) szDescription);
resultString += DSNName;
resultString += "\n";
retCode = SQLDataSources(hEnv, SQL_FETCH_NEXT, szDSN,SQL_MAX_DSN_LENGTH_+1,
&wDSNLen, szDescription, 256, &wDesLen);
}
SQLFreeEnv(hEnv);
Message(resultString.c_str());
}