Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / FoxPro, Visual FoxPro Новый топик    Ответить
 Проблема VFP при работе с ODBC 3.X  [new]
ODBC problem
Guest
Похоже 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
#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 - "неверный хэндл соединения"

Хотя
#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?
29 июн 06, 05:19    [2823657]     Ответить | Цитировать Сообщить модератору
 Re: Проблема VFP при работе с ODBC 3.X  [new]
ODBC problem
Guest
Все решение найдено, нужно внимательнее читать документацию: в SQLSetEnvAttr нужно использовать не хэндл соединения, а ODBC environment handle.
29 июн 06, 09:59    [2824049]     Ответить | Цитировать Сообщить модератору
 Re: Проблема VFP при работе с ODBC 3.X  [new]
Igor Korolyov
Member

Откуда: Гомель, Беларусь
Сообщений: 2512

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

3 июл 06, 14:17    [2836793]     Ответить | Цитировать Сообщить модератору
Все форумы / FoxPro, Visual FoxPro Ответить