[Решено] Копирование результатов запроса TSQLQuery.

Вопросы программирования и использования среды Lazarus.

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

[Решено] Копирование результатов запроса TSQLQuery.

Сообщение yeger » 20.11.2012 10:51:29

Всем доброго дня.
Столкнулся с глупой проблемой, но, т.к. новичок, прошу помочь:
Есть таблица с колонками "Имя константы","Тип значения константы", "содержание значения константы". Содержание значения константы может быть описано "[Имя таблицы где значение хранится]"/"[Ид значения]"/"[Колонка представления значения]".
В таблице констант в числе прочих есть запись "Базовая валюта", "Значение", "refcurrency"/"1"/"SprName", и при обходе результатов запроса мне надо выполнить второй запрос
Код: Выделить всё
select SprName from refcurrency where id = "1";

Лазарус мне резонно возражает, что TSQLQuery находится в открытом состоянии и нельзя ему кормить второй запрос. Логично выгружать результат запроса в какой-то массив/компонент/поток (куда?) и логично, что это действие не должно быть трудоемким (в том же 1С это делается Запрос.Выгрузить(ТабЗначений)).

Вопрос: Как мне скопировать результат запроса? Как потом сделать обход результата циклом?
Последний раз редактировалось yeger 21.11.2012 12:01:26, всего редактировалось 1 раз.
Аватара пользователя
yeger
новенький
 
Сообщения: 49
Зарегистрирован: 17.03.2011 12:26:34

Re: Копирование результатов запроса TSQLQuery. Куда и как?

Сообщение evb87ar » 20.11.2012 11:14:08

Можно или использовать два SQLQuery, или же из первого делать:

Код: Выделить всё
with SQLQuery1 do begin
  while not EOF do begin
    <Массив>[RecNo] := FieldByName('<Поле>').As<ТипДанных>;

    Next;
  end;
end;


А потом проходить циклом по <Массиву> и делать запросы в первом же SQLQuery.

В качестве массива можно использовать TStringList.
Создать его:
Код: Выделить всё
var
  temp_StrinfList: TStringList;
...
temp_StringList := TStringList.Create;
...
FreeAndNil(temp_StringList); // Удаление и освобождение памяти


Либо банально: temp_array: array of String[20];

В-общем, на вкус и цвет фломастеры - разные.
Аватара пользователя
evb87ar
новенький
 
Сообщения: 52
Зарегистрирован: 18.01.2012 21:08:02
Откуда: г. Архангельск

Re: Копирование результатов запроса TSQLQuery. Куда и как?

Сообщение yeger » 20.11.2012 12:11:07

Извините, не понял, как в temp_StringList попадают результаты запроса SQLQuery1. Обходом результата SQLQuery1?
Пока использую "два SQLQuery". Избыточно.
Аватара пользователя
yeger
новенький
 
Сообщения: 49
Зарегистрирован: 17.03.2011 12:26:34

Re: Копирование результатов запроса TSQLQuery. Куда и как?

Сообщение Ism » 20.11.2012 18:04:37

Есть такая штука TMemDataset , загоните туда результат запроса и делайте что надо

А вообще это делается курсорами на сервере
Ism
энтузиаст
 
Сообщения: 908
Зарегистрирован: 06.04.2007 17:36:08

Re: Копирование результатов запроса TSQLQuery. Куда и как?

Сообщение evb87ar » 20.11.2012 21:07:21

yeger, да, обходом SQLQuery1 вы вручную заносите данные в temp_StringList.
Аватара пользователя
evb87ar
новенький
 
Сообщения: 52
Зарегистрирован: 18.01.2012 21:08:02
Откуда: г. Архангельск

Re: Копирование результатов запроса TSQLQuery. Куда и как?

Сообщение Vapaamies » 20.11.2012 22:35:08

yeger, мне кажется, что вы бездумно переносите опыт другого языка на Lazarus. Ваша задача надуманна, потому как компонент запроса -- и есть тот умный массив, хранящий данные в удобном для обработке виде. Работа одновременно со многими компонентами запроса штатна для Delphi/Lazarus, потому как реализована хорошо и не ведет к перерасходу ресурсов.

yeger писал(а):Содержание значения константы может быть описано "[Имя таблицы где значение хранится]"/"[Ид значения]"/"[Колонка представления значения]".

Это не реляционный подход. Если у вас есть возможность поменять структуру БД, сделайте это немедленно, иначе проблем не оберетесь.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург

Re: Копирование результатов запроса TSQLQuery. Куда и как?

Сообщение yeger » 21.11.2012 12:00:34

Vapaamies, отличный совет, но с ходу не представляю как лаконично записать в таблицу значения разных типов, да так, чтобы их было легко забирать и показывать. Это же константы, заранее предсказать сколько их будет и каких они типов нельзя. Где можно связанные ключи применить - там безусловно так. Если есть вариант определять значение поля как ссылку на любые другие значения - буду признателен за подсказку. Использую "MariaDB 5.5 (x64)" через MySQL компоненты.
Я так выразил значение прежде всего для последующей проверки возможности удаления записей из других таблиц: в триггере проверяю, есть ли вхождения по имя таблицы и ид в константе.

А вот про "компонент запроса -- и есть тот умный массив" не знал, буду знать теперь, спасибо.
Аватара пользователя
yeger
новенький
 
Сообщения: 49
Зарегистрирован: 17.03.2011 12:26:34

Re: Копирование результатов запроса TSQLQuery. Куда и как?

Сообщение Vapaamies » 21.11.2012 23:12:53

yeger писал(а):с ходу не представляю как лаконично записать в таблицу значения разных типов, да так, чтобы их было легко забирать и показывать.

В таком виде задача по определению нереляционная, поскольку требует наследования или обобщения, а с точки зрения реляционной СУБД выглядит как "типизированный BLOB". В РСУБД есть только один универсальный (с натяжкой) тип -- строка/текст. К строковому виду можно привести все остальные значения, хоть это и не будет эффективно с точки зрения хранения и производительности. В развитых РСУБД еще предлагают XML в качестве "типизированного BLOB-а" -- тот же текст. Как по мне -- костыль.

Сначала неплохо бы озвучить изначальную задачу. Мож она вполне тривиально решается? Только новую тему создайте, раз такое дело.
Аватара пользователя
Vapaamies
постоялец
 
Сообщения: 292
Зарегистрирован: 24.07.2012 22:37:59
Откуда: Санкт-Петербург


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 223

Рейтинг@Mail.ru