|
|
|
Forum Guru
      
участник
Last Login: 06.12.2001 17:40
Сообщ.: 50,
Visits: 551
|
|
Здравствуйте !
Хорошо если удается связать эти компоненты на этапе проектирования. Но у меня сложилась такая ситуация: Запрос генерируеться пользователем и не известен наперед. Когда компоненты инициализируются выдается ошибка о том, что не найден источник данных (собственно так оно и есть). Как побороть такую ситуацию ?
|
|
|
|
|
Forum 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
|
|
|
|
|
Forum Guru
      
участник
Last Login: 06.12.2001 17:40
Сообщ.: 50,
Visits: 551
|
|
Спасибо за ответ, John !
В принципе я делаю то же. Но у меня создалось такое впечатление, что если эти компоненты завязаны на этапе проектирования, то при инициализации их на этапе выполнения ADO control пытается подключиться к источнику данных. Это у него не получается, поскольку последний задается только после инициализации ActiveX. Доступ к перечисленным тобой методам я ведь могу получить только после инициализации.
Я нашел чудный метод в CDataGrid - SetRefDataSource(LPUNKNOWN newValue); Но мне не хватает знаний MFC для понимания как ему собственно передать этот LPUNKNOWN. Он должет как-то получаться из класса CAdodc, как я понимаю.
Есть по этому поводу какие-нибудь идеи ?
|
|
|
|
|
Forum 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.
Удачи.
|
|
|
|
|
Forum Guru
      
участник
Last Login: 06.12.2001 17:40
Сообщ.: 50,
Visits: 551
|
|
Не сочти за труд, ответь на такой вопрос: я вижу как все обращаются к контролам через их переменные. Однако, когда я пытаюсь к ним обратиться у меня возникает ошибка (на рантайме). Мне приходиться в каждой функции делать операцию вида CAdodc* ptmpMainCrdCtl = (CAdodc*) GetDlgItem(IDC_MAINADODC); а потом ptmpMainCrdCtl->
Я только начал писать на МFC и не совсем понимаю этой проблемы. Где я глюканул ?
|
|
|
|
|
Forum Member
      
участник
Last Login: 15.03.2007 17:40
Сообщ.: 40,
Visits: 396
|
|
Это просто. Для каждого своего окна ты определяешь класс. Нарисовал окно и кликни на нем правой кнопкой мыши и выбери ClassWizard (или держи Ctrl и два раза мышкой). После определения класса окна выбери в ClassWizard закладку Member variables, выбери контрол, для которого хочешь определить переменную и нажми кнопку Add Variable... Там укажи тип ее и имя. И дальше ты можешь ее использовать по своему усмотрению. Если что-то не понял, спрашивай, не стесняйся. Удачи.
|
|
|
|
|
Forum 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.
Заранее благодарен.
|
|
|
|
|
Supreme 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-объектами, в отличие от тех, кто их создает) это не нужно.
С уважением, Владимир.
|
|
|
| | |