Вопрос по работе с TDataSet

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
Аватара пользователя
bloodlines
постоялец
Сообщения: 100
Зарегистрирован: 05.11.2008 10:26:19

Вопрос по работе с TDataSet

Сообщение bloodlines »

Код: Выделить всё

var
  ds:TDataSet;
  i:integer;
begin

  try
  ds:=TDataSet.Create(owner);

  ds.FieldDefs.Add('Test1', ftString, 20);
  ds.FieldDefs.Add('Test2', ftString, 10);

  ds.Active:=true;

  for i:=1 to 10 do
  begin
   ds.Append;
   ds.Fields.Fields[0].Value:=IntToStr(i);
   ds.Fields.Fields[1].Value:=IntToStr(i+10);
  end;

  ds.Open;

  finally
  ds.Free;
  end;

end;       


Когда выполнение программы доходит до

Код: Выделить всё

ds.Active:=true;
вылетает ошибка "Run Error (211)". Если эту строку закомментировать, то вылетает ошибка о том, что невозможно выполнить операцию на неактивном DataSet.
Что я делаю не так?
Аватара пользователя
Light13
постоялец
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

Сообщение Light13 »

начнем с того, что вы хотите этим добиться? я не вижу, где у вас связь с БД идет.
bloodlines писал(а):  try  ds:=TDataSet.Create(owner);
создание экземпляра класса лучше вынести перед блоком try - finally - end
Аватара пользователя
bloodlines
постоялец
Сообщения: 100
Зарегистрирован: 05.11.2008 10:26:19

Сообщение bloodlines »

я не вижу, где у вас связь с БД идет.

А мне она и не нужна - я сам создаю поля и их заполняю.
создание экземпляра класса лучше вынести перед блоком try - finally - end

То же самое - ничего не изменилось.

Кстати, с TMemDataSet в lazarus всё нормально работает.
Аватара пользователя
Light13
постоялец
Сообщения: 127
Зарегистрирован: 17.07.2009 07:50:10
Откуда: Челябинск

Сообщение Light13 »

bloodlines писал(а):А мне она и не нужна

как по вашему - где должны храниться данные физически?
Database use in Lazarus (or FreePascal) is fundamentally based on the TDataset class. This represents a table or query to your application. However, like many other such fundamental classes, you don't use the TDataset class it self, you use a descendant of it. There are many of these. They provide access to different kinds of databases, such as local dbase or text files, or back-end databases such as PostgreSQL, Firebird, MySQl and so forth. Some dataset descendants link directly to database tables, while others use additional components or libraries to perform the link.
т.е не рекомендуется, исходя из документации, использовать TDataSet.
Вы так и не ответили, чего же вам надо то?

bloodlines писал(а):То же самое - ничего не изменилось.

Это общая поправка, допустим у вас ошибка создания класса и если переменная класса не будет равна nil - вы получите ошибку при вызове ds.Free, куда вы благополучно и попадете.
Аватара пользователя
bloodlines
постоялец
Сообщения: 100
Зарегистрирован: 05.11.2008 10:26:19

Сообщение bloodlines »

Спасибо. Уже нашёл в доках то же самое. Теперь юзаю TMemdataSet.
Ответить