Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Программно сформировать RecordSet


Страницы:   1 2

Kerk ©   (2004-05-27 13:21:00) 

Т.е. функция должна возвращать RecordSet созданный самостоятельно. Как это сделать?


Kerk   (2004-06-02 14:38:00) [1]


> Polevi ©   (31.05.04 12:04) [38]

tx. работает.


Polevi   (2004-05-31 12:04:00) [2]

ибо нефиг добавлять записи в рекордсет в котором нет ни одного поля


Polevi   (2004-05-31 12:03:00) [3]

uses ComObj;

procedure TForm1.Button1Click(Sender: TObject);
var
 rs:OleVariant;
begin
 rs:=CreateOleObject('ADODB.Recordset');
 rs.Fields.Append('Test',3);
 rs.Open;
 rs.AddNew;
 rs.Fields['Test'].Value:=666;
 rs.Update;
 ADODataset1.Recordset:=IUnknown(rs) as _Recordset;
end;


Kerk   (2004-05-31 11:47:00) [4]


> Polevi ©   (29.05.04 15:16) [35]

В смысле открыть? Он же с источником данных не ассоциирован.


Polevi   (2004-05-29 15:16:00) [5]

открыть не пробовал ?


Kerk   (2004-05-28 15:33:00) [6]

Спасибо всем... немного разобрался.
Еще вопрос. Как вывести Recordset из режима ReadOnly?
::CoInitialize(NULL);

_RecordsetPtr rs("ADODB.Recordset");
_variant_t a(("test"));

rs.CreateInstance(__uuidof(Recordset));
if (rs->Supports(adAddNew))
  rs->AddNew(a,a);

Что бы я не делал, rs->Supports(adAddNew) возвращает False.


Vlad   (2004-05-27 16:02:00) [7]


> Sandman25+1   (27.05.04 15:57) [32]

То же самое, только ADODataSet вместо ClientDataSet и в кач-ве Result - ADODataSet.RecordSet
(я так думаю)


Sandman25+1   (2004-05-27 15:57:00) [8]

Может, я и не в тему, но ...

procedure TMyServer.GetMyData(...): OleVariant;
begin
 with TClientDataSet.Create(nil) do
   try
     FieldDefs.Add(...);
     ...
     CreateDataSet;
     AppendRecord(...);
     // или  Insert; ... Post;;
     ...
     Result := Data;
   finally
     Free;
   end;
end;


Digitman   (2004-05-27 15:49:00) [9]

не оч удачный, кажется, пример : включенный оптимизатор, скорей всего, пошлет меня на http://www.lleo.aha.ru/na) .. проверять не буду. но - скорей всего ...

лучше так :

function GetmyInterfacedObject: IMyInterface;
begin
Result := TMyIntfClass.Create; //ЗДЕСЬ ставишь брейкпойнт
end;

...

procedure SomePROCEDURE;
var
MyInterface: IMyInterface;

begin
MyInterface := GetmyInterfacedObject;
end; // ТО ЧТО ТВОРИТСЯ ЗДЕСЬ В ДАННОМ (!!) КОНТЕКСТЕ - КРАЙНЕ ВАЖНО !!


Vlad   (2004-05-27 15:47:00) [10]

Вот тут есть неплохой пример работы с Recordset
http://www.delphiworld.narod.ru/base/mssql_unit.html


Digitman   (2004-05-27 15:43:00) [11]


> Kerk ©   (27.05.04 15:31) [28]


давай так- чтобы понять "сложное", начни с заведомо простого : объяви произвольный интерфейс , создай произвольный класс-наследник TInterfacedObject, программно обратись к нему и оттрассируй это обращение пошагово ! у тебя появятся конкретные вопросы, на которые здесь будут даны и конкретные ответы ..

IMyInterface = interface
end;

TMyIntfClass = class(TInterfacedObject, IMyInterface)
end;

...

procedure GetmyInterfacedObject;
var
MyInterface: IMyInterface;
begin
MyInterface := TMyIntfClass.Create; //ЗДЕСЬ ставишь брейкпойнт
end; // и трассируешь ПОШАГОВО весь алгоритм, вникая в каждую asm-подробность, пока не встретится asm-инструкция RET


Kerk   (2004-05-27 15:31:00) [12]


> Vlad ©   (27.05.04 15:26) [27]

а как я буду их освобождать, если я создаю экземпляр интерфейса, заполняю данные, передаю указатель на него и завершаюсь?


Vlad   (2004-05-27 15:26:00) [13]


> Kerk ©   (27.05.04 15:13) [26]

Ты передаешь не интерфейс, а указатель на него, соотв. нужно позаботиться, чтобы все переменные, которым присвоен этот указатель были освобождены в конце - это уже твоя забота.


Kerk   (2004-05-27 15:13:00) [14]


> где "там" ? и какие "проблемы" ?

"там" - в экземпляре интерфейса..
при передаче его туда-сюда, что будет с RefCount?


Digitman   (2004-05-27 15:10:00) [15]


> процедура должна создать экземпляр интерфейса (не силен
> в терминологии)


очень жаль

если терминологически предположить, что ADO - это объект. то говорят так : такой-то функциональный метод такого-то объекта возвращает как результат такой-то интерфейс такого-то объекта


> а там проблем с RefCount не будет?


где "там" ? и какие "проблемы" ?


Anatoly Podgoretsky   (2004-05-27 14:59:00) [16]

Kerk ©   (27.05.04 14:47) [22]
Как это делается можно подсмотреть в исходниках VCL


slgeo   (2004-05-27 14:59:00) [17]

> Kerk ©   (27.05.04 14:47) [22]

Поле RefCount класса TInterfacedObject служит счетчиком вызовов интерфейсного объекта и используется по принятой в Windows схеме: при каждом обращении к методу Add интерфейса IUnknown счетчик наращивается на единицу, при каждом обращении к Release - на единицу сбрасывается. Когда значение этого поля становится равно 0, интерфейсный объект уничтожается и освобождается занимаемая им память.


Kerk   (2004-05-27 14:47:00) [18]


> Digitman ©   (27.05.04 14:39) [20]

значит процедура должна создать экземпляр интерфейса (не силен в терминологии)... потом передать ссылку на него... и т.д.

а там проблем с RefCount не будет?


Kerk   (2004-05-27 14:40:00) [19]


> slgeo ©   (27.05.04 14:32) [16]

А нельзя просто показать как это делается?... Неужели я так много прошу.. Не думаю, что какой-то глобальный вопрос затронул.
Книжки я потом обязательно прочитаю.

П.С. Сам не люблю когда в подобном тоне говорят, но ты уж извини, времени на книжки совсем нет.


Digitman   (2004-05-27 14:39:00) [20]


> Kerk ©   (27.05.04 14:24) [14]


во избежание никчемных обоюдных инсинуаций, просто недоразумений и флагов с надписью "LMD" все что от тебя требовалось - сразу же обозначить. что под сабжем подразумевается интерфейс. возвращаемый такими-то методами ADO-объектов  ... равно, впрочем, как и не-ADO : метод DAO.DBEngine.Workspace.Database.OpenRecordset точно так же возвращает ИНТЕРФЕЙС уаправления набором данных

в этом плане борландовский термин-идентификатор TDataSet мало чем отличается от мелкомягкого традиционного RecordSet : и то и другое - не более чем программные интерфейсы, а не куча структурированной инф-ции, соответствующей критериям выборки НД, как тебе, видимо, кажется ...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо