Оказывается надо столбцы вызывать по порядку и тогда проблем не будет.
Выходит, что оракловский драйвер "does not support extensions to SQLGetData" — вот это да.
Подскажиет, кто знает..
Проблема:
Испульзуя класс CRecordset подключаюсь через ODBC к Oracle'кой базе.....
Все норамально работает если использую "Oracle ODBC Drivers"
когда же стал подклюсаться через "Microsoft ODBC for Oracle"..выдаеться постоянно ошибка
"No columns were bound prior to calling SQLFetchScroll/SQLExtendedFetch"
Кто знает подскажите, так как надо обязательно под microsoft'овским подключаться....
Здравствуйте Izverg, Вы писали:
I>Подскажиет, кто знает.. I>Проблема: I>Испульзуя класс CRecordset подключаюсь через ODBC к Oracle'кой базе..... I>Все норамально работает если использую "Oracle ODBC Drivers" I>когда же стал подклюсаться через "Microsoft ODBC for Oracle"..выдаеться постоянно ошибка I>"No columns were bound prior to calling SQLFetchScroll/SQLExtendedFetch" I>Кто знает подскажите, так как надо обязательно под microsoft'овским подключаться....
Давно это было... Вроде, драйвер ODBC старенький попался. Поставь MDAC 2.6 и сообщи результат :)
ЗЫ: А вообще-то, ораклиный быстрее был! Только желательно тоже с technet.oracle.com скачать поновее.
Здравствуйте retalik, Вы писали:
R>Здравствуйте Izverg, Вы писали:
I>>Подскажиет, кто знает.. I>>Проблема: I>>Испульзуя класс CRecordset подключаюсь через ODBC к Oracle'кой базе..... I>>Все норамально работает если использую "Oracle ODBC Drivers" I>>когда же стал подклюсаться через "Microsoft ODBC for Oracle"..выдаеться постоянно ошибка I>>"No columns were bound prior to calling SQLFetchScroll/SQLExtendedFetch" I>>Кто знает подскажите, так как надо обязательно под microsoft'овским подключаться....
R>Давно это было... Вроде, драйвер ODBC старенький попался. Поставь MDAC 2.6 и сообщи результат :)
R>ЗЫ: А вообще-то, ораклиный быстрее был! Только желательно тоже с technet.oracle.com скачать поновее.
Да ставил и 2.6 и 2.7 beta пробовал, все равно ни как..:(
Здравствуйте Izverg, Вы писали:
I>Здравствуйте retalik, Вы писали:
R>>Здравствуйте Izverg, Вы писали:
I>>>Подскажиет, кто знает.. I>>>Проблема: I>>>Испульзуя класс CRecordset подключаюсь через ODBC к Oracle'кой базе..... I>>>Все норамально работает если использую "Oracle ODBC Drivers" I>>>когда же стал подклюсаться через "Microsoft ODBC for Oracle"..выдаеться постоянно ошибка I>>>"No columns were bound prior to calling SQLFetchScroll/SQLExtendedFetch" I>>>Кто знает подскажите, так как надо обязательно под microsoft'овским подключаться....
R>>Давно это было... Вроде, драйвер ODBC старенький попался. Поставь MDAC 2.6 и сообщи результат :)
R>>ЗЫ: А вообще-то, ораклиный быстрее был! Только желательно тоже с technet.oracle.com скачать поновее.
I>Да ставил и 2.6 и 2.7 beta пробовал, все равно ни как..:(
У меня установлен, по-моему, MDAC 2.5 (с SP4).
Решил я, значит, проверить это дело. Сляпал тестовый проектик, запускаю — а он мне такую же ошибку выдает!
Найдя челюсть где-то на полу, я немного исправил вызов CRecordset::Open. Такой код работает:
CDatabase db;
db.Open("Ora"); // dsn указывает на Microsoft ODBC for Oracle, v. 2.573.4403.00 от 25.08.00
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, "SELECT SIN(.5) s FROM dual");
CString val;
if(rs.IsEOF()) val="Eof!";
else rs.GetFieldValue("S", val);
MessageBox(val);
Первоначально было так:
rs.Open(AFX_DB_USE_DEFAULT_TYPE, "SELECT SIN(.5) s FROM dual");
R>У меня установлен, по-моему, MDAC 2.5 (с SP4). R>Решил я, значит, проверить это дело. Сляпал тестовый проектик, запускаю — а он мне такую же ошибку выдает! R>Найдя челюсть где-то на полу, я немного исправил вызов CRecordset::Open. Такой код работает: R>
R> CDatabase db;
R> db.Open("Ora"); // dsn указывает на Microsoft ODBC for Oracle, v. 2.573.4403.00 от 25.08.00
R> CRecordset rs(&db);
R> rs.Open(CRecordset::forwardOnly, "SELECT SIN(.5) s FROM dual");
R> CString val;
R> if(rs.IsEOF()) val="Eof!";
R> else rs.GetFieldValue("S", val);
R> MessageBox(val);
R>
R>Первоначально было так: R>
R> rs.Open(AFX_DB_USE_DEFAULT_TYPE, "SELECT SIN(.5) s FROM dual");
R>
R>Если проблемы остаются, код — в студию! :)
Спасибо за совет..все заработало...Единственно Если через CDatabase стучаться к базе, то все работает...
а если используя только CRecordset, то нифига. и почему работает только если параметр forwardOnly стоит в остальных ошибку выдает...
Кстати не подскажешь где моя ошибка...
Проблема вот вчем...я не могу получить значение типа "numeric" выдаеться ошибка:
"Error in column 1: Numeric value out of range" (со строковыми все в порядке)
I>Спасибо за совет..все заработало...Единственно Если через CDatabase стучаться к базе, то все работает... I>а если используя только CRecordset, то нифига. и почему работает только если параметр forwardOnly стоит в остальных ошибку выдает...
Через CRecordset не работает по той же причине — при этом создается CDatabase с параметром по умолчанию, который требует этих самых SQLFetchScroll. Зачем они ему — бог его знает... Какой-то продвинутый биндинг ему нужен. Поэтому мне Microsoft ODBC и не нравится.
BTW: очень советую взглянуть на OTL ( http://www.geocities.com/skuchin/otl/home.htm ) — производительнось и переносимость программ для Oracle резко повысится, а проблемы ODBC растают, как дым.
I>Кстати не подскажешь где моя ошибка... I>Проблема вот вчем...я не могу получить значение типа "numeric" выдаеться ошибка: I> "Error in column 1: Numeric value out of range" (со строковыми все в порядке)
Глючный он, глючный. Получай значения через double (туда уместится):
Не могли бы вы и мне помочь советом — кусоу кода из DLL
СDatabase я получаю при вызове, но это не суть важно
Используется подключение к Oracle через ODBC при помощи драйвера
"Oracle in OraHome81" SQORA32.DLL версии
8.01.72.00 дата 24.01.01
MDAC стоит версии 2.5(SP 2)
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, "SELECT * FROM MyTable");
//в таблице 8 полей
//обращаемся к третьему, а потом к четвертому - типа NUMBER(11)
CDBVariant m_Val;
rs.GetFieldValue((short) 2,m_Val);
rs.GetFieldValue((short) 3,m_Val);
//и на последней строчке появляется ошибка "invalid column number <4>"
А если строчку
rs.GetFieldValue((short) 2,m_Val);
с вызовом третьего поля закоментировать, то все в порядке — четвертое поле достижимо
И эта ошибка появляется только c числовыми полями, а со строковыми полями все нормально
Я пробовал, безрезультатно
Здравствуйте Бондаренко Николай , Вы писали:
БН>Не могли бы вы и мне помочь советом — кусоу кода из DLL БН>СDatabase я получаю при вызове, но это не суть важно БН>Используется подключение к Oracle через ODBC при помощи драйвера БН>"Oracle in OraHome81" SQORA32.DLL версии БН>8.01.72.00 дата 24.01.01 БН>MDAC стоит версии 2.5(SP 2)
К сожалению (для меня — к счастью), с Ораклом через ODBC я уже давно не работаю. Ничего подсказать не смогу. Очень советую попробовать уже упомянутую OTL, приятнее на порядок и скорость выше.
В ней это будет выглядеть примерно так:
int f1;
double f2;
std::string f3;
otl_stream i(1, "select * from MyTable", db);
i>>f1>>f2>>f3;
Здравствуйте retalik, Вы писали:
R>К сожалению (для меня — к счастью), с Ораклом через ODBC я уже давно не работаю. Ничего подсказать не смогу.
Очень жаль, может кто еще знает?
Тут скорее всего какие-то проблемы с ODBC драйвером. Хотя, возможно, проблема именно в классе CRecordset.
R>Очень советую попробовать уже упомянутую OTL, приятнее на порядок
Я бы с удовольствием попробовал, но нахожусь в жестких рамках задачи и что-либо(ODBC драйвер или способ подключения) поменять не могу т.к. пишу DLL к уже работающей программе, которая вызывает мою библиотеку передавая ей указатель на экземпляр CDatabase c уже установленным подключением.