Советы по Delphi. Версия 1.4.3 от 1.1.2001
Шрифт:
Блокировка
…когда вы получаете эту, или аналогичную ошибку, вы можете прервать процесс следующим образом (в предположении, что вы пытаетесь запостить запись):
В противном случае вы не получите ошибку в случае, если текущую запись «рассматривает» другой пользователь (если вы пользуетесь базой данных Paradox, поставляемой с Delphi), если, конечно, вы правильно это установили. Paradox сам создает в сетевом каталоге файл с именем pdxusers.lck, видимый всеми пользователями, так что каждый BDE на каждой локальной машине может запирать запись, таким образом запрещая другим пользователям постить запись до снятия блокировки. Я не знаю, каким образом вы получаете эту ошибку, поэтому существует вероятность того, что я ошибаюсь в своих предположениях.
Каким драйвером пользуется TDATABASE?
Delphi 1
Вы можете использовать вызов IDAPI dbiGetDatabaseDesc. Вот быстрая справка (не забудьте добавить DB в список используемых модулей):
Для получения дополнительной информации обратитесь к описанию свойства pDatabase.szDbType.
Как создать новый запрос и скопировать туда точно такие же описания полей?
Nomadic отвечает:
Копируешь FieldDefs.
Проходишь циклом по FieldDefs.Items[i].CreateField(Owner);
Запись потока в BLOB-поле
Delphi 1
Вся хитрость заключается в использовании StrPcopy (помещения вашей строки в PChar) и записи буфера в поток. Вы не сможете передать это в PChar непосредственно, поскольку ему нужен буфер, поэтому для получения необходимого размера буфера используйте <BufferName>[0]
Вот пример использования TMemoryStream и записи его в Blob-поле:
Как я могу выбрать на клиента только часть данных с определенной позиции из набора данных на сервере?
Nomadic отвечает:
Наиболее приемлемым является использование TQuery и Provider.SetParams.
Но также Вы можете сделать это иначе:
Сперва на клиенте Вам нужно считать с сервера только метаданные для набора данных. Это можно сделать, установив PacketRecords в 0, и затем вызвав Open. Затем Вы должны вызвать метод сервера (Вы должны определить этот метод на сервере), который спозиционирует курсор на первую нужную запись. И, наконец, установите PacketRecords в нужное значение, большее нуля, и вызовите GetNextPacket.
Отследить изменение данных?
Предположим, что пользователь изменил строковое поле в Null. Как тогда я в обработчике OnUpdateData смогу определить, изменилось ли это поле на строку Null, или поле просто не было изменено?
Nomadic отвечает:
Используйте свойство NewValue класса TField при чтении второй записи (той, которая содержит изменения). Если возвращаемое значение (variant) пусто или не назначено, тогда поле не было модифицировано. Здесь немного иллюстрирующего кода: