Работа в рамках одного приложения с разными БД
Модератор: Andrew™
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion и MAV который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Работа в рамках одного приложения с разными БД
Добрый день!
С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 - все проходит на ура.
Андрей судя по-всему сейчас в отпуске, но может кто-то с подобным сталкивался?
С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 - все проходит на ура.
Андрей судя по-всему сейчас в отпуске, но может кто-то с подобным сталкивался?
Re: Работа в рамках одного приложения с разными БД
как видно используется два соединения, первое соединение является соединением по умолчанию, все запросы без явного указания имени соединения всегда идут именно в первом соединении, для курсорных объектов чтобы переключться не на первое соединение используется метод
для MAVLOAD чтобы переключить его выполнение на другое соединения используется следующая конструкция:
НО, еси сервак один и запрос идёт чисто в другую DATABASE то применительно к MSSQL, хватает и одного соединения, а имя базы явно указывается в имени таблицы, может на DB2 есть какие то свои правила в формировании запроса не к текущей БД
Код: Выделить всё
.Initialize(ИмяСоединения)
Код: Выделить всё
IF MAVLOAD('[ИмяСоединения]SELECT ....
Re: Работа в рамках одного приложения с разными БД
Для
MAVLOAD('[Connect2] SELECT lab1, lab2, lab3 FROM NameTable’, LOC_QUEUE)
в очередь правильно пишется только последняя строка, предыдущие – заполнены нулями, хотя количество строк верно. Где, чего надо подкрутить?
MAVLOAD('[Connect2] SELECT lab1, lab2, lab3 FROM NameTable’, LOC_QUEUE)
в очередь правильно пишется только последняя строка, предыдущие – заполнены нулями, хотя количество строк верно. Где, чего надо подкрутить?
Re: Работа в рамках одного приложения с разными БД
Разобрался. Зависит не от № соединения, а от специфики запросов для CACHE
-
- ✯ Ветеран ✯
- Сообщения: 1703
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Re: Работа в рамках одного приложения с разными БД
Работаю с 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 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
-
- ✯ Ветеран ✯
- Сообщения: 1703
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 9 раз
- Поблагодарили: 4 раза
Re: Работа в рамках одного приложения с разными БД
Решилось, из-за курсора . Стоял sqlout MAVSelect, а надо было MAVUpdate.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп