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

Вниз

SocketConnection   Найти похожие ветки 

 
NN_Nikita   (2003-03-06 18:40) [0]

Прошу помощи!!!

Обращаемся к объекту COM+, который возвращает _Recordset.
При соединении через SocketConnection вылетает следующее сообщение об ошибке:Interface not supported.
При соединении через DCOMConnection все проходит гладко и возвращается recordset.

Объясните в чем ошибка или в каком направлении копать.



ADODataSet1.Recordset := IUnknown(XXXConnection.AppServer.GetStructure(передаваемые параметры) as _Recordset ;



 
NN_Nikita   (2003-03-06 18:41) [1]

Извеняюсь, малость описался

ADODataSet1.Recordset := IUnknown(XXXConnection.AppServer.GetStructure(передаваемые параметры)) as _Recordset ;


 
Serginio   (2003-03-06 19:40) [2]

Используй для передачи данных Провайдера и Клиентдатасет или передавай данные через TclientDataSet.Data.


 
NN_Nikita   (2003-03-06 19:57) [3]

Если использую следующий код

ClientDataSet1.Data:= SocketConnection1.AppServer.GetStructure(
0,
0,
0,
"SA",
"3003",
0);

вылетает ошибка : Invalid data packet


 
NN_Nikita   (2003-03-06 20:02) [4]

В COM+ в функции используется следующий код, возвращающий набор данных

Result := CoRecordset.Create;
Result.CursorLocation := adUseClient;
Result.Open(QRY,ADOConnection1.ConnectionString,
adOpenStatic,adLockBatchOptimistic, adCmdText);


 
Serginio   (2003-03-06 20:22) [5]

Ты пойми как идет передача между SocketConnection, DCOMConnection и как они могут обрабатываться системой. Посмотри исходники TSocketConnection. Лучше передавать данные Через TClientDataSet и проблем меньше а итог тот же.


 
Набережных С.   (2003-03-06 22:26) [6]

ЮNN_Nikita
Так не получится. SocketConnection поддерживает маршаллинг только для IDispatch и IAppServer. На клиентской стороне ты имеешь дело с "эрзац-прокси" в виде TDataDispatch, а он понятия не имеет об интерфейсе _Recordset. Либо переписывай SConnect, либо работай через полученный IDispatch, без AdoDataSet


 
NN_Nikita   (2003-03-07 09:01) [7]

Если объект COM+ передает _recordset как OleVariant, тоже ничего хорошего не получается ( Result := Variant(_recordset)). Может кто приведет пример передачи данных запроса между сервером объекта и клиентом?

Заранее благодарен.


 
BorisUK ©   (2003-03-07 09:51) [8]


> NN_Nikita (07.03.03 09:01)


Скажи плз.. ты из каких источников надыбал такие сложные способы передачи набора данных между клиентом и сервером (ответ обязателен)...
Точнее будет сказать от сервера клиенту... тк наоборот действительно геморно...
Или ты хочешь именно так!!! кака причина?
Все намного прощще... жизнь проще - когда выпьешь пива :)
Совет - выпей пива и используй стандартную связку TProvider -> TClientDataSet
TProvider смотрит на TQury , TTable или TStoredPrec.
TClientDataSet - через него получает доступ к набору данных.
И все делы.




 
NN_Nikita   (2003-03-07 10:03) [9]

В том то и дело, что источников нет. Смотрел разные.pas. В частности ADODB.
Мне необходимо обязательно использовать COM+(MTS) для раздельных баз данных.
Вот и возникли некоторые сложности.
По поводу клиента, переделать не сложно. Только как правильнопередать набор данных запроса из таблиц клиенту от объекта COM+?


 
Polevi ©   (2003-03-07 10:37) [10]

function TDaemon.Select(const SQLString: WideString): OleVariant;
var
Options: TGetRecordOptions;
dsp:TDatasetProvider;
ds:TADODataset;
con:TADOConnection;
RecsOut: Integer;
begin
con:=nil;
ds:=nil;
dsp:=nil;
try
try
con:=TADOConnection.Create(nil);
con.ConnectionString:=FConnectionString;
con.LoginPrompt:=false;
ds:=TADODataset.Create(nil);
ds.Connection:=con;
ds.CommandText:=SQLString;
dsp:=TDatasetProvider.Create(nil);
dsp.DataSet:=ds;
ds.Open;
Options := [grMetaData, grReset];
Result:=dsp.GetRecords(-1, RecsOut, Byte(Options));
SetComplete;
except
SetAbort;
raise;
end;
finally
if Assigned(ds) then ds.Free;
if Assigned(dsp) then dsp.Free;
if Assigned(con) then con.Free;
end;
end;



на клиенте clientDataset.Data:=daemon.Select("SELECT * FROM Test")


 
Polevi ©   (2003-03-07 10:42) [11]

PS

для обращения к COM+ объекту рекомендую не использовать TSocketConnection

лучше так

var
RDS,myComPlusObject:OleVariant;
begin
RDS:=CreateOleObject("RDS.DataSpace");
myComPlusObject:=RDS.CreateObject("MyObject.MyIntf"," HTTP://192.168.1.1");
cds.Data:=myComPlusObject.Select("dfgdfhfgfg");



 
NN_Nikita   (2003-03-07 10:44) [12]

> Polevi
БОЛЬШОЕ СПАСИБО!!!
Если когда нибудь встретимся, с меня пиво.


 
manumba ©   (2003-03-07 11:07) [13]

!!!!!!!!!Код сервера!!!!!!!!!!!!
//Сервер реализует какой-то интерфейс ISQLProcess с функцией //Get_SQLResult
//Реализация этой функции:

function Get_SQLResult(const ASQL_text: WideString): Recordset;
var Data: Recordset;
StrConnection:string;
begin
StrConnection:=CommonUnit.GetADOConnectionString;//строка коннекта
Data := CoRecordset.Create;
Data.CursorLocation := adUseClient;
try
Data.Open(ASQL_text,//твой запрос
StrConnection,//строка коннекта
adOpenKeyset,
adLockBatchOptimistic,
adCmdText
);
Вata.Set_ActiveConnection(nil);
Result := Data;
except
Result:=nil;
Data:=nil;
raise;
end;
end;


!!!!!!!!!!!Код клиента!!!!!!!!!!!!


function TForm1.Get_ISQLProcess: ISQLProcess;
begin
try
{Коннектимся к удаленной машине и получаем нужный нам интерфейс}
Result:=CreateRemoteComObject("server",CLASS_AppServer) as ISQLProcess;
except
Result:=nil;
raise;
end;
end;

procedure TForm1.btnConnectInterfaceClick(Sender: TObject);
var
r: _Recordset;
i: ISQLProcess;
begin
i:=Get_ISQLProcess;//Получили интерфейс сервера

r:=i.Get_SQLResult("select * from user_objects") as _RecordSet;
//Выполнили запрос и получили результат

{Отображаем данные (к ADODataSet привязаны визуальные контроли типа DBGrid)}
ADODataSet1.Recordset:=r;
ADODataSet1.Open;
end;


 
manumba ©   (2003-03-07 11:16) [14]

И вопрос по ходу: поизменял я данные. А как мне их обратно передать на сервер? Как показать серверу, какие данные изменились, какие удалились или добавились?


 
NN_Nikita   (2003-03-07 11:31) [15]

Если используется запрос, данные доступны только для чтения.
Для изменения данных нужно делать update table set поле=значение where условия поиска.
Для изменения данных в таблице нужно открывать саму таблицу, а не использовать Query.
If ClientDataSet1.ApplyUpdates(-1)= 0 then ClientDataSet1.Refresh;
Впрочем может где-то я не прав, т.к. никогда не использую компоненты TTable, TADOTable.


 
Polevi ©   (2003-03-07 11:47) [16]

2manumba © (07.03.03 11:16)

myComPlusObject.Update(cds.Delta)


 
manumba ©   (2003-03-07 13:17) [17]

А если не использовать ClientDataSet, а использовать только ADO? Как в этом случае можно делать update данных?
Дело в том, что сервер должен возвращать данные так, чтобы к нему могли коннектиться клиенты, написанные на разных языках! Для этого я использую ADO. С передачей данных на клиент нет проблем, а вот наоборот....Может есть в АДО стандартный способ сделать, что-то на подобии:
myComPlusObject.Update(cds.Delta)?



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

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

Наверх




Память: 0.51 MB
Время: 0.016 c
1-87923
Vint45
2003-03-17 11:30
2003.03.27
Динамический массив


1-88056
pet
2003-03-15 13:41
2003.03.27
Другое приложение и трей


1-88037
Shappo
2003-03-14 09:02
2003.03.27
Как сделать TPanel прозрачной ?


3-87863
AlexGof
2003-03-07 11:01
2003.03.27
Работа с ADO под SQL Server


7-88267
Ifrit
2003-02-03 19:45
2003.03.27
RTF--->Word и обратно