Советы по Delphi. Версия 1.4.3 от 1.1.2001 - страница 34

стр.

Вот пример использования TMemoryStream и записи его в Blob-поле: 

>var

> cString: String;

> oMemory: TMemoryStream;

> Buffer: PChar;

>begin

> cString := 'Ну, допустим, хочу эту строку!';

> { СОздаем новый поток памяти }

> oMemory := TMemoryStream.Create;

> {!! Копируем строку в PChar }

> StrPCopy(Buffer, cString);

> { Пишем =буфер= и его размер в поток }

> oMemory.Write(Buffer[0], StrLen(Buffer));

> {Записываем это в поле}

.LoadFromStream(oMemory);

> { Необходимо освободить ресурсы}

> oMemory.Free;

>end; 

Как я могу выбрать на клиента только часть данных с определенной позиции из набора данных на сервере?

Nomadic отвечает:

Наиболее приемлемым является использование TQuery и Provider.SetParams.

Но также Вы можете сделать это иначе:

Сперва на клиенте Вам нужно считать с сервера только метаданные для набора данных. Это можно сделать, установив PacketRecords в 0, и затем вызвав Open. Затем Вы должны вызвать метод сервера (Вы должны определить этот метод на сервере), который спозиционирует курсор на первую нужную запись. И, наконец, установите PacketRecords в нужное значение, большее нуля, и вызовите GetNextPacket. 

Отследить изменение данных?

Предположим, что пользователь изменил строковое поле в Null. Как тогда я в обработчике OnUpdateData смогу определить, изменилось ли это поле на строку Null, или поле просто не было изменено?

Nomadic отвечает:

Используйте свойство NewValue класса TField при чтении второй записи (той, которая содержит изменения). Если возвращаемое значение (variant) пусто или не назначено, тогда поле не было модифицировано. Здесь немного иллюстрирующего кода: 

>var NewVal: Variant;

>begin

> NewVal := DataSet.FieldByName('MyStrField').NewValue;

>if VarIsEmpty(NewVal) then ShowMessage('Field was not edited')

>else if VarIsNull(NewVal) then ShowMessage('Field was blanked out')

>else ShowMessage('New Field Value: ' + String(NewVal));

>end;

Если Вы взглянете на исходники формы RecError (в репозитории), то Вы увидите, как она использует эту информацию для вывода строки ' ' при показе ошибок синхронизации данных. На сервере Вы добавляете ограничения уровня записи, используя свойство Constraints Вашего TQuery/TTable или ограничения уровня поля, используя постоянные обьекты TField (с помощью FieldsEditor либо на CustomConstraint, либо ImportedConstraint). Если Вы используете ограничения уровня поля, они вступают в силу, когда данныеотправляются в поле (например, когда Вы уходите из органа управления, связанного с этим полем (типа TDBEdit)). 

Как достучаться до методов сервера приложений из TClientDataSet?

Nomadic отвечает:

Вот так: 

>RemoteServer.AppServer.MyMethod

AppServer – свойство только для чтения, возвращающее интерфейс удаленного сервера, возвращаемый провайдером сервера приложений. Клиентские приложения могут общаться напрямую с сервером приложений через этот интерфейс. 

Я включил dbclient.dll в секцию `additional files` опций распространения по web, но этот файл никогда не загружается на клиента. Как это исправить?

Nomadic отвечает:

Ваш INF-файл должен включать в себя строки наподобие:

>[Add.Code]

>dbclient.dll=dbclient.dll

>[dbclient.dll]

>file=http://yoursite.com/dbclient.cab

>clsid={9E8D2F81-591C-11D0-BF52-0020AF32BD64}

>RegisterServer=yes

>FileVersion=4,0,0,36

Замените «yoursite» Вашим HTTP-адресом, где находится cab-файл. FileVersion – это версия файла в Вашем cab-файле (проверьте информацию о версии DBCLIENT, чтобы быть уверенным в соответствии). Убедитесь, что FileVersion относится к версии Вашего DBCLIENT.DLL. Вы можете положить dbclient.dll в cab-файл, используя утилиту CABARC, которую Вы найдете в папке delphi\bin. Примерная команда вызова CABARC может выглядеть примерно так:

>CABARC N DBCLIENT.CAB DBCLIENT.DLL 

Как можно использовать TClientDataSet в локальном приложении с таблицами Paradox, без использования компонент TProvider и TRemoteServer?

Nomadic отвечает:

Вы не сможете отделаться от Провайдера (хотя бросать его на форму/модуль данных не придется), но Вы сможете использовать TClientDataSet в одно-точечном (single-tier) приложении. Для того, чтобы открыть client dataset, Вы должны назначить Провайдера Данных вручную.