Помогите ADO чайнику.
Вот такой кусок кода прекрасно работает на компьютере, где он компилировался VC++(6.0),
но при переносе на другую рабочую станцию попытка открыть набор записей бросает
исключение.
//-----------------------------------------------------------
try{
m_pConnection.CreateInstance(__uuidof(Connection));
m_pRecordset.CreateInstance(__uuidof(Recordset));
m_pConnection->Open(
_T("Provider=SQLOLEDB.1;Data Source=PASHA;"
"Initial Catalog=COMMON;UID=sa;PWD=;"),"","",-1);
m_pRecordset->Open("SELECT DISTINCT inn FROM closed",
theApp.m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
...
//-----------------------------------------------------------
на "другой" станции установлен MDAC 2.0 с того-же диска, что и VC++.
Аналогичный по смыслу кусок на шаблонах OLE-DB работает и там и там.
Здравствуйте Satrap, Вы писали:
S>Помогите ADO чайнику.
S>Вот такой кусок кода прекрасно работает на компьютере, где он компилировался VC++(6.0),
S>но при переносе на другую рабочую станцию попытка открыть набор записей бросает
S>исключение.
S>S>//-----------------------------------------------------------
S>try{
S> m_pConnection.CreateInstance(__uuidof(Connection));
S> m_pRecordset.CreateInstance(__uuidof(Recordset));
S>
а что говорит
catch(_com_error &e)
{
MessageBox(0, e.Source()+" "+e.Description(), "Ошибка", MB_OK);
}
?
S>S> m_pConnection->Open(
S> _T("Provider=SQLOLEDB.1;Data Source=PASHA;"
S> "Initial Catalog=COMMON;UID=sa;PWD=;"),"","",-1);
Может, на той машине, где VC, установлена (и импортируется) ADO посвежее?
S> m_pRecordset->Open("SELECT DISTINCT inn FROM closed",
S> theApp.m_pConnection.GetInterfacePtr(),
S> adOpenDynamic,
S> adLockOptimistic,
S> adCmdText);
S>...
S>//-----------------------------------------------------------
S>
S>на "другой" станции установлен MDAC 2.0 с того-же диска, что и VC++.
S>Аналогичный по смыслу кусок на шаблонах OLE-DB работает и там и там.
Здравствуйте retalik, Вы писали:
R>а что говорит
R>R>catch(_com_error &e)
R>{
R> MessageBox(0, e.Source()+" "+e.Description(), "Ошибка", MB_OK);
R>}
R>
R>?
Выглядит вот так:
catch(_com_error *e)
{
CString Error = e->ErrorMessage();
AfxMessageBox(e->ErrorMessage());
}
catch(...)
{
MessageBox(_T("Исключение не обработано"));
}
А при ответе, к сожалению, неизменно выбирает второй обработчик, а чего там ловить
я увы не представляю.
Большое спасибо.
Здравствуйте Аноним, Вы писали:
А>Здравствуйте retalik, Вы писали:
А>Выглядит вот так:
А>А> catch(_com_error *e)
А> {
А> CString Error = e->ErrorMessage();
А> AfxMessageBox(e->ErrorMessage());
А> }
А> catch(...)
А> {
А> MessageBox(_T("Исключение не обработано"));
А> }
А>
А>А при ответе, к сожалению, неизменно выбирает второй обработчик, а чего там ловить
И это правильно! (с) не мое.
Так как _com_error* и _com_error — это разные типы, а при ошибке смарт-пойнтеры неизменно бросают _com_error по значению, то первый обработчик и не выбирается.
Измени обработчик на _com_error&, и он неизбежно сработает, клянусь моей треуголкой!

(с) не мое.
PS: и еще Description() обязательно выводи, может помочь.
Здравствуйте retalik, Вы писали:
R>Измени обработчик на _com_error&, и он неизбежно сработает, клянусь моей треуголкой!
(с) не мое.
R>PS: и еще Description() обязательно выводи, может помочь.
Обработчик сработал, но упорно возвращал пустые строки даже на провоцируемые ошибки, а вот установка ADO 2.6
сняла вопрос в принципе!!!!! Бальшое пасибо!