Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];

Вниз

MIDAS - очень нужно Получить интерфейс провайдера в RDM   Найти похожие ветки 

 
BorisUK   (2003-01-08 09:51) [0]

Вот нашел пример как получить ссылку на интерфейс провайдера в RDM
var
Provider: IProvider;
begin
FCDS := CDS; //параметр процедуры CDS: TClientDataSet
FCount := FCDS.PacketRecords;
//Get the provider;
// Provider := TRemoteServer(CDS.RemoteServer).GetProvider(CDS.ProviderName);
....
Но Наверно это для старых версий MIDAS или что еще..?
В общем на GetProvider матерится..
По описанию в хелпе тоже нет такого метода...
Что можно написать вместо него?


 
Соловьев   (2003-01-08 10:24) [1]

Если ты динамически хочешь получить ссылку, то
В Д5 у TRemoteDataModule есть метод RegisterProvider, после этого провайдер станет доступный удаленному клиенту.


 
Romkin   (2003-01-08 10:52) [2]

В D5 изменен MIDAS, причем прилично. Пример для D4, в D5 нет IProvider, вся работа производится через интерфейс remote data module IAppServer. Там есть все, что надо, просто указываешь имя провайдера.


 
Alexandr   (2003-01-08 10:55) [3]

альтернатива MIDAS, доступная в исходниках лежит здесь

http://www.vglib.com/arch/vghbsrc.zip



 
BorisUK   (2003-01-08 11:03) [4]


> Соловьев (08.01.03 10:24)

There is no need to call RegisterProvider for providers that are added at design time or when the remote data module is assigned as an Owner in the provider’s constructor. These are registered automatically.
У меня все провайдеры находятся в RDM - он для них Owner
следовательно уже можно получить на них ссылку, но КАК?
Вот это и есть вопрос...


 
Romkin   (2003-01-08 11:05) [5]

Нельзя на них ссылку получить!!!
Я же сказал, пользуй методы IAppServer, AS_...
В нем указываешь имя провайдера, и все


 
BorisUK   (2003-01-08 11:40) [6]


> Romkin © (08.01.03 11:05)

Вот как делаю...
Через IApp ... но говорит что IProvider и Variant совместить не может...

unit ClientMain;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBClient, MConnect, MidasCon, SConnect;

type
TForm1 = class(TForm)
ClientDataSet1: TClientDataSet;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
SocketConnection1: TSocketConnection;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

uses
ActiveX, StdVcl, ComObj;

{$R *.DFM}

type
TOpenThread = class(TThread)
private
FCDS: TClientDataSet;
FNewData: OleVariant;
FHitEOF: Boolean;
FCount: Integer;
FStream: Pointer;
protected
procedure Execute; override;
procedure UpdateCDS;
public
constructor Create(CDS: TClientDataSet);
end;

constructor TOpenThread.Create(CDS: TClientDataSet);
var
Provider: IUnknown; //еще так пробовал но тогда
//при получении ваще согласовать не может тип

Provider : IProvider; // Вот так тпри компиляции
// ошибка совмещения типов.

begin
FreeOnTerminate := True;
FCDS := CDS;
FCount := FCDS.PacketRecords;
//Get the provider;

{ Provider := IUnknown(TRemoteServer(CDS.RemoteServer).AppServer.AS_GetProvider(CDS.ProviderName));
// Это вариант если Provider : IProvider}


//Marshall the provider interface into the stream...
OleCheck(CoMarshalInterThreadInterfaceInStream(IProvider, Provider, IStream(FStream)));
inherited Create(False);
end;

procedure TOpenThread.Execute;
var
Prov: IProvider;
RecsOut: Integer;
begin
OleCheck(CoInitialize(nil));
try
//Get the marshalled interface
OleCheck(CoGetInterfaceAndReleaseStream(IStream(FStream), IProvider, Prov));
FHitEOF := False;
while not FHitEOF do
begin
FNewData := Prov.GetRecords(FCount, RecsOut);
FHitEOF := RecsOut <> FCount;
//Update the CDS
Synchronize(UpdateCDS);
end;
finally
CoUninitialize;
end;
end;

procedure TOpenThread.UpdateCDS;
begin
FCDS.AppendData(FNewData, FHitEOF);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
TOpenThread.Create(ClientDataSet1);
end;


 
Romkin   (2003-01-08 11:47) [7]

Еще раз... Нет интерфейса IProvider!!!
Забудь о нем!!!
Тебе данные нужно из провайдера добавить?
cds.Data := CDS.RemoteServer.GetServer.AS_GetRecords(...);


 
BorisUK   (2003-01-08 12:42) [8]


> cds.Data := CDS.RemoteServer.GetServer.AS_GetRecords(...);

Пытаюсь, чтото не выходит... Слишком много параметров не пойму что туда сувать..

procedure TOpenThread.Execute;
var
RecsOut : Integer;

begin
OleCheck(CoInitialize(nil));
try
FHitEOF := False;
while not FHitEOF do
begin
// Это параметры с каторыми вызываем - правильно?
//const ProviderName: WideString,
//Count: Integer;
//out RecsOut: Integer;
//Options: Integer;
// const CommandText: WideString; var Params: OleVariant;
//var OwnerData:OleVariant

FNewData := Prov.GetServer.AS_GetRecords(
( FCDS.ProviderName, {Имя прова}
0, {Суда 0 чтобы все записи забрыть}
RecsOut, {Здесь возвратится номер записи}
//Options: Integer; - сюда что не понятно
FCDS.CommandText {так пробую}
// var Params: OleVariant; - Суда что подставить

);

FHitEOF := RecsOut <> FCount;
//Update the CDS
Synchronize(UpdateCDS);
end;
finally
CoUninitialize;
end;
end;


Может кто поможет разобраться полностью...
Нужно заставить ClientDataSet - получать данные в потоке
чтоб не подвешивались все остальные функции программы.
Задавал этот вопрос на форуме давно. Никто ничего не подсказал.
Вот теперь нашел пример но так понимаю для Delphi4
И не могу переделать.
Кому интересно могу заслать исходник...
Давайте вместе разбираться.


 
BorisUK   (2003-01-08 12:47) [9]

Пока что так сделал , но правильно ли это?
FNewData := Prov.GetServer.AS_GetRecords(FCDS.ProviderName, 0, RecsOut, 1, FCDS.CommandText, EmptyParam, EmptyParam);


 
Romkin   (2003-01-08 13:07) [10]

Мда... Как все запущено....
1. Модель сервера - tmFree или tmBoth
2. По крайней мере TClientDataSet должна создаваться в методе Execute потока (скорее всего - соединение тоже)
3. Если у cds установлены RemoteServer & ProviderName достаточно просто ее открыть :-))
4. А зачем вообще это надо? Что за привычка сыпать тысячи записей сразу? Пользователь за всю жизнь их не просмотрит, а в остальных случаях ВСЕ можно сделать на сервере приложений


 
BorisUK   (2003-01-08 13:24) [11]

Модель серве ра кажись Apartment
главное что Instanсing - Multiple.. стоит
Хочу сделать по примеру PL/SQL Developer
там пока запрос идет можно еще чтонить нажать... прервать его тоже можно
Конечно у меня сделан управляемый Fetch и данные прилетают не все сразу...
Но хотелось научится и в потоке ...
Этот пример для четверки - могу выслать... Сам пока так и не понял как он работает... наверно опыта маловато.
Тем более переколбасить его на Delphi 5...
Ну буду пробовать потихоньку.

> Romkin ©

Хочешь вышлю?


 
Набережных С.   (2003-01-08 15:42) [12]

BorisUK © (08.01.03 13:24)

Получи IAppServer и вместо IProvider передавай в поток его. Так-же, через маршалинг.



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

Форум: "Базы";
Текущий архив: 2003.01.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.04 c
1-86874
?-
2003-01-19 02:34
2003.01.27
Что бы это значило?


14-87110
DDDeN
2003-01-03 18:34
2003.01.27
Раскрутка !!!


1-86925
LSN
2003-01-16 17:34
2003.01.27
Как из Delphi нарисовать табличку в Word


9-86612
LM
2002-07-24 23:05
2003.01.27
SOUND in game


8-86969
dummie
2002-10-10 14:39
2003.01.27
gluBuild2DMipmaps/glTexImage2D и видеопамять...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский