powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос про ADOшный Recordset
14 сообщений из 14, страница 1 из 1
Вопрос про ADOшный Recordset
    #32653305
nick_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Имеется один вопросик, который я никак не могу решить.
Дело вот в чем. Есть трехзвенная архитектура, для доступа к данным используется ADO, язык программирования VC++. Объект бизнес-логики имеет COM-интерфейс, который позволяет получить данные из определенной талицы с определенными условиями. Данные клиенту передаются в виде отключенного Recordset'а. Клиент может эти данные редактировать и послать Recordset обратно бизнес-логике, которая Update'ит эти данные в БД. Нужно при Update узнать исходный Source Recordset'а (SQL текст, с помощью которого он открывался). Беда в том, что при передаче Recordset'а от бизнес-логики клиенту свойство Source Recordset'а обнуляется и я уже не могу узнать SQL текст, которым открыт Recordset. Может быть кто-нибудь подскажет, как узнать SQL текст, имея Recordset с пустым свойствои Source?
Всем заранее спасибо за ответы.
...
Рейтинг: 0 / 0
Вопрос про ADOшный Recordset
    #32653465
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скорее всего никак. И даже если бы он вас был это мало поможет если несколько пользователей работают.
Идеально иметь в каждой таблице и всегда в рекордсете уникальный номер строки .
...
Рейтинг: 0 / 0
Вопрос про ADOшный Recordset
    #32653479
nick_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответ. Уже третий день бьюсь над этой проблемой. :( И никак не могу найти простого решения (сложные продумал, но они мне не нравятся). Тогда есть еще один вопросик. Можно ли сделать такой SELECT по таблице (единичной), чтобы в полученном Recordset'е имена полей были в виде - ИмяТаблицы.ИмяПоля?
...
Рейтинг: 0 / 0
Вопрос про ADOшный Recordset
    #32653632
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я извнияюсь, может не въехал, а такое решение не годится?
Отнаследовать от RecordSet свой класс, добавить туды, все что нужно и передать бизнес-логике, потом получть взад и делать, шо хочешь...
...
Рейтинг: 0 / 0
Вопрос про ADOшный Recordset
    #32653644
nick_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Была такая мысль. Но проблема в том, что кроме всего прочего, строка с SQL текстом используется для контроля доступа к данным. Клиент не должен иметь доступ к SQL тексту запроса, чтобы не модифицировать его (у открытого Recordset'а свойство Source как раз read only). А так, если вместе с самим Recordset'ом передавать SQL текст, то клиент его может менять, чего не должно быть.
...
Рейтинг: 0 / 0
Вопрос про ADOшный Recordset
    #32653763
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-- Можно ли сделать такой SELECT по таблице (единичной), чтобы в полученном Recordset'е имена полей были в виде - ИмяТаблицы.ИмяПоля?

Нет да и смысла нет. компонент ADO в себе содержит имя таблицы
...
Рейтинг: 0 / 0
Вопрос про ADOшный Recordset
    #32653869
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый nick_v!
Покажите пожалуйста как Вы связали клиентскую
программу с бизнес-объектом на сервере?
Я знаю как это сделать в С++ Builder (там есть специальные компоненты),
но мне хотелось бы сделать это в VC++.
Заранее большое спасибо!
...
Рейтинг: 0 / 0
Вопрос про ADOшный Recordset
    #32654849
nick_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Lepsik
Нет да и смысла нет. компонент ADO в себе содержит имя таблицы[/quot]

Уважаемый Lepsik, не могли бы Вы в таком случае подсказать - как из объкта Recordset вытянуть имя таблицы?
...
Рейтинг: 0 / 0
Вопрос про ADOшный Recordset
    #32654857
nick_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДжекУважаемый nick_v!
Покажите пожалуйста как Вы связали клиентскую
программу с бизнес-объектом на сервере?
Я знаю как это сделать в С++ Builder (там есть специальные компоненты),
но мне хотелось бы сделать это в VC++.
Заранее большое спасибо!

Ну довольно просто. В первом сообщении я написал, что бизнес-логика - это COM-объект, который позволяет получить данные и обновить их в БД. Клиент просто обращается к этому COM-объекту по DCOM.
...
Рейтинг: 0 / 0
Вопрос про ADOшный Recordset
    #32655808
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Уважаемый 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
...
Рейтинг: 0 / 0
Вопрос про ADOшный Recordset
    #32656302
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый nick_v!
Не могли бы Вы показать конкретный код или дать ссылку где он показан
как в VC++ обращаться к COM-объекту по DCOM?
Дело в том что в С++ Builder есть специальный компонент TDCOMConnection
которому достаточно установить свойство ComputerName и он выдаст в свойстве ServerName весь список бизнес-объектов, которые зарегистрированы на компьютере с именем ComputerName. А в VC++ я не знаю как это сделать.
Заранее большое спасибо!
...
Рейтинг: 0 / 0
Вопрос про ADOшный Recordset
    #32657133
nick_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДжекУважаемый 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;
...
Рейтинг: 0 / 0
Вопрос про ADOшный Recordset
    #32658797
Джек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уважаемый nick_v!
Спасибо большое за код!
Я создал ещё один COM-объект для сервера, подключил его к
клиентскому объекту так:
#import "..\ServObj.tlb" no_namespace
Но никаких объектов подобных IID_... мастер ATL в серверном объекте не создал. Может я неправильно ссылаюсь на код серверного объекта#import "..\ServObj.tlb" no_namespace? Буду очень благодарен если Вы
объясните откуда берёте IID_InterfaceID.
...
Рейтинг: 0 / 0
Вопрос про ADOшный Recordset
    #32659224
nick_v
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ДжекУважаемый 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'ов вашего объекта.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос про ADOшный Recordset
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]