Советы по 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));
> {Записываем это в поле}
>
> { Необходимо освободить ресурсы}
> 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, Вы должны назначить Провайдера Данных вручную.