Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить текст запроса через ADOX 
:(
    Опции темы
gen1s
  Дата 22.10.2010, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.12.2006

Репутация: нет
Всего: нет



Здравствуйте. Передо мной поставили задачу сравнить две базы данных (.mdb - файлы) на наличие различающихся запросов. Т.е. нужно сравнить запросы с одинаковыми именами и, если текст запросов различается, сообщить об этом. Я до этого никогда с таким типом задач не сталкивался. Быстрое гугление подсказало, что есть такая штука - ADOX. 
Итак, есть два файла с бд - db4.mdb и db5.mdb. Мне их просто дали. Вот небольшой кусочек кода:

Код

    ' Соединение с db4.mdb
    Dim catDb4 As ADOX.Catalog
    Set catDb4 = New ADOX.Catalog
    catDb4.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\tmp\db4.mdb"
    
    ' Соединение с db5.mdb
    Dim catDB5 As ADOX.Catalog
    Set catDB5 = New ADOX.Catalog
    catDB5.ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\tmp\db5.mdb"

    Dim str1 As String, str2 As String
    ' Получаю текст запроса из db5.mdb
    str1 = catDB5.Procedures("dataPWorkNew").Command.CommandText
    ' Получаю текст запроса из db4.mdb
    str2 = catDb4.Views("dataPWorkNew").Command.CommandText

    ' Сравниваю запросы
    If str1 = str2 Then
        MsgBox "Equal"
    Else
        MsgBox "Not equal"
    End If
    
    Set catDb4 = Nothing
    Set catDB5 = Nothing
    
    Exit Sub


Кстати, некоторые запросы хранятся в коллекции Views и Tables, а некоторые в Procedures. Но это сейчас не важно. Я точно знаю, что текст этих запросов отличается. Но в переменных str1 и str2 он абсолютно одинаков (и равняется тексту запроса из db4.mdb). Самое интересное что 
Код

 str1 = catDB5.Procedures("dataPWorkNew").DateCreated
 str2 = catDb4.Views("dataPWorkNew").DateCreated

то значения будут разные и правильные.
Т.е. неправильно работает Command.CommandText. 
Но.
Если я открою db5.mdb в Access этот запрос и просто тупо нажму Ctrl-S, то после этого вернутся разные (реальные тексты запросов).
В чём может быть проблема? Может, я вообще неправильно делаю.
PM MAIL   Вверх
Akina
Дата 22.10.2010, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Почему это надо делать именно на VB6? а не непосредствено в Аксессе?

Добавлено через 47 секунд
А вообще посмотри в сторону коллекции QureyDefs.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
gen1s
Дата 22.10.2010, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.12.2006

Репутация: нет
Всего: нет



Цитата

Почему это надо делать именно на VB6? а не непосредствено в Аксессе?

Потому что так сказали. Не я выбирал инструмент.

Мне кажется, что это связано со способом хранения информации в mdb-файлах. Т.е., если я выкину весь код с db4.mdb, то  catDB5.Procedures("dataPWorkNew").Command.CommandText всё равно вернёт текст запроса ataPWorkNew из db4.mdb. 
Чтобы заработало, Ctrl-S нажимать не надо. Я пытаюсь в Access открыть запрос в конструкторе. Он ругается, что запрос неверен и отобразить в режиме конструктора не может. При следующем открытии сообщение не появляется и начинает корректно работать  мой код. 
Похоже, что db4.mdb был оригинальный файл. Потом его модифицировали и переименовали в db5.mdb.

Я пробовал и через ADO вместо ADOX. Та же фигня.
PM MAIL   Вверх
Akina
Дата 22.10.2010, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Код

Dim FullDatabaseNameWithExtention As String
FullDatabaseNameWithExtention = "c:\Базы данных\База для опытов.MDB"
Dim db As Database
Set db = OpenDatabase(FullDatabaseNameWithExtention)
Dim qdef As QueryDef
For Each qdef In db.QueryDefs
    Debug.Print "=== "; qdef.Name; " ==="
    Debug.Print qdef.SQL
    Debug.Print "========================"
Next
Set qdef = Nothing
db.Close
Set db = Nothing
Не забудь подключить Project - References - Microsoft DAO 3.x Object Library

PS. Запускать Аксесс и тем более открывать базу - не нужно.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
gen1s
Дата 22.10.2010, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.12.2006

Репутация: нет
Всего: нет



Akina,  спасибо большое за код. Но и это не помогло. Та же фигня.
PM MAIL   Вверх
Akina
Дата 22.10.2010, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Базы выкладывай, да... только поудаляй всё лишнее из них и сожми, проверь, что проблема остаётся, потом заархивируй и приаттачь к сообщению. Посмотрим.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
gen1s
Дата 22.10.2010, 13:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.12.2006

Репутация: нет
Всего: нет



Для запроса "CurrentCounts" текст возвращается правильный. Сжатие тоже не помогло. Вообще, моя программа работает правильно: создал сам две бд и она всё правильно определила. Всё дело, скорее всего, именно в этих бд.
В принципе, это всё уже не нужно. Просто хочется понять, в чём проблема.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  __.rar 19,51 Kb
PM MAIL   Вверх
Akina
Дата 22.10.2010, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Проверил на выложенных базах. Запросы а) реальные б) разные.
Цитата(db4)

=== CurrentCounts ===
SELECT C.CardCode, [Family] & " " & [fname] & " " & [sname] AS PFIO, PC.Name AS CountType, C.Banka, C.CardNum
FROM Cards AS C INNER JOIN dicPClass AS PC ON C.Category=PC.ItemID
WHERE (((C.Main)=True))
ORDER BY C.Family, C.FName, C.SName;

========================
=== dataPWorkNew ===
SELECT CW.DateWorks, CW.Works, D.fDoctor & " " & D.iDoctor & " " & D.oDoctor AS FIO, CW.CardCode, CW.CodeCardWorks, CW.TypeWorks, P.Count, PP.Count
FROM ((CardsWorks AS CW INNER JOIN Doctor AS D ON CW.codeDoctor=D.codeDoctor) LEFT JOIN PatientPayment AS P ON CW.CodeCardWorks=P.CodeCardWorks) LEFT JOIN PatientPaymentPact AS PP ON CW.CodeCardWorks=PP.CodeCardWorks
WHERE (((CW.CardCode)=2) AND ((CW.TypeWorks)=0) AND ((PP.CodeCardWorks) Is Null) AND ((P.CodeCardWorks) Is Null));

========================

Цитата(db5)

=== CurrentCounts ===
SELECT C.CardCode, [Family] & " " & [fname] & " " & [sname] AS PFIO, PC.Name AS CountType, C.Banka, C.CardNum
FROM Cards AS C INNER JOIN dicPClass AS PC ON C.Category=PC.ItemID
WHERE (((C.Main)=True));

========================
=== dataPWorkNew ===
SELECT CW.DateWorks, CW.Works, D.fDoctor & " " & D.iDoctor & " " & D.oDoctor AS FIO, CW.CardCode, CW.CodeCardWorks, CW.TypeWorks, P.Count, PP.Count
FROM ((CardsWorks AS CW INNER JOIN Doctor AS D ON CW.codeDoctor=D.codeDoctor) LEFT JOIN PatientPayment AS P ON CW.CodeCardWorks=P.CodeCardWorks) LEFT JOIN PatientPaymentPact AS PP ON CW.CodeCardWorks=PP.CodeCardWorks
WHERE (((CW.CardCode)=2) AND ((CW.TypeWorks)=0) AND ((PP.CodeCardWorks) Is Null) AND ((P.CodeCardWorks) Is Null));

========================


Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Compare_queries.rar 1,87 Kb


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Akina
Дата 22.10.2010, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(gen1s @  22.10.2010,  10:28 Найти цитируемый пост)
некоторые запросы хранятся в коллекции Views и Tables, а некоторые в Procedures

Вы разницу между запросом, представлением и хранимой процедурой знаете?

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  Compare_queries.rar 1,87 Kb


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
gen1s
Дата 22.10.2010, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.12.2006

Репутация: нет
Всего: нет



В терминологии Access вроде всё  - Запрос. 
Я не до конца понял, что эти файлы дают. По ним что CurrentCounts различаются, а dataPWorkNew - нет. Но это ведь не так. Т.е., если я в Access попытаюсь выполнить запрос, то результат будет разный.

Или я чего-то не понимаю (не знаю)?
PM MAIL   Вверх
Akina
Дата 22.10.2010, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(gen1s @  22.10.2010,  15:01 Найти цитируемый пост)
В терминологии Access вроде всё  - Запрос. 

Нет. Только представления и запросы в терминах Аксесса - запросы. Вернее, для Аксесса это одно и то же, различий нет (фактически представлений нет как таковых).
В БД Аксесса можно через ADO(X) создавать хранимые процедуры и пользовательские функции. Но они недоступны из GUI, не отображаются в окне базы данных и могут быть обнаружены и использованы только через ADO(X) Connection. Более того, ХП/ПФ может иметь то же имя, что и запрос. Во что ты собственно и утыкаешься.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
gen1s
Дата 22.10.2010, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 25.12.2006

Репутация: нет
Всего: нет



Akina, спасибо за информацию. Не знал всего этого.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0803 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.