ADO Control + DB Grid ?
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



ADO Control + DB Grid ? Expand / Collapse
Автор
Сообщение
02.07.2001 16:42
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 06.12.2001 17:40
Сообщ.: 50, Visits: 551
Здравствуйте !

Хорошо если удается связать эти компоненты на этапе проектирования. Но у меня сложилась такая ситуация: Запрос генерируеться пользователем и не известен наперед. Когда компоненты инициализируются выдается ошибка о том, что не найден источник данных (собственно так оно и есть). Как побороть такую ситуацию ?
Сообщ. #714814
03.07.2001 14:13
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 15.03.2007 17:40
Сообщ.: 40, Visits: 396
Я делал примерно следующее (правда применимо к ORADC Oracl и DBGrid, но, думаю с ADO где то так же):
1.Помещал на форму ORADC и DBGrid
2.Связывал DBGrid с ORADC
3.А в OnInitialUpdate окна (или в другом обработчике) писал следующее:

CString strConnect = user + "/" + password;
m_oradc.SetConnect (strConnect);
m_oradc.SetDatabaseName (dbname);
CString sSQL = "SELECT ....";
m_oradc.SetRecordSource(sSql);
m_oradc.Refresh (); // где m_oradc есть member variable of ORADC
Сообщ. #714972
03.07.2001 14:44
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 06.12.2001 17:40
Сообщ.: 50, Visits: 551
Спасибо за ответ, John !

В принципе я делаю то же. Но у меня создалось такое впечатление, что если эти компоненты завязаны на этапе проектирования, то при инициализации их на этапе выполнения ADO control пытается подключиться к источнику данных. Это у него не получается, поскольку последний задается только после инициализации ActiveX.

Доступ к перечисленным тобой методам я ведь могу получить только после инициализации.

Я нашел чудный метод в CDataGrid - SetRefDataSource(LPUNKNOWN newValue);
Но мне не хватает знаний MFC для понимания как ему собственно передать этот LPUNKNOWN. Он должет как-то получаться из класса CAdodc, как я понимаю.

Есть по этому поводу какие-нибудь идеи ?
Сообщ. #714976
03.07.2001 15:07
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 15.03.2007 17:40
Сообщ.: 40, Visits: 396
Попробуй следующее:
.......

m_recordSet.CreateInstance( __uuidof(Recordset));

try
{
m_recordSet->Open((LPCSTR) strTableName, (LPCSTR) m_strConnect, adOpenKeyset,adLockReadOnly , adCmdTable);
}
catch ....
{
}

m_myDataGrid.SetRefDataSource(NULL);
m_myDataGrid.SetRefDataSource( (LPUNKNOWN) m_recordSet );
Вот последняя строчка и есть ответ. Это RecordSet приведенный к типу LPUNKNOWN.

Удачи.
Сообщ. #714978
03.07.2001 15:54
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 06.12.2001 17:40
Сообщ.: 50, Visits: 551
Не сочти за труд, ответь на такой вопрос:
я вижу как все обращаются к контролам через их переменные. Однако, когда я пытаюсь к ним обратиться у меня возникает ошибка (на рантайме).
Мне приходиться в каждой функции делать операцию вида
CAdodc* ptmpMainCrdCtl =
(CAdodc*) GetDlgItem(IDC_MAINADODC);
а потом ptmpMainCrdCtl->

Я только начал писать на МFC и не совсем понимаю этой проблемы.
Где я глюканул ?
Сообщ. #714992
03.07.2001 17:19
Forum Member

Forum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum MemberForum Member

участник
Last Login: 15.03.2007 17:40
Сообщ.: 40, Visits: 396
Это просто. Для каждого своего окна ты определяешь класс. Нарисовал окно и кликни на нем правой кнопкой мыши и выбери ClassWizard (или держи Ctrl и два раза мышкой). После определения класса окна выбери в ClassWizard закладку Member variables, выбери контрол, для которого хочешь определить переменную и нажми кнопку Add Variable... Там укажи тип ее и имя. И дальше ты можешь ее использовать по своему усмотрению. Если что-то не понял, спрашивай, не стесняйся.
Удачи.
Сообщ. #715010
03.07.2001 17:48
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 06.12.2001 17:40
Сообщ.: 50, Visits: 551
Спасибо за совет.
Именно так я и делал. Причем при такой операции
визард добавляет код вида
DDX_Control(pDX, IDC_MAINGRID, m_MainGrid);
Как я понимаю это некоторая связка, между ресурсами и классами.
Так ?

И еще вопрос
m_recordSet.CreateInstance( __uuidof(Recordset));
Что за магическое __uuidof(Recordset)?
И какаго типа m_recordSet, как я понимаю CRecordset.

Заранее благодарен.
Сообщ. #715022
03.07.2001 20:48
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 10.11.2008 0:08
Сообщ.: 1 298, Visits: 12 501
uuid - Universal Unique IDentifier (из области COM-объектов),
а __uuidof(Recordset), видимо, возвращает этот идентификатор для стандартного для Microsoft COM-объекта Recordset. Это насколько я могу прикинуть сразу, а так взгляни в MSDN, там должно быть написано.

Но простому смертному (я про тех кто работает с COM-объектами, в отличие от тех, кто их создает) это не нужно.

С уважением, Владимир.
Сообщ. #715059