Работа в рамках одного приложения с разными БД

Обсуждение MAV Direct ODBC

Модератор: Andrew™

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Леонид
Бывалый
Сообщения: 84
Зарегистрирован: 31 Август 2005, 16:07

Работа в рамках одного приложения с разными БД

Сообщение Леонид » 10 Июль 2009, 10:41

Добрый день!

С63 9058 ABC, DB2

Вообщем имеем следующее: в рамках одного приложения работа идет как со своей БД, так и со сторонней (чисто получение некоторых данных, выборок...) И полный облом. Вот простецкий код, который приводит к ошибке:
---------------------------------------
LOC:ConnectDbString = 'DRIVER={{' & CLIP(LOC:Driver) & '}; ' & |
'DATABASE=' & CLIP(LOC:DataBase) & '; ' & |
'HOSTNAME=' & CLIP(LOC:HostName) & '; ' & |
'PORT=' & FORMAT(LOC:Port, @N_5) & '; PROTOCOL=' & CLIP(LOC:Protocol) & '; ' & |
'UID=******; PWD=******'
! Соединяемся в БД № 1 (Это моя БД)
IF MAVCONNECT('MYDB', LOC:ConnectDbString, 0)
BEEP(BEEP:SystemHand)
MESSAGE('Ошибка соединения с Базой данных № 1...', 'Ошибка!', ICON:Hand)
ELSE
BEEP(BEEP:SystemAsterisk)
MESSAGE('Соединение с Базой данных № 1 прошло успешно...', 'Успех!', ICON:Asterisk)
! Соединяемся с Базой данных № 2 (это не моя БД)
LOC:ConnectDbString = 'DRIVER={{' & CLIP(LOC:Driver) & '}; ' & |
'DATABASE=' & CLIP(LOC:DataBaseC) & '; ' & |
'HOSTNAME=' & CLIP(LOC:HostNameC) & '; ' & |
'PORT=' & FORMAT(LOC:Port, @N_5) & '; PROTOCOL=' & CLIP(LOC:Protocol) & ';' & |
'UID=******; PWD=******'
IF MAVCONNECT('NOMYDB', LOC:ConnectDbString, 0)
BEEP(BEEP:SystemHand)
MESSAGE('Ошибка соединения с Базой данных № 2...', 'Ошибка!', ICON:Hand)
ELSE
BEEP(BEEP:SystemAsterisk)
MESSAGE('Соединение с Базой данных № 2 прошло успешно...', 'Успех!', ICON:Asterisk)
IF MAVLOAD('SELECT COUNT(*) FROM DB2INST.INSURER', LOC:CountRec)
MAVSHOWERROR
ELSE
stop(LOC:CountRec)
END
MAVDISCONNECT('NOMYDB')
END
MAVDISCONNECT('MYDB')
END
----------------------------------------
Собственно, при выполнении запроса: SELECT COUNT(*) FROM DB2INST.INSURER вываливается ошибка:
[IBM][CLI Driver][DB2/NT] SQL0204N Имя "DB2INST.INSURER" не было определено. SQLSTATE=42704
[42S02] (42S02)

Стоит отключить подключение к своей БД, т.е. соединяемся только с БД № 2 - все проходит на ура.

Андрей судя по-всему сейчас в отпуске, но может кто-то с подобным сталкивался?

Аватара пользователя
Andrew™
SQL профи
Сообщения: 651
Зарегистрирован: 05 Июль 2005, 15:32
Откуда: Москва, Зеленоград

Re: Работа в рамках одного приложения с разными БД

Сообщение Andrew™ » 20 Июль 2009, 8:32

как видно используется два соединения, первое соединение является соединением по умолчанию, все запросы без явного указания имени соединения всегда идут именно в первом соединении, для курсорных объектов чтобы переключться не на первое соединение используется метод

Код: Выделить всё

.Initialize(ИмяСоединения)
для MAVLOAD чтобы переключить его выполнение на другое соединения используется следующая конструкция:

Код: Выделить всё

 IF MAVLOAD('[ИмяСоединения]SELECT ....
НО, еси сервак один и запрос идёт чисто в другую DATABASE то применительно к MSSQL, хватает и одного соединения, а имя базы явно указывается в имени таблицы, может на DB2 есть какие то свои правила в формировании запроса не к текущей БД

Леонид
Бывалый
Сообщения: 84
Зарегистрирован: 31 Август 2005, 16:07

Re: Работа в рамках одного приложения с разными БД

Сообщение Леонид » 20 Июль 2009, 9:40

Андрей, все получилось. Спасибо.

lakw
Прохожий
Сообщения: 3
Зарегистрирован: 10 Ноябрь 2009, 16:11

Re: Работа в рамках одного приложения с разными БД

Сообщение lakw » 23 Август 2010, 13:55

Для
MAVLOAD('[Connect2] SELECT lab1, lab2, lab3 FROM NameTable’, LOC_QUEUE)
в очередь правильно пишется только последняя строка, предыдущие – заполнены нулями, хотя количество строк верно. Где, чего надо подкрутить?

lakw
Прохожий
Сообщения: 3
Зарегистрирован: 10 Ноябрь 2009, 16:11

Re: Работа в рамках одного приложения с разными БД

Сообщение lakw » 25 Август 2010, 10:25

Разобрался. Зависит не от № соединения, а от специфики запросов для CACHE

gopstop2007
✯ Ветеран ✯
Сообщения: 1269
Зарегистрирован: 25 Март 2009, 21:55

Re: Работа в рамках одного приложения с разными БД

Сообщение gopstop2007 » 21 Февраль 2012, 22:42

Работаю с 2-я MySQL серверами, c 1-го сервера заполняю очередь 'QueueBaza', присоединяюсь ко второму серверу, нахожу запись и пытаюсь ее изменить и облом

Код: Выделить всё

QueueBaza     QUEUE,PRE(QUE)                           !
NWARES            LONG
N_ID              LONG
NameGroup         STRING(50)
Wares             STRING(255)
               END                                   !
 
   CODE
 
  sqlout.Initialize('MYDB')
  MAVLOGOUT
  LOOP I#=1 TO R#
    GET(QueueBaza,I#)
    ! проверка наличия товара
    IF MAVLOAD('[MYDB] SELECT products.products_id FROM products WHERE products.products_id='& Que:NWARES, LOC:CountRec)
        !MAVSHOWERROR
        ! запись не найдена = надо добавить
    ELSE
        ! запись найдена = надо изменить
        ! =========== UPDATE RECORD
         IF sqlout.Run('UPDATE products_to_categories SET categories_id='& Que:N_ID &' WHERE products_id='& Que:NWARES)  !
            MAVSHOWERROR
           !RETURN
         END
    END
  END
  MAVCOMMIT
  MAVDISCONNECT('MYDB')

на mavtrace выдает ошибку 'Недопустимое состояние курсора [24000]'  более детальный лог указан ниже


11543704 Open cursor [Connection 'MYDB']  Return Code : SQL_SUCCESS
11543704 Maximum read 1 rows for cursor
11543704 Parsing Cursor :  SELECT products.products_id FROM products WHERE products.products_id=20
 Time Taken: 0.02 sec.
Calculate columns for cursor 11543704  Return Code : SQL_SUCCESS
Column 1 Name : "products_id" Size : 4 Type : 4 ColType : 4  null
11543704 Close cursor
11543704 Free cursor
11543704 Open cursor [Connection 'MYDB']  Return Code : SQL_SUCCESS
11543704 Read all rows for cursor
11543704 Parsing Cursor : UPDATE products_to_categories SET categories_id=10 WHERE products_id=20
11543704 Reset cursor
ERROR: [Microsoft][Диспетчер драйверов ODBC] Недопустимое состояние курсора [24000]
11543704 Close cursor
11543704 Free cursor


“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

gopstop2007
✯ Ветеран ✯
Сообщения: 1269
Зарегистрирован: 25 Март 2009, 21:55

Re: Работа в рамках одного приложения с разными БД

Сообщение gopstop2007 » 22 Февраль 2012, 12:07

Решилось, из-за курсора . Стоял sqlout MAVSelect, а надо было MAVUpdate.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп

Ответить