Форум: "Базы";
Текущий архив: 2003.03.27;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.009 c