![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
В программе используется ADO и БД Access. Запросы SQL необходимо хранить вне тела программы, чтобы была возможность их изменения без перекомпиляции. Хранить запросы в отдельных файлах - неудобно (при переносе программы на другой компьютер). MS Access дает возможность хранить запросы непосредственно в файле БД. Собственно вопрос: как использовать данную возможность из Delphi. Заранее спасибо.
|
|
#2
|
||||
|
||||
|
Да так-же как и таблицы, через запрос. Только вместо "Create table ..."используется "Create view ..."
|
|
#3
|
|||
|
|||
|
Я, наверное, неправильно выразился. Мне надо файле Access хранить текст запроса. А в компоненту ADOQuery - подгружать его динамически. Из отдельного файла - это функция ADOQuery.SQL.LoadFromFile(), а как из файла Access загрузить текст запроса с определенным именем?
|
|
#4
|
||||
|
||||
|
Если я правильно понял, то вам нужен исходный текст запроса для вьюшки сохраненной в базе. Не делал такого, но предположу что надо читать Description из схемы базы данных для вашего запроса.
|
|
#5
|
||||
|
||||
|
Первое поле в таблице имя запроса, второе сам запрос (хотя я предпочитаю обращаться не по имени, а по индексу).
Тебе понадобиться такая функция: Код:
function Tdm.Selects(s: string): string;
var QSel: TADOQuery;
begin
QSel:= TADOQuery.Create(nil);
QSel.Connection:= ADOConnection1;
QSel.SQL.Text:= 'select {поле_где_хранится_текст_запроса} from {имя_таблицы} where {поле_имени_запроса} = '+QuotedStr('тут_имя_твоего_запроса');
QSel.Open;
Result:= qSel.FieldByName('{поле_где_хранится_текст_запроса}').AsString;
qSel.Close;
qSel.Free;
end;Код:
...
ADOQuery1.SQL.Text:= Selects('TEST_SELECT'); //Вернет текст запроса с именем TEST_SELECT
... |
|
#6
|
||||
|
||||
|
Нет, ему не это нужно. В Акцесовской БД есть объекты: Таблицы, Запросы.
Для доступа через ADO без разницы в этом случае таблица это или запрос т.к. они располагаются в одном пространстве имен, и получить вы сможете только структуру этих объектов т.е. перечисление полей их составляющих. Но ему-то нужно не просто перечисление, а именно исходный текст запроса. Хотя если он для хранения текста запросов использует свою табличку то вероятно вы правы. Последний раз редактировалось Страдалецъ, 05.12.2011 в 16:42. |
|
#7
|
||||
|
||||
|
Цитата:
Мне почему-то показалось, что ТС именно это имеет в виду. Как бы то ни было, данный мною метод весьма полезен, т.к. сам использую его в своем проекте. А если хранить запросы в квериках, то каждое изменение влечет обязательное обновление программы у всех пользователей, а эту операцию нежелательно выполнять крайне часто. |
|
#8
|
|||
|
|||
|
Цитата:
Цитата:
Цитата:
Вот функция, может кому-то еще пригодится. Код:
function TFmMain.GetSQLFromAcces(MyConnection:TADOConnection;SQLName:String):String;
var NewADODataSet:TADODataSet;
begin
NewADODataSet:=TADODataSet.Create(Application);
NewADODataSet.Connection:=MyConnection;
MyConnection.OpenSchema(siViews, EmptyParam, EmptyParam, NewADODataSet);
NewADODataSet.Locate('TABLE_NAME',SQLName,[]);
Result:=VarToStr(NewADODataSet.FieldValues['VIEW_DEFINITION']);
NewADODataSet.Free;
end;Пример использования: ADOQuery1.SQL.Text:=GetSQLFromAcces(ADOConnection1 ,'MyTableSQL'); Последний раз редактировалось vdstud, 05.12.2011 в 18:43. |