| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB6 > Получить текст запроса через ADOX |
| Автор: gen1s 22.10.2010, 09:28 | ||||
| Здравствуйте. Передо мной поставили задачу сравнить две базы данных (.mdb - файлы) на наличие различающихся запросов. Т.е. нужно сравнить запросы с одинаковыми именами и, если текст запросов различается, сообщить об этом. Я до этого никогда с таким типом задач не сталкивался. Быстрое гугление подсказало, что есть такая штука - ADOX. Итак, есть два файла с бд - db4.mdb и db5.mdb. Мне их просто дали. Вот небольшой кусочек кода:
Кстати, некоторые запросы хранятся в коллекции Views и Tables, а некоторые в Procedures. Но это сейчас не важно. Я точно знаю, что текст этих запросов отличается. Но в переменных str1 и str2 он абсолютно одинаков (и равняется тексту запроса из db4.mdb). Самое интересное что
то значения будут разные и правильные. Т.е. неправильно работает Command.CommandText. Но. Если я открою db5.mdb в Access этот запрос и просто тупо нажму Ctrl-S, то после этого вернутся разные (реальные тексты запросов). В чём может быть проблема? Может, я вообще неправильно делаю. |
| Автор: Akina 22.10.2010, 10:58 |
| Почему это надо делать именно на VB6? а не непосредствено в Аксессе? Добавлено через 47 секунд А вообще посмотри в сторону коллекции QureyDefs. |
| Автор: gen1s 22.10.2010, 11:13 | ||
Потому что так сказали. Не я выбирал инструмент. Мне кажется, что это связано со способом хранения информации в mdb-файлах. Т.е., если я выкину весь код с db4.mdb, то catDB5.Procedures("dataPWorkNew").Command.CommandText всё равно вернёт текст запроса ataPWorkNew из db4.mdb. Чтобы заработало, Ctrl-S нажимать не надо. Я пытаюсь в Access открыть запрос в конструкторе. Он ругается, что запрос неверен и отобразить в режиме конструктора не может. При следующем открытии сообщение не появляется и начинает корректно работать мой код. Похоже, что db4.mdb был оригинальный файл. Потом его модифицировали и переименовали в db5.mdb. Я пробовал и через ADO вместо ADOX. Та же фигня. |
| Автор: Akina 22.10.2010, 11:27 | ||
PS. Запускать Аксесс и тем более открывать базу - не нужно. |
| Автор: gen1s 22.10.2010, 11:48 |
| Akina, спасибо большое за код. Но и это не помогло. Та же фигня. |
| Автор: Akina 22.10.2010, 12:43 |
| Базы выкладывай, да... только поудаляй всё лишнее из них и сожми, проверь, что проблема остаётся, потом заархивируй и приаттачь к сообщению. Посмотрим. |
| Автор: gen1s 22.10.2010, 13:21 |
| Для запроса "CurrentCounts" текст возвращается правильный. Сжатие тоже не помогло. Вообще, моя программа работает правильно: создал сам две бд и она всё правильно определила. Всё дело, скорее всего, именно в этих бд. В принципе, это всё уже не нужно. Просто хочется понять, в чём проблема. |
| Автор: Akina 22.10.2010, 13:37 | ||||
Проверил на выложенных базах. Запросы а) реальные б) разные.
|
| Автор: gen1s 22.10.2010, 14:01 |
| В терминологии Access вроде всё - Запрос. Я не до конца понял, что эти файлы дают. По ним что CurrentCounts различаются, а dataPWorkNew - нет. Но это ведь не так. Т.е., если я в Access попытаюсь выполнить запрос, то результат будет разный. Или я чего-то не понимаю (не знаю)? |
| Автор: Akina 22.10.2010, 14:15 |
Нет. Только представления и запросы в терминах Аксесса - запросы. Вернее, для Аксесса это одно и то же, различий нет (фактически представлений нет как таковых). В БД Аксесса можно через ADO(X) создавать хранимые процедуры и пользовательские функции. Но они недоступны из GUI, не отображаются в окне базы данных и могут быть обнаружены и использованы только через ADO(X) Connection. Более того, ХП/ПФ может иметь то же имя, что и запрос. Во что ты собственно и утыкаешься. |
| Автор: gen1s 22.10.2010, 14:19 |
| Akina, спасибо за информацию. Не знал всего этого. |