Re[7]: ODBC
От: Бондаренко Николай Россия  
Дата: 24.05.02 01:47
Оценка: 10 (2)
Уже начал было приходить в отчаяние, но после долгих поисков нашел наконец-то.


If the driver does not support extensions to SQLGetData, the function can only return data for unbound columns with a number greater than that of the last bound column. Furthermore, within a row of data, the value of the ColumnNumber argument in each call to SQLGetData must be greater than or equal to the value of ColumnNumber in the previous call; that is, data must be retrieved in increasing column number order. Finally, if no extensions are supported, SQLGetData cannot be called if the rowset size is greater than 1.

Оказывается надо столбцы вызывать по порядку и тогда проблем не будет.
Выходит, что оракловский драйвер "does not support extensions to SQLGetData" — вот это да.
ODBC
От: Izverg  
Дата: 24.10.01 10:45
Оценка:
Подскажиет, кто знает..
Проблема:
Испульзуя класс CRecordset подключаюсь через ODBC к Oracle'кой базе.....
Все норамально работает если использую "Oracle ODBC Drivers"
когда же стал подклюсаться через "Microsoft ODBC for Oracle"..выдаеться постоянно ошибка
"No columns were bound prior to calling SQLFetchScroll/SQLExtendedFetch"
Кто знает подскажите, так как надо обязательно под microsoft'овским подключаться....
Re: ODBC
От: retalik www.airbandits.com/
Дата: 24.10.01 10:54
Оценка:
Здравствуйте 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 скачать поновее.
Успехов,
Виталий.
Re[2]: ODBC
От: Izverg  
Дата: 24.10.01 11:59
Оценка:
Здравствуйте 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 пробовал, все равно ни как..:(
Re[3]: ODBC
От: retalik www.airbandits.com/
Дата: 25.10.01 03:32
Оценка:
Здравствуйте 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");


Если проблемы остаются, код — в студию! :)
Успехов,
Виталий.
Re[4]: ODBC
От: Izverg  
Дата: 25.10.01 06:40
Оценка:
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" (со строковыми все в порядке)


CDatabase db;
db.Open( _T( "Oracle instance" ));
CRecordset rs(&db);
rs.Open(CRecordset::forwardOnly, "SELECT F.BYTES FROM DBA_DATA_FILES F");
//CString varValue;
CDBVariant varValue;
while( !rs.IsEOF( ) )
{
rs.GetFieldValue((short)0, varValue);

//********
}
rs.MoveNext( );
}
Re[5]: ODBC
От: retalik www.airbandits.com/
Дата: 25.10.01 07:53
Оценка:
Здравствуйте Izverg, Вы писали:


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 (туда уместится):

    CDatabase db;
    db.Open("Ora");
    CRecordset rs(&db);
    rs.Open(CRecordset::forwardOnly, "SELECT count(*) s FROM all_views");
    CDBVariant v;
    rs.GetFieldValue("S", v, SQL_C_DOUBLE);
    CString s;
    s.Format("Result: %g", v.m_dblVal);
    MessageBox(s);
Успехов,
Виталий.
Re[6]: ODBC
От: Бондаренко Николай Россия  
Дата: 23.05.02 06:47
Оценка:
Здравствуйте retalik, Вы писали:

R>Глючный он, глючный. Получай значения через double (туда уместится):


R>
R>    CDatabase db;
R>    db.Open("Ora");
R>    CRecordset rs(&db);
R>    rs.Open(CRecordset::forwardOnly, "SELECT count(*) s FROM all_views");
R>    CDBVariant v;
R>    rs.GetFieldValue("S", v, SQL_C_DOUBLE);
R>    CString s;
R>    s.Format("Result: %g", v.m_dblVal);
R>    MessageBox(s);
R>


Не могли бы вы и мне помочь советом — кусоу кода из 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 числовыми полями, а со строковыми полями все нормально
Я пробовал, безрезультатно

rs.GetFieldValue((short) 3,m_Val,SQL_C_DOUBLE);


и

rs.GetFieldValue((short) 3,m_Val,SQL_SLONG);

видимо дело не в этом.
Re[7]: ODBC
От: retalik www.airbandits.com/
Дата: 23.05.02 07:17
Оценка:
Здравствуйте Бондаренко Николай , Вы писали:

БН>Не могли бы вы и мне помочь советом — кусоу кода из 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;
Успехов,
Виталий.
Re[8]: ODBC
От: Бондаренко Николай Россия  
Дата: 23.05.02 07:28
Оценка:
Здравствуйте retalik, Вы писали:

R>К сожалению (для меня — к счастью), с Ораклом через ODBC я уже давно не работаю. Ничего подсказать не смогу.


Очень жаль, может кто еще знает?
Тут скорее всего какие-то проблемы с ODBC драйвером. Хотя, возможно, проблема именно в классе CRecordset.

R>Очень советую попробовать уже упомянутую OTL, приятнее на порядок


Я бы с удовольствием попробовал, но нахожусь в жестких рамках задачи и что-либо(ODBC драйвер или способ подключения) поменять не могу т.к. пишу DLL к уже работающей программе, которая вызывает мою библиотеку передавая ей указатель на экземпляр CDatabase c уже установленным подключением.

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.