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

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

SocketConnection [D7, Win2k]


NN_Nikita ©   (2003-03-06 18:40:00) 

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

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

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



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


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

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


Polevi   (2003-03-07 11:47:00) [2]

2manumba © (07.03.03 11:16)

myComPlusObject.Update(cds.Delta)


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

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


manumba   (2003-03-07 11:16:00) [4]

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


manumba   (2003-03-07 11:07:00) [5]

!!!!!!!!!Код сервера!!!!!!!!!!!!
//Сервер реализует какой-то интерфейс 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;


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

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


Polevi   (2003-03-07 10:42:00) [7]

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");


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

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")


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

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


BorisUK   (2003-03-07 09:51:00) [10]


> NN_Nikita (07.03.03 09:01)


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



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

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

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


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

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


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

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


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

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

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


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

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

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

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


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

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


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

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

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


Наверх

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