Слайд 1СУБД в архитектуре «клиент-сервер»
File Server
Remote Data Access
Database Server
Application Server
Слайд 2СУБД в архитектуре
«клиент-сервер»
Группы функций программной системы:
Функции отображения и ввода данных
Уровень представления, Presentation Layer, PrezLayer
Прикладные функции – логика предметной области
Уровень
бизнес- логики, Business Layer, BizLayer
Функции доступа к базам данных
Уровень данных, Database Layer, DataLayer
Слайд 3Модель «Файловый сервер»
(File Server)
Достоинства:
Использование единых ресурсов сервера (больших НМД)
Недостатки:
Низкая защищенность
(уровень файловой системы)
Слайд 4Модель удаленного доступа
к данным (Remote Data Access)
Достоинства:
Повышенная защищенность данных
Возможность управления
транзакциями
Недостатки:
Высокий сетевой трафик
Сложность координации многопользовательских приложений
Слайд 5Модель сервера баз данных (Database Server)
Основные черты:
БД соответствует предметной области
(концептуальная модель)
БД активна – реагирует на изменения данных
Имеет средства ограничения
доступа к данным
Имеет средства восстановления данных
Основа – хранимые процедуры и триггеры
Слайд 6Модель сервера баз данных (Database Server)
Достоинства:
Уменьшение сетевой нагрузки
Уменьшение дублирования кода
Недостатки:
Высокая
загрузка сервера (BL, DL, СУБД)
Сложность разработки, если бизнес-логика частично реализуется
на клиенте
Слайд 7Модель сервера приложений (Application Server)
Трехуровневая архитектура «клиент-сервер»
Клиент – уровень представления
Бизнес
логика – на отдельном сервере
СУБД – на отдельном сервере
Слайд 8Модель сервера приложений (Application Server)
Достоинства:
«Тонкий клиент» - менее дорогая аппаратура
Централизация
бизнес-логики – централизация сопровождения (поддержка, замена оборудования, администрирование)
Модульность – простая
модификация и замена ПО
Возможность равномерного распределения нагрузки
Недостатки:
Сложность реализации
Слайд 9Модель сервера приложений (Application Server)
Web-приложение
Слайд 10Модель сервера приложений (Application Server)
Достоинства:
Простота реализации HTML
Независимость браузеров от платформы
Высокий
уровень стандартизации уровня представления (HTML)
Масштабируемость – доступ с произвольного клиента,
нет необходимости разворачивать на клиенте сложное ПО
Недостатки:
Низкая надежность из-за ненадежности глобальной сети
Слабая защищенность данных, передаваемых между клиентом и сервером приложения
Отсутствие контроля масштабируемости (неожиданно высокая нагрузка на сервер)
Ограниченная функциональность HTML
Слайд 11Знакомство с DLL
DLL – динамически связываемая библиотека
p.cpp
#include
y = get(5)
p.obj
p.exe
odbc.h
int get(int
x)
odbc.lib
имя: get
адрес: 1108
odbc.dll
после трансляции
после загрузки в память
единый процесс
Слайд 12ODBC
Приложение
Менеджер драйверов
Драйвер
Драйвер
Драйвер
источники данных
ODBC – Open Database Connectivity открытая система связи
с базами данных
ODBC API
ODBC API
Слайд 13ODBC
Задачи, выполняемые приложением:
выбор источника данных
предоставление SQL операторов на выполнение
получение результата
обработка
ошибок
запрос на выполнение фиксации или отката транзакции
отсоединение от источника данных
Задачи,
выполняемые Менеджером драйверов:
предоставляет стандартный интерфейс
вызывает функции драйвера по указателю
поддерживает список источников данных
подгружает и выгружает не нужные драйверы
проверяет часть ошибок
Задачи, выполняемые Драйвером драйверов:
подсоединяется к источнику данных
выявляет ошибки
преобразует SQL операторы в запросы, специфические для источника данных
передает данные и выполняет преобразование типов
Слайд 16ODBC
hEnv
hDbc
hStmt
Приложение
ODBC.DLL
Информация
о среде
выполнения
Информация
о соединении
Информация
о команде
Преобразование
дескриптора
в адрес
Дескрипторы и объекты
Слайд 17ODBC
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)
Слайд 18ODBC
#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;
}
Слайд 19ODBC
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;
}
Слайд 20ODBC
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");
}
Слайд 21ODBC
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());
}
Слайд 22ODBC
void ShowMenu()
{
int choice = 0;
bool done = false;
do
{
cout
MENU ***"
<< "1 - list all DNS" << endl;
cout << "2 - select (using DNS)" << endl;
cout << "3 - select (using driver directly)" << endl;
cout << "Choice : ";
cin >> choice;
switch(choice)
{
default : done = true; break;
case 1 : ListDSN(); break;
case 2 : DoSelect(connectionStringDSN); break;
case 3 : DoSelect(connectionStringDriver); break;
}
}while(!done);
}
int main(int count, char* cparams[])
{
ShowMenu();
return 0;
}