Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.008 c
6-88115
JamesBond
2003-02-05 19:08
2003.03.27
IdSMTP1


3-87883
T{}r(l-l
2003-03-11 11:12
2003.03.27
Cursor+MSSQL


1-87921
San
2003-03-13 17:39
2003.03.27
CHARSET


3-87864
SVA
2003-03-11 09:48
2003.03.27
Помогите с Select


4-88305
LeReve
2003-01-30 23:02
2003.03.27
Есть ли АПИ сжатия данных????





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский