![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программно сформировать RecordSet
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 : и то и другое - не более чем программные интерфейсы, а не куча структурированной инф-ции, соответствующей критериям выборки НД, как тебе, видимо, кажется ...