Чтение онлайн

на главную

Жанры

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

 S: TMemoryStream;

 B: pointer;

 C: integer;

 …

S := TMemoryStream.Create;

Table1.Edit;

S.Clear;

S.SetSize(C);

C := S.Write(B,C);

(Table1BlobField as TBlobField).LoadFromStream(S);

S.Clear;

Table1.Post;

S.Destroy;
 

Блокировка

таблицы

…когда вы получаете эту, или аналогичную ошибку, вы можете прервать процесс следующим образом (в предположении, что вы пытаетесь запостить запись):

try

 Table1.Post;

except

 MessageDlg ('Ошибка постинга записи', прочее…

 Table1.Cancel;

end;

В противном случае вы не получите ошибку в случае, если текущую запись «рассматривает» другой пользователь (если вы пользуетесь базой данных Paradox, поставляемой с Delphi), если, конечно, вы правильно это установили. Paradox сам создает в сетевом каталоге файл с именем pdxusers.lck, видимый всеми пользователями, так что каждый BDE на каждой локальной машине может запирать запись, таким образом запрещая другим пользователям постить запись до снятия блокировки. Я не знаю, каким образом вы получаете эту ошибку, поэтому существует вероятность того, что я ошибаюсь в своих предположениях. 

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

Delphi 1 

Вы можете использовать вызов IDAPI dbiGetDatabaseDesc. Вот быстрая справка (не забудьте добавить DB в список используемых модулей): 

var

 pDatabase: DBDrsc:

begin

 { pAlias – PChar, содержащий имя псевдонима}

 dbiGetDatabaseDesc(pAlias, @pDatabase);

Для получения дополнительной информации обратитесь к описанию свойства pDatabase.szDbType. 

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

Nomadic отвечает:

Копируешь FieldDefs.

Проходишь циклом по FieldDefs.Items[i].CreateField(Owner); 

Запись потока в BLOB-поле

Delphi 1 

Вся хитрость заключается в использовании StrPcopy (помещения вашей строки в PChar) и записи буфера в поток. Вы не сможете передать это в PChar непосредственно, поскольку ему нужен буфер, поэтому для получения необходимого размера буфера используйте <BufferName>[0]

и StrLen.

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

var

 cString: String;

 oMemory: TMemoryStream;

 Buffer: PChar;

begin

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

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

 oMemory := TMemoryStream.Create;

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

 StrPCopy(Buffer, cString);

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

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

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

 <Blob/Memo/GraphicFieldName>.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));

Поделиться:
Популярные книги

Ученичество. Книга 1

Понарошку Евгений
1. Государственный маг
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ученичество. Книга 1

Матабар III

Клеванский Кирилл Сергеевич
3. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар III

Кодекс Охотника. Книга XXIII

Винокуров Юрий
23. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXIII

Вопреки судьбе, или В другой мир за счастьем

Цвик Катерина Александровна
Любовные романы:
любовно-фантастические романы
6.46
рейтинг книги
Вопреки судьбе, или В другой мир за счастьем

Идеальный мир для Лекаря 23

Сапфир Олег
23. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 23

Довлатов. Сонный лекарь

Голд Джон
1. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь

Мама из другого мира. Дела семейные и не только

Рыжая Ехидна
4. Королевский приют имени графа Тадеуса Оберона
Любовные романы:
любовно-фантастические романы
9.34
рейтинг книги
Мама из другого мира. Дела семейные и не только

Великий род

Сай Ярослав
3. Медорфенов
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Великий род

Проданная Истинная. Месть по-драконьи

Белова Екатерина
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Проданная Истинная. Месть по-драконьи

Треск штанов

Ланцов Михаил Алексеевич
6. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Треск штанов

Лучший из худших

Дашко Дмитрий
1. Лучший из худших
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Лучший из худших

На границе империй. Том 8. Часть 2

INDIGO
13. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 8. Часть 2

Гром над Академией Часть 3

Машуков Тимур
4. Гром над миром
Фантастика:
фэнтези
5.25
рейтинг книги
Гром над Академией Часть 3

Сила рода. Том 3

Вяч Павел
2. Претендент
Фантастика:
фэнтези
боевая фантастика
6.17
рейтинг книги
Сила рода. Том 3