if DlgItemLoc.ModalResult = mrOk then
{делаем все, что необходимо для постинга данных}
else
{очищаем и делаем Cancel};
DlgItemLoc.Free;
end;
Отображение определенных полей БД
Delphi 1
Вот что можно сделать во время выполнения программы:
Table1.FieldByName(RemovedFieldName).Visible := False;
или
Table1.Field[removedFieldNumber-1].Visible := false;
Из базы данных в переменные
Delphi 1
Примерно так вы можете программным путем извлечь содержимое поля:
aValue := TMyTable.FieldByName('SomeField').AsText;
или
aValue := TMyTable.FieldByName('SomeField').AsInteger;
или
aValue := TMyTable.Fields[1].AsFloat;
В действительности здесь вы получаете объект TField от объекта TTable (или TQuery), и затем вызываете соответствующий метод объекта TField для получения самих данных. Вы можете также изменить значение самого поля, но только в случае, если объект TTable находится в режиме вставки (Insert) или редактирования (Edit). Члены AsFloat, AsInteger, AsDateTime и AsString в действительности являются свойствами, и как таковые также могут принимать значения. С помощью Редактора Полей (Fields Editor, для вызова которого достаточно дважды щелкнуть на объекте TTable или TQuery) также возможно создание объектов-полей. Эти объекты могут быть использованы вместо получения их каждый раз от объекта TTable или TQuery.
Получение информации о таблице
Вам нужно воспользоваться свойством FieldDefs. В следующем примере список полей и их соответствующий размер передается компоненту TMemo (расположенному на форме) с именем Memo1:
procedure TForm1.ShowFields;
var
i : Word;
begin
Memo1.Lines.Clear;Table1.FieldDefs.Update; { должно быть вызвано, если Table1 не активна }
for i:= 0 to Table1.FieldDefs.Count - 1 do With Table1.FieldDefs.Items[i] do Memo1.Lines.Add(Name + ' - ' + IntToStr(Size));
Memo1.Lines.Add(Name + ' – ' + IntToStr(Size));
end;
Если вам просто нужны имена полей (FieldNames), то используйте метод TTable GetFieldNames:
GetIndexNames для получения имен индексов:
var FldNames, IdxNames : TStringList
begin
FldNames := TStringList.Create;
IdxNames := TStringList.Create;
If Table1.State = dsInactive then Table1.Open;
Table1.GetFieldNames(FldNames);
Table1.GetIndexNames(IdxNames);
{…… используем полученную информацию ……}
FldNames.Free; {освобождаем stringlist}
IdxNames.Free;
end;
Для получения информации об определенном поле вы должны использовать FieldDef.
Обмен данными между TMemoField и TMemo
Delphi 1
Procedure TMemoToTMemoField;
begin
TMemoField.Assign(TMemo.Lines);
end;
Procedure TMemoFieldToTMemo;
VAR aBlobStream : TBlobStream;
begin
aBlobStream := TBlobStream.Create(TMemoField, bmRead);
TMemo.Lines.LoadFromStream(aBlobStream);
aBlobStream.Free;
end;
Если в транзакции изменена какая-то таблица, то для другого пользователя блокируется вся таблица, до окончания транзакции. Как лечить?
Nomadic отвечает:
По умолчанию, оператор UPDATE в MS SQL Server пытается поставить эксклюзивную табличную блокировку. Вы можете обойти это, используя ключевое слово FROM в сочетании с опцией PAGLOCK для использования MS SQL Server страничных блокировок вместо эксклюзивной табличной блокировки:
UPDATE orders SET customer_id=NULL FROM orders(PAGLOCK) WHERE customer_id=32;
Блокиpовка на всю таблицу пpи UPDATE ставится только в том случае, если по предикату нет индекса. Так, можно просто проиндексировать таблицу orders по полю customer_id, и не забывать делать UPDATE STATISTIC, хотя будет работать и с PAGLOCK. Просто не факт, что UPDATE всегда делает табличную блокировку.