Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.12.2011, 17:59
vdstud vdstud вне форума
Прохожий
 
Регистрация: 17.01.2010
Сообщения: 6
Репутация: 10
По умолчанию Хранение запросов в файле MS Access

В программе используется ADO и БД Access. Запросы SQL необходимо хранить вне тела программы, чтобы была возможность их изменения без перекомпиляции. Хранить запросы в отдельных файлах - неудобно (при переносе программы на другой компьютер). MS Access дает возможность хранить запросы непосредственно в файле БД. Собственно вопрос: как использовать данную возможность из Delphi. Заранее спасибо.
Ответить с цитированием
  #2  
Старый 01.12.2011, 18:11
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Да так-же как и таблицы, через запрос. Только вместо "Create table ..."используется "Create view ..."
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 01.12.2011, 18:18
vdstud vdstud вне форума
Прохожий
 
Регистрация: 17.01.2010
Сообщения: 6
Репутация: 10
По умолчанию

Я, наверное, неправильно выразился. Мне надо файле Access хранить текст запроса. А в компоненту ADOQuery - подгружать его динамически. Из отдельного файла - это функция ADOQuery.SQL.LoadFromFile(), а как из файла Access загрузить текст запроса с определенным именем?
Ответить с цитированием
  #4  
Старый 05.12.2011, 15:23
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Если я правильно понял, то вам нужен исходный текст запроса для вьюшки сохраненной в базе. Не делал такого, но предположу что надо читать Description из схемы базы данных для вашего запроса.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #5  
Старый 05.12.2011, 15:46
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Первое поле в таблице имя запроса, второе сам запрос (хотя я предпочитаю обращаться не по имени, а по индексу).
Тебе понадобиться такая функция:
Код:
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
...
Теперь ты можешь корректировать текст запроса "влет", без перекомпиляции.
__________________
Google в помощь
Ответить с цитированием
  #6  
Старый 05.12.2011, 16:35
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Нет, ему не это нужно. В Акцесовской БД есть объекты: Таблицы, Запросы.
Для доступа через ADO без разницы в этом случае таблица это или запрос т.к. они располагаются в одном пространстве имен, и получить вы сможете только структуру этих объектов т.е. перечисление полей их составляющих. Но ему-то нужно не просто перечисление, а именно исходный текст запроса.
Хотя если он для хранения текста запросов использует свою табличку то вероятно вы правы.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.

Последний раз редактировалось Страдалецъ, 05.12.2011 в 16:42.
Ответить с цитированием
  #7  
Старый 05.12.2011, 16:50
Аватар для Ildar-tsr
Ildar-tsr Ildar-tsr вне форума
Местный
 
Регистрация: 09.08.2011
Адрес: г.Сургут, ХМАО
Сообщения: 453
Репутация: 7402
По умолчанию

Цитата:
Сообщение от Страдалецъ
Нет, ему не это нужно. В Акцесовской БД есть объекты: Таблицы, Запросы.
Для доступа через ADO без разницы в этом случае таблица это или запрос т.к. они располагаются в одном пространстве имен, и получить вы сможете только структуру этих объектов т.е. перечисление полей их составляющих. Но ему-то нужно не просто перечисление, а именно исходный текст запроса.
Хотя если он для хранения текста запросов использует свою табличку то вероятно вы правы.

Мне почему-то показалось, что ТС именно это имеет в виду. Как бы то ни было, данный мною метод весьма полезен, т.к. сам использую его в своем проекте. А если хранить запросы в квериках, то каждое изменение влечет обязательное обновление программы у всех пользователей, а эту операцию нежелательно выполнять крайне часто.
__________________
Google в помощь
Ответить с цитированием
  #8  
Старый 05.12.2011, 18:38
vdstud vdstud вне форума
Прохожий
 
Регистрация: 17.01.2010
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Страдалецъ
Нет, ему не это нужно. В Акцесовской БД есть объекты: Таблицы, Запросы.
Да, Вы меня правильно поняли.
Цитата:
Сообщение от Страдалецъ
...и получить вы сможете только структуру этих объектов т.е. перечисление полей их составляющих.
А это неправда. Решение найдено, благодаря Вашей мысли:
Цитата:
Сообщение от Страдалецъ
Если я правильно понял, то вам нужен исходный текст запроса для вьюшки сохраненной в базе. Не делал такого, но предположу что надо читать Description из схемы базы данных для вашего запроса.
Спасибо!
Вот функция, может кому-то еще пригодится.
Код:
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;
В параметр MyConnection передаем компонент класса TADOConnection, настроенный на соединение с БД Access, а в SQLName - имя этого запроса в файле MS Access.

Пример использования:
ADOQuery1.SQL.Text:=GetSQLFromAcces(ADOConnection1 ,'MyTableSQL');

Последний раз редактировалось vdstud, 05.12.2011 в 18:43.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:07.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter