|
|
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
Всем привет. Имеется один вопросик, который я никак не могу решить. Дело вот в чем. Есть трехзвенная архитектура, для доступа к данным используется ADO, язык программирования VC++. Объект бизнес-логики имеет COM-интерфейс, который позволяет получить данные из определенной талицы с определенными условиями. Данные клиенту передаются в виде отключенного Recordset'а. Клиент может эти данные редактировать и послать Recordset обратно бизнес-логике, которая Update'ит эти данные в БД. Нужно при Update узнать исходный Source Recordset'а (SQL текст, с помощью которого он открывался). Беда в том, что при передаче Recordset'а от бизнес-логики клиенту свойство Source Recordset'а обнуляется и я уже не могу узнать SQL текст, которым открыт Recordset. Может быть кто-нибудь подскажет, как узнать SQL текст, имея Recordset с пустым свойствои Source? Всем заранее спасибо за ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 16:40 |
|
||
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
скорее всего никак. И даже если бы он вас был это мало поможет если несколько пользователей работают. Идеально иметь в каждой таблице и всегда в рекордсете уникальный номер строки . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 17:40 |
|
||
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ. Уже третий день бьюсь над этой проблемой. :( И никак не могу найти простого решения (сложные продумал, но они мне не нравятся). Тогда есть еще один вопросик. Можно ли сделать такой SELECT по таблице (единичной), чтобы в полученном Recordset'е имена полей были в виде - ИмяТаблицы.ИмяПоля? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 17:45 |
|
||
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
Я извнияюсь, может не въехал, а такое решение не годится? Отнаследовать от RecordSet свой класс, добавить туды, все что нужно и передать бизнес-логике, потом получть взад и делать, шо хочешь... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 19:43 |
|
||
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
Была такая мысль. Но проблема в том, что кроме всего прочего, строка с SQL текстом используется для контроля доступа к данным. Клиент не должен иметь доступ к SQL тексту запроса, чтобы не модифицировать его (у открытого Recordset'а свойство Source как раз read only). А так, если вместе с самим Recordset'ом передавать SQL текст, то клиент его может менять, чего не должно быть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2004, 20:09 |
|
||
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
-- Можно ли сделать такой SELECT по таблице (единичной), чтобы в полученном Recordset'е имена полей были в виде - ИмяТаблицы.ИмяПоля? Нет да и смысла нет. компонент ADO в себе содержит имя таблицы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2004, 01:12 |
|
||
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
Уважаемый nick_v! Покажите пожалуйста как Вы связали клиентскую программу с бизнес-объектом на сервере? Я знаю как это сделать в С++ Builder (там есть специальные компоненты), но мне хотелось бы сделать это в VC++. Заранее большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2004, 08:44 |
|
||
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
[quot Lepsik Нет да и смысла нет. компонент ADO в себе содержит имя таблицы[/quot] Уважаемый Lepsik, не могли бы Вы в таком случае подсказать - как из объкта Recordset вытянуть имя таблицы? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2004, 14:28 |
|
||
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
ДжекУважаемый nick_v! Покажите пожалуйста как Вы связали клиентскую программу с бизнес-объектом на сервере? Я знаю как это сделать в С++ Builder (там есть специальные компоненты), но мне хотелось бы сделать это в VC++. Заранее большое спасибо! Ну довольно просто. В первом сообщении я написал, что бизнес-логика - это COM-объект, который позволяет получить данные и обновить их в БД. Клиент просто обращается к этому COM-объекту по DCOM. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.08.2004, 14:31 |
|
||
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
--Уважаемый Lepsik, не могли бы Вы в таком случае подсказать - как из объкта Recordset вытянуть имя таблицы? found only now that you use VC++. My point was about using VCL component TTable which has such info but it is not clear recordset in you case :( Record just has data - no more. That is your responsibility to pass service data ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 01:48 |
|
||
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
Уважаемый nick_v! Не могли бы Вы показать конкретный код или дать ссылку где он показан как в VC++ обращаться к COM-объекту по DCOM? Дело в том что в С++ Builder есть специальный компонент TDCOMConnection которому достаточно установить свойство ComputerName и он выдаст в свойстве ServerName весь список бизнес-объектов, которые зарегистрированы на компьютере с именем ComputerName. А в VC++ я не знаю как это сделать. Заранее большое спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 11:32 |
|
||
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
ДжекУважаемый nick_v! Не могли бы Вы показать конкретный код или дать ссылку где он показан как в VC++ обращаться к COM-объекту по DCOM? Дело в том что в С++ Builder есть специальный компонент TDCOMConnection которому достаточно установить свойство ComputerName и он выдаст в свойстве ServerName весь список бизнес-объектов, которые зарегистрированы на компьютере с именем ComputerName. А в VC++ я не знаю как это сделать. Заранее большое спасибо! Ну вот, например, такой кусок кода создает объект на удаленном компьютере (разумеется, надо настроить DCOM на клиенте и на сервере с помощью dcomcnfg): COSERVERINFO csi, *pServer = NULL; MULTI_QI mQI; WCHAR wServer[_MAX_PATH]; HRESULT hr = S_OK; mQI.pIID = &IID_InterfaceID; mQI.pItf = NULL; mQI.hr = S_OK; memset(&csi, 0, sizeof(COSERVERINFO)); MultiByteToWideChar(CP_ACP,0,_Server_Name, -1, wServer, MAX_PATH); csi.pwszName = wServer; if (если имя удаленной машины пустое) pServer = NULL; else pServer = &csi; hr = CoCreateInstanceEx(CLSID_ClassID,NULL,CLSCTX_SERVER, pServer,1,&mQI); hr = mQI.hr; if (FAILED(hr)) { MessageBox("Не удалось создать удаленный объект"); return; } m_pObject= (Interface*)mQI.pItf; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.08.2004, 15:27 |
|
||
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
Уважаемый nick_v! Спасибо большое за код! Я создал ещё один COM-объект для сервера, подключил его к клиентскому объекту так: #import "..\ServObj.tlb" no_namespace Но никаких объектов подобных IID_... мастер ATL в серверном объекте не создал. Может я неправильно ссылаюсь на код серверного объекта#import "..\ServObj.tlb" no_namespace? Буду очень благодарен если Вы объясните откуда берёте IID_InterfaceID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2004, 12:57 |
|
||
|
Вопрос про ADOшный Recordset
|
|||
|---|---|---|---|
|
#18+
ДжекУважаемый nick_v! Спасибо большое за код! Я создал ещё один COM-объект для сервера, подключил его к клиентскому объекту так: #import "..\ServObj.tlb" no_namespace Но никаких объектов подобных IID_... мастер ATL в серверном объекте не создал. Может я неправильно ссылаюсь на код серверного объекта#import "..\ServObj.tlb" no_namespace? Буду очень благодарен если Вы объясните откуда берёте IID_InterfaceID. Есть несколько способов подключения COM-объекта в VC++. В Вашем случае, при импортировании Type Library создаются два файла - с расширением .tlh и .tli. Посмотрите файл .tlh - там должно быть определение вашего объекта со всеми GUID'ами. IID_InterfaceID - это просто пример GUID'а интерфейса, к которому будет обращаться клиент. В вашем случае, конечно, будет другой IID_. Кроме того, если COM-объект написан на VC++, то в папке проекта есть файл *_i.c, в котром также содержится определение всех GUID'ов вашего объекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.08.2004, 14:58 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=436&tid=2034526]: |
0ms |
get settings: |
5ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
26ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 180ms |
| total: | 266ms |

| 0 / 0 |
