Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.27;
Скачать: CL | DM;

Вниз

Программно сформировать RecordSet   Найти похожие ветки 

 
Kerk ©   (2004-05-27 13:21) [0]

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


 
Nikolay M. ©   (2004-05-27 13:44) [1]

Ы?
Сам-то понял, что написал?


 
Kerk ©   (2004-05-27 13:53) [2]

Возможно недостаточно точно выразился...
Вот ты шлешь в базу SQL-запрос, тебе возвращается RecordSet.
А мне нужно написать функцию:
function blabla(aa: integer): RecordSet; (что-то вроде)
чтоб она возвращала RecordSet.

P.S. Вообще с БД почти не работал. Поэтому не пинайте. :P


 
Ega23 ©   (2004-05-27 13:55) [3]

Function CreateQuery(const DbName, QueryText: string;opening:boolean=true;SessName:string="default"):TRxquery;
var Qu:TRxquery;
begin
result:=nil;

 if NoConnectGlb then exit; //@@ 09-10-2001

 try
  Qu:=TRxQuery.Create(Application);
  with Qu do
  begin
   DatabaseName := DbName;
   SessionName := SessName;
   RequestLive:=false;
   SQL.Add(QueryText);
    if opening then Open;
    if opening and isEmpty then Qu:=nil;
   result:=Qu;
  end;
 except on E:exception do
   raise EGPException.Create(E.message+" "+QueryText);
 end;
//    dont forget to Free !!!!
end;

Вот, например.


 
Курдль ©   (2004-05-27 13:55) [4]


> P.S. Вообще с БД почти не работал.


Тогда берешь книжку по БД, с которой "почти не работал" и углубляешься на пару дней. Потом - работаешь.


 
slgeo ©   (2004-05-27 13:56) [5]

>Вот ты шлешь в базу SQL-запрос, тебе возвращается RecordSet
Не RecordSet, а DataSet

А зачем такая функция, можно поинтересоваться?


 
Skyle ©   (2004-05-27 14:01) [6]


> function blabla(aa: integer): RecordSet;

Что такое aaa : Integer?
Что такое RecordSet?
И откуда в этом RecordSet должны быть данные?


 
Kerk ©   (2004-05-27 14:04) [7]


> slgeo ©   (27.05.04 13:56) [5]

Что-то вроде плагинов к AppServer"у. Реализуют бизнес-логику.

> Ega23 ©   (27.05.04 13:55) [3]

Пасибки. Но мне бы на низком уровне. Нужны ADO-шные структуры.

> Курдль ©   (27.05.04 13:55) [4]

Ну так дай мне ссылку на соответствующий мануал по ADO. plz.


 
Kerk ©   (2004-05-27 14:07) [8]


> Что такое aaa : Integer?

Условное обозначение параметров функции. :)

> Что такое RecordSet?

Как мне тут сказали... это DataSet.. В общем, набор записей.

> И откуда в этом RecordSet должны быть данные?

Это может быть либо результатом SQL-запроса, либо заполнено руками.


 
Курдль ©   (2004-05-27 14:08) [9]


> > Курдль ©   (27.05.04 13:55) [4]
>
> Ну так дай мне ссылку на соответствующий мануал по ADO.
> plz.

Москва, угол Мясницкой и Лубянки, Магазин "Библио-глобус"


 
slgeo ©   (2004-05-27 14:12) [10]

>Это может быть либо результатом SQL-запроса, либо заполнено >руками.
Тогда Ega23 тебе все прекрасно расписал в [3], остается только адаптировать это дело к ADO


 
Kerk ©   (2004-05-27 14:15) [11]


> Тогда Ega23 тебе все прекрасно расписал в [3], остается
> только адаптировать это дело к ADO

Так сам принцип мне понятен...
Мне непонятна сама работа с ADO-шными структурами.


 
Danilka ©   (2004-05-27 14:20) [12]


> Это может быть либо результатом SQL-запроса

Запрос к чему? СУБД какая?

И еще, где дальше этот набор данных будет использоваться? Может тебе и не АДО вообще нужно.


 
Ega23 ©   (2004-05-27 14:22) [13]

А TADOQuery разве не является потомком от TDataSet?
Просто спросил...


 
Kerk ©   (2004-05-27 14:24) [14]


> Запрос к чему? СУБД какая?

Без разницы какая... через ADO работаем.

> И еще, где дальше этот набор данных будет использоваться?
> Может тебе и не АДО вообще нужно.

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

В общем, клиент шлет в AppServer SQL-запрос, AppServer всякое там химичит и возвращает этот набор записей, про который мы говорим.


 
Kerk ©   (2004-05-27 14:30) [15]


> Ega23 ©   (27.05.04 14:22) [13]
> А TADOQuery разве не является потомком от TDataSet?
> Просто спросил...

Чего вы тут на VCL зациклились?
Сказал же что набор записей возвращает плагин. Этот плагин может на чем угодно быть написан...


 
slgeo ©   (2004-05-27 14:32) [16]

>2Kerk
>В общем, клиент шлет в AppServer SQL-запрос, AppServer всякое >там химичит и возвращает этот набор записей, про который мы >говорим
Судя по всему у тебя трехзвенка и почитать придеться не только по ADO, но и по MIDAS и TClientDataset


 
Ega23 ©   (2004-05-27 14:35) [17]

Чего вы тут на VCL зациклились?
Сказал же что набор записей возвращает плагин. Этот плагин может на чем угодно быть написан...

Тогда что в твоём понимании RecordSet?


 
Vlad ©   (2004-05-27 14:35) [18]


> Kerk ©   (27.05.04 14:30) [15]

Есть такой тип _RecordSet в Дельфи. (uses ADODB)


 
Vlad ©   (2004-05-27 14:37) [19]


> Ega23 ©   (27.05.04 14:35) [17]

RecordSet - это ADO-шный интерфейс
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/ado270/htm/mdobjodbrec.asp


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


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


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

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


 
Kerk ©   (2004-05-27 14:40) [21]


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

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

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


 
Kerk ©   (2004-05-27 14:47) [22]


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

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

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


 
slgeo ©   (2004-05-27 14:59) [23]

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

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


 
Anatoly Podgoretsky ©   (2004-05-27 14:59) [24]

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


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


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


очень жаль

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


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


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


 
Kerk ©   (2004-05-27 15:13) [26]


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

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


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


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

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


 
Kerk ©   (2004-05-27 15:31) [28]


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

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


 
Digitman ©   (2004-05-27 15:43) [29]


> 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


 
Vlad ©   (2004-05-27 15:47) [30]

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


 
Digitman ©   (2004-05-27 15:49) [31]

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

лучше так :

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

...

procedure SomePROCEDURE;
var
MyInterface: IMyInterface;

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


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

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

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


 
Vlad ©   (2004-05-27 16:02) [33]


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

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


 
Kerk ©   (2004-05-28 15:33) [34]

Спасибо всем... немного разобрался.
Еще вопрос. Как вывести 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.


 
Polevi ©   (2004-05-29 15:16) [35]

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


 
Kerk ©   (2004-05-31 11:47) [36]


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

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


 
Polevi ©   (2004-05-31 12:03) [37]

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;


 
Polevi ©   (2004-05-31 12:04) [38]

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


 
Kerk ©   (2004-06-02 14:38) [39]


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

tx. работает.



Страницы: 1 вся ветка

Текущий архив: 2004.06.27;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.024 c
3-1086020321
Cyber
2004-05-31 20:18
2004.06.27
Построение запроса


6-1083681837
P.D.YU
2004-05-04 18:43
2004.06.27
UDP


1-1087283351
AlexXn
2004-06-15 11:09
2004.06.27
BP и runtime


3-1085942542
Viktor
2004-05-30 22:42
2004.06.27
Перекодировка таблиц


14-1086660624
Думкин
2004-06-08 06:10
2004.06.27
C днем рождения! 8 июня