Additional
dbCAP
AnyDAC
ThinDAC
NCOCI8
Topic: открыть форму при изменении структуры БД
открыть форму при изменении структуры БД
Posted: 2007/10/07 03:46
 
Дмитрий, добрый день!

Такая проблема:

Есть обычная форма с ADQuery, в ней запрос, результаты в табличку выводятся. Работает прекрасно. D2007, MySQL5.1, WinXP, AnyDAC 1.12.2

Проблема возникает, когда приходится изменить структуру БД или тип одного из полей.

Допустим, удалили из таблицы zakaz_product поле kolvo.

Открываю дельфи, открываю форму - и тут вываливается ошибка

[AnyDAC][Phys][MySQL][LIBMYSQL] Unknown column 'zakaz_product.kolvo' in 'field list'

Error code: 01054
Error kind: Other
Unknown column 'zakaz_product.kolvo' in 'field list'

Exception class name: EMySQLNativeException
AnyDAC error code: 1100

Как бы всё правильно - AnyDAC ругается на то что поле было, а теперь его нет.

И если щелкнуть ОК на окошке с ошибкой, она закроется - НО! в дельфи откроется код моей формы, но закладки Design нет и не даёт переключится по F12.

И получается тупиковая ситуация - мне нужно в режиме Design щелкнуть по ADQuery и изменить SQL запрос на правильный, а режима Design нет Ну и соответсвенно в окошке Structure я тоже не могу добраться до ADQuery.

Что делать?

Ну конечно, как вариант, я обратно возвращаю поле kolvo в таблицу zakaz_product, заново открываю дельфи - и правлю SQL и потом снова удаляю поле kolvo, но как то не интересно так.
Re:открыть форму при изменении структуры БД
Posted: 2007/10/07 04:08
 
Привет

Попробуйте открыть DFM файл в текстовом редакторе, найти "плохой" запрос, исправить его и сохранить DFM файл. После этого открывайте форму в IDE.

Удачи,
Дмитрий
Re:открыть форму при изменении структуры БД
Posted: 2007/10/07 05:47
 
Этот способ я уже тоже познал
А во второй версии этого уже не будет?
Re:открыть форму при изменении структуры БД
Posted: 2007/10/07 23:12
 
Привет

Первый раз с этим сталкиваюсь. Так что же вы исправили в DFM ? Исключили из текста запроса поле kolvo ?

Если получится воспроизвести, то конечно же вылечу и в 2.x этого не будет

Удачи,
Дмитрий
Re:открыть форму при изменении структуры БД
Posted: 2007/10/08 01:28
 
Да, где DFM почистил, где вернул поле, потом снова убрал, нормально.

Так же эта ошибка возникает еще и при смене типа поля. Ну например было SELECT id from xx и если заменить на SELECT 1 as id from xx то уже другой тип и тоже не открывается. Или в базе поле было int, а стало string - всё тоже капец, нужно в DFM лезть.
Я думаю, если измените тип поля с инт на стринг, то сможете воспроизвести проблему.


И ещё одна непонятка:

SELECT *
FROM zayavka_product
WHERE
zayavka_product.zayavka_id IN( :zayavka_id )
GROUP BY ...

Параметр zayavka_id - тип стринг ( приходить должно что то типа '2,5,8' )
Но именно как строковый параметр он никак не желает восприниматься, т.е. понимает как 2 и всё тут, то есть приводит к INT.
Пробовал передавать 2,5,8 - воспринимает как 2, если передавать '2', '5', '8' - то воспринимает как пусто.

Как быть?

Post edited by: nikita, at: 2007/10/08 01:46
Re:открыть форму при изменении структуры БД
Posted: 2007/10/08 02:15
 
Привет

Так же эта ошибка возникает еще и при смене типа поля.
В случае с персистентными полями - да будет возникать. Это стандартное поведение датасетов. Если вы часто меняете типы полей, то не используйте персистентные поля.

Как быть?
Необходимо использовать макросы:

 zayavka_product.zayavka_id IN( !zayavka_id )



 ADQuery.Macros[0].Value := '2,5,8';



Удачи,
Дмитрий
Re:открыть форму при изменении структуры БД
Posted: 2007/10/08 02:50
 
Дмитрий, спасибо!


Ещё одна непонятная вещь:

ADQuery - в нём запрос:

SELECT
id,
name
FROM
xx
WHERE
xx.sklad_id=:ID

замечательно работает. Пытаюсь изменить запрос на :

(SELECT
id,
name
FROM
xx
WHERE
xx.sklad_id=:ID)
UNION
(SELECT 0, 'НЕ ВЫБРАНА')
ORDER BY id DESC
LIMIT 100

и как только добавляю UNION - сразу вываливается ошибка (имеено на UNION заметил)

[AnyDAC][Phys][MySQL][LIBMYSQL] Commands out of sync; you can't run this command now
02014
Other
EMySQLNativeException
1100

причем уже только закрыть/открыть форму помогает, даже если вернуть старый запрос, то всё равно ошибка Commands out of sync; you can't run this command now
Ну и соответственно перед открытием поправить SQL в DFM - иначе не откроется.

Соответственно оба запроса без ошибок выполняются в PHPMyAdmin

Upd: Точнее помогает закрытие-открытие всего Delphi, если форму открыть/закрыть не поможет (даже если не сохранялся новый запрос)

Post edited by: nikita, at: 2007/10/08 03:00
Re:открыть форму при изменении структуры БД
Posted: 2007/10/08 03:28
 
1) Проверьте, что у вас на компе в PATH только одна libmysql.dll и она от MySQL 5.1.
2) Вы изменяли значение ResultMode для определения соединения ?
Re:открыть форму при изменении структуры БД
Posted: 2007/10/08 05:04
 
ResultMode = Store

Версия библиотеки не влияет (4 штуки опробовал)

Вобщем разобрался:

из мануала mysql:
(SELECT a FROM t1 WHERE a=10 AND B=1)
UNION
(SELECT a FROM t2 WHERE a=11 AND B=2)
ORDER BY a LIMIT 10;

т.е. первый запрос взят в скобки.
Так вот именно ошибка вылетает когда первый запрос взят в скобки.

Если второй будет в скобках, а первый без -работает прекрасно!
Т.е. видимо AnyDac вспотыкается о первую скобку (может он просто не ожидает её там?)