powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема VFP при работе с ODBC 3.X
3 сообщений из 3, страница 1 из 1
Проблема VFP при работе с ODBC 3.X
    #33820606
ODBC problem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже VFP пытается работать с ODBC 3.X, как с ODBC 2.0. Хотя непонятно, как МС не реализовал в 9 VFP способность различать версии драйвера :(...



Declaring the Application's ODBC Version
===============================
....
The ODBC 3.x Driver Manager and ODBC 3.x drivers check the version of the
ODBC specification to which an application is written and respond
accordingly. For example, if the application follows the ODBC 2.x
specification and calls SQLExecute before calling SQLPrepare, the ODBC 3.x
Driver Manager returns SQLSTATE S1010 (Function sequence error). If the
application follows the ODBC 3.x specification, the Driver Manager returns
SQLSTATE HY010 (Function sequence error).
===============================

Собственно я и получаю эту ошибку. при удалении/обновлении несуществующих записей, ошибка обходится путем использования не просто SQLEXEC, а SQLPREPARE+SQLEXEC.

Пытаюсь явно указать, что нужно использовать ODBC 3
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
#define SQL_ATTR_ODBC_VERSION  200 
#define	SQL_OV_ODBC3  3 
#define SQL_IS_UINTEGER - 5 

DB_Handle=SQLSTRINGCONNECT(lcDSN1)
InternalHandle=SQLGETPROP(DB_Handle,"ODBChdbc")

DECLARE SHORT SQLSetEnvAttr IN odbc32;
    INTEGER EnvironmentHandle,; 
    integer Attribute,; 
    INTEGER ValuePtr,; 
    INTEGER StringLength

ResultSet=SQLSetEnvAttr(InternalHandle,SQL_ATTR_ODBC_VERSION,SQL_OV_ODBC3,SQL_IS_UINTEGER)

Получаю ошибку ResultSet=-2 - "неверный хэндл соединения"

Хотя
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
#DEFINE SQL_DRIVER_ODBC_VER					 77  

CREATE CURSOR csResult (infotype C( 30 ), datatype C( 1 ), infovalue C( 254 ), largevalue M)
=AddInfo("ODBC version",SQL_DRIVER_ODBC_VER,"C") 
BROWSE
RETURN

FUNCTION AddInfo (lcInfoType, lnInfoType, lcDataType) 
    LOCAL lcResult 

    DO CASE 
    CASE lcDataType = "C" 
        lcResult = GetInfoStr(lnInfoType) 
        INSERT INTO csResult (infotype, datatype, infovalue); 
            VALUES (lcInfoType, lcDataType, lcResult) 

    CASE lcDataType = "M" 
        lcResult = GetInfoStr(lnInfoType) 
        INSERT INTO csResult (infotype, datatype, infovalue, largevalue); 
            VALUES (lcInfoType, lcDataType, "See memo field", lcResult) 

    CASE lcDataType = "I" 
        lcResult = GetInfoInt(lnInfoType, @lcDataType) 
        INSERT INTO csResult (infotype, datatype, infovalue); 
            VALUES (lcInfoType, lcDataType, lcResult) 
    ENDCASE 
RETURN 

FUNCTION GetInfoStr (lnInfoType) 
    DECLARE SHORT SQLGetInfo IN odbc32; 
        INTEGER ConnectionHandle, INTEGER InfoType,; 
        STRING @InfoValuePtr, INTEGER BufLen, INTEGER @StrLenPtr 

    LOCAL lcBuffer, lnBufLen 
    lcBuffer = REPLI(Chr( 0 ),  4096 ) 
    lnBufLen =  0  
    = SQLGetInfo (InternalHandle, lnInfoType, @lcBuffer, Len(lcBuffer), @lnBufLen) 
RETURN Iif(lnBufLen> 0 , Left(lcBuffer, lnBufLen), "#error#")
- все ОК

Может кто сталкивался с подобным? Как указать соединению, что драйвер версии 3.X?
...
Рейтинг: 0 / 0
Проблема VFP при работе с ODBC 3.X
    #33820873
ODBC problem
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все решение найдено, нужно внимательнее читать документацию: в SQLSetEnvAttr нужно использовать не хэндл соединения, а ODBC environment handle.
...
Рейтинг: 0 / 0
Проблема VFP при работе с ODBC 3.X
    #33827587
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi All!

Для всех - не стоит воспроизводить данный код, если вы собираетесь
использовать VFP-ные "встроенные" методы работы с ODBC - т.е. все SQL*()
функции.
Дето в том, что фокс реализован как ODBC 2.0 Application (при этом он
нормально работает как с ODBC 2.0 так и с ODBC 3.0 драйверами - за это
отвечает ODBC Driver Manager - подробности см. в MSDN). А вот если описанным
выше способом сказать ODBC менеджеру что мы якобы являемся ODBC 3.0
Application - то возможны некоторые неприятные эффекты, связанные с
различиями между ODBC 2.0 и ODBC 3.0 API. В частности неверное "опознавание"
типов даты/даты-времени и timestamp... Внутренний фоксовый код конечно никак
не может стать ODBC 3.0 совместимым :)
Если же вы собираетесь сами реализовывать весь низкоуровневый интерфейс
работы с ODBC API (т.е. не использовать фоксовых функций) то конечно можно и
переключится в этот режим - но тогда конечно надо весь свой код работы с АПИ
писать с учётом соответствующих спецификаций.
P.S. IMHO надо быть большим мазохистом, чтобы писать на фоксе используя
чистый ODBC АПИ - это весьма большой кусок работы - вот "избранные" АПИ-ные
методы применять действительно иногда можно и нужно.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Проблема VFP при работе с ODBC 3.X
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]