Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Особенности реализации клиентской части

01.01.2007
Особенности реализации клиентской части

До версии 6.5 основным интерфейсом доступа к MS SQL Server со стороны клиента была библиотека DB-Library. Она реализовывала набор низкоуровневых интерфейсов, позволяющих организовать взаимодействие с сервером. Однако, в версии 7 Microsoft ввела новый интерфейс доступа – OLE DB. В связи с этим развитие DB-Library прекращено, и она оставлена лишь для обратной совместимости. Доступ через неё не поддерживает новых расширений сервера (UNICODE, текстовые поля до 8 Кбайт, тип данных GUID). Однако, старые приложения, не использующие этой функциональности сохраняют работоспособность, хотя может понадобиться некоторая их переделка в связи с изменениями в 7-й версии. Драйвер SQL Links реализует доступ при помощи DB-Library, и воспользоваться расширениями через него невозможно. Для обеспечения полноценного доступа к MS SQL Server 7.0 и выше необходимо использовать новый набор компонентов ADOExpress, включенный в Delphi 5. Работа через BDE возможна, но при этом сервер доступен в объеме возможностей версии 6.х. Также, существует ODBC драйвер, через который возможен полнофункциональный доступ к серверу. При работе с сервером версии 2000 на работу через BDE накладываются дополнительные ограничения, связанные с использованием индексов по вычисляемым полям.

Доступ при помощи ADOExpress

ActiveX Data Objects (ADO) – надстройка над интерфейсом OLE DB, позволяющая обеспечить бизнес приложениям высокоуровневый доступ к данным. Эта технология включена в Windows 2000, а на остальных версиях доступна в виде бесплатного обновления. ADO автоматически устанавливается на компьютер при установке клиента MS SQL Server

Начиная с версии 5.0 Delphi, в редакции Enterprise, включает в себя набор компонентов, позволяющих работать с ADO. Пользователи профессиональной редакции могут приобрести эти компоненты в виде отдельного продукта.

clip0180

В качестве драйверов БД ADO использует так называемые OLE DB провайдеры, которые представляют собой COM-серверы, реализующие предопределенный набор COM-интерфейсов. Например, для доступа к набору данных служит интерфейс IRowset, возвращаемый OLE DB при открытии этого набора данных. Для указания ADO, какой провайдер и с какими параметрами должен использоваться служит строка подключения, которая содержится в свойстве ConnectionString компонентов ADOExpress

Для её построения в состав Delphi включен мастер, позволяющий задать параметры графически

clip0179

Чтобы подключиться к MS SQL Server, необходимо указать тип провайдера «Microsoft OLE DB Provider for SQL Server» и в следующем окне заполнить информацию, необходимую для подключения

clip0181

После этого можно использовать компоненты ADO как обычных наследников TDataSet

Необходимо отметить, что ADO в значительной мере оптимизировано для использования совместно с MS SQL Server 7.0. Полностью поддерживается модель работы Prepare-Execute, позволяющая эффективно кэшировать планы запросов, серверные курсоры (свойства CursorLocation и CursorType), возможность возврата запросом или хранимой процедурой нескольких наборов данных, прямой доступ к таблицам на сервере (без промежуточной генерации запроса). Например, задав в TADOQuery.SQL следующий код:

SELECT * FROM One
SELECT * FROM Two
 

Можно в приложении получить два набора данных:

ADOQuery1.Open;
ADODataSet1.RecordSet := ADOQuery1.NextRecordSet;

Решена проблема, возникающая при попытке выполнить запрос при не до конца загруженных данных другого запроса. ADOExpress, в этом случае, автоматически открывает новое временное соединение с сервером и выполняет запрос, используя это соединение.

В оригинальной версии Delphi 5 ADOExpress содержит ряд серьёзных ошибок, которые делают работу при помощи этих компонентов практически невозможной. Поэтому настоятельно рекомендуется установка пакета обновления Delphi и последнего обновления ADO (AePatch.exe), доступного с сайта http://community.borland.com из раздела Code Central

Доступ при помощи BDE

Этот способ доступа не является рекомендуемым, однако для многих приложений, написанных еще для версии 6.х он может понадобиться из соображений обратной совместимости.

В составе BDE поставляется драйвер SQL Link для Microsoft SQL Server. Этот драйвер использует библиотеку DB-Library, что исключает полноценный доступ к возможностям сервера. При работе через этот драйвер, например, нельзя использовать символьные данные в кодировке Unicode, некоторые системные функции. Если необходимо получить доступ к таким данным, необходимо в запросе явно преобразовать их в один из поддерживаемых типов данных, например:

SELECT CAST(USER_NAME() AS VARCHAR(255))

При работе с сервером при помощи BDE и драйвера SQL Link необходимо помнить следующее:

clip0182

В зависимости от кодовой страницы сервера он может воспринимать дату в различных форматах. Например: '1 Apr 1999' для английской и '1 Апр 1999' для русской. DB-Library пытается распознать кодовые страницы клиента и сервера и преобразовать дату в нужный вид. Однако при этом часто возникает ошибка, когда дата уходит на сервер не на том языке. Для исключения этой ошибки необходимо проверить язык, установленный в качестве умолчания на сервере (SET LANGUAGE) и в программе Client Network Utility на закладке "DB Library Options" отключить флажок «Use International Settings», если на нем установлен us_english или включить, если установлен русский. Другим способом избежать данной проблемы является передача даты на сервер в виде текстовой строки вида 'yyyymmdd'. При преобразовании 8-символьной строки в дату сервер всегда интерпретирует её таким образом и исключает возможность ошибки. Сделать это можно так:
Params[0].AsString := FormatDateTime('yyyymmdd',DateTimeVariable);
При выполнении запроса на выборку данных сервер ожидает, что клиентская программа считает все запрошенные данные до посылки на сервер следующего оператора. Однако BDE загружает записи с сервера только по мере необходимости (например, открыв в TDBGrid большую таблицу, мы прочтем с сервера только записи, которые поместятся на экран в её видимой части). Остальные записи считываются по мере необходимости, например при прокрутке таблицы. Если в этой ситуации попытаться выполнить еще один запрос – BDE принудительно выполняет FetchAll для всех открытых, но не считанных до конца запросов. Это может повлечь неожиданную задержку.
При использовании индексов по вычисляемым полям, появившихся в MSSQL 2000, необходимо, чтобы для сессии были установлены параметры:
ANSI_NULLS        ON

ANSI_PADDING        ON

ANSI_WARNINGS        ON

ARITHABORT        ON

CONCAT_NULL_YIELDS_NULL        ON

QUOTED_IDENTIFIER        ON

NUMERIC_ROUNDABORT        OFF

В противном случае, таблица, по которой определен индекс по вычисляемому полю будет доступна только на чтение. Приведенный набор настроек соответствует умолчаниям для сессий OLE DB и ODBC. DB-Library инициализирует их по другому и Вы должны явно задать требуемые значения после соединения с сервером.