У меня есть программа в Delphi 2010, которая использует базу данных JET (mdb) через ADO. Я хотел бы иметь возможность извлекать определения некоторых из запросов в базе данных и отображать их пользователю. Возможно ли это либо через SQL, некоторый интерфейс ADO, либо путем опроса самой базы данных (у меня нет прав на MSysObjects).Извлечь определение запроса из базы данных JET через ADO
ответ
Некоторые из этих сведений доступны через вызовы ADOX. Существует обзор api с некоторыми примерами (к сожалению, не в Delphi) на MSDN website.
В основном вам нужно будет импортировать библиотеку типов ADOX, а затем использовать обертку, созданную для доступа к базовому API. Оттуда он так же прост, как навигацию по иерархии, чтобы получить нужные вам данные.
Вам необходимо получить доступ к определенному View object, а оттуда получить свойство команды.
Via DAO, это довольно просто. Вы просто извлекаете свойство SQL каждого QueryDef. В DAO изнутри Access, который был бы:
Dim db As DAO.Database
Dim qdf As DAO.QueryDef
Set db = DBEngine.OpenDatabase("[path/name of database]")
For Each qdf In db
Debug.Print qdf.SQL
Next qdf
Set qdf = Nothing
db.Close
Set db = Nothing
Я не знаю, как перевести это, но я думаю, что это самый простой способ, как только вы комфортно с помощью DAO вместо ADOX.
Я вообще не использую ADO, но я предполагаю, что он имеет коллекцию представлений и свойство SQL будет работать для запросов SELECT. Однако, если вы заинтересованы в получении SQL для всех сохраненных QueryDefs, вам также нужно будет просмотреть запросы DML, поэтому вам придется посмотреть хранимые процедуры. Мне нужно было бы найти синтаксис для этого, но я вполне уверен, что именно так вы получите информацию через ADO.
Спасибо. Я нашел некоторый материал ADOX для Delphi: http://delphi.about.com/od/database/l/aa072401a.htm. Прочитал бы его и посмотрел, будет ли он делать то, что мне нужно. Хотя я действительно надеюсь на что-то, что я могу пропустить через обычный объект ADOCommand или опросить объект ADOConnection. –
Я считаю, что соединение ADOX является ADO-соединением. – skamradt
Обратите внимание, что представления будут только запросами SELECT, а не DML-запросами, поэтому это будет неполным результатом для всех потенциальных сохраненных QueryDef в базе данных Access. –