Меню

Delphi две таблицы запрос



Delphi две таблицы запрос


Alexcool ( 2002-06-27 20:16 ) [0]

Правда, не знаю как сделать, подскажите. Мне нужно сделать что-то вроде SELECT * FROM Table1, Table2. Но в этих таблицах есть поля с одинаковыми названиями, например ID. В результате я получаю DataSet с полями ID и ID_1, а хотелось бы с полями Table1ID и Table2ID. Это возможно? Если возможно, то как?


Anatoly Podgoretsky ( 2002-06-27 20:36 ) [1]

Если заменить * на список полей, то да, используй предикат AS


dimis ( 2002-06-27 21:00 ) [2]

select a.id Table1id,b.id Table2id
from table1 a,table2 b


Viewer ( 2002-06-27 21:04 ) [3]

Пример

SELECT R.*, T.ID AS TOWN_TOWN_ID, T.NAME AS TOWN_NAME, T.CODE AS TOWN_CODE, T.CTYPE_ID AS T_CTYPE_ID,
S.ID AS STREET_STREET_ID, S.NAME AS STREET_NAME,
C.ID AS C_ID, C.ABR AS C_ABR
FROM BUYERS R, TOWNS T, STREET S, CTYPE C


Viewer ( 2002-06-27 21:06 ) [4]

Еще можно проектировать таблицы и поля как
TABLE1_FIELDNAME1

Но для универсальности это не здорово, хотя и обходимо.


Polevi ( 2002-06-28 08:20 ) [5]

это извращение


Diana ( 2002-07-02 08:41 ) [6]

А как на счет стандартного метода?
Select t1.*,t2.*
from table1 t1, table2 t2
where t1. =t2.

Имейте в виду без t1. =t2. записи в таблицах просто перемножатся друг на друга.
Да и все столбцы выберать не обязательно,
можно так
select t1. П1, t2. П2 .
И все будет. 🙂


Oleggg ( 2002-07-02 09:38 ) [7]

Юзай UNION
select * from t1 union select * from t2.

ЗЫ Спасибо Динана, насмешила — хороший пример того, что до девушек туго доходит, что нужно парням 🙂


Sergey13 ( 2002-07-02 09:46 ) [8]

2Oleggg (02.07.02 09:38)
А ты сам то понял о чем речь? 😎
Хороший пример того, что до некоторых парней вообще не доходит.


Lemon_AlexL ( 2002-07-02 11:18 ) [9]

Для того, что бы поля с одинаковыми названиями выводились в результате как два поля с разными названиями необходимо:

Присвоить в выборке им (полям) свои названия используя инструкцию
«ИМЯ_ПОЛЯ_В_ТАБЛИЦЕ» AS «ИМЯ_ПОЛЯ_В_РЕЗУЛЬТАТЕ». Правда для этого придется отказаться от символа «*» в SELECT, в мсто этого перечислять поля как они есть.
Пример:
SELECT (T1.FIELD1) AS FIELD1_FROM_T1,
(T2.FIELD1) AS FIELD1_FROM_T2
FROM TABLE1 T1, TABLE2 T2
. ну и т. д.

Источник

Запрос на выборку из двух таблиц в AdoQuery в Delphi

Доброго времени суток! Подскажите, как сделать запрос на выборку нескольких полей из двух таблиц через AdoQuery в Delphi. Сама база на Access-е. Никак не получается сделать (( выдает только первую строку и все (

Добавлено через 9 минут
Забыла сказать, нужно, чтобы выдавал то, что вводишь в Edit.
Помогите студентке, пожалуйста ))))

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Запрос на выборку из двух таблиц
Люди, беда! Не пойму, как реализовать. Есть три таблицы, с друг другом связанные. Есть форма.

Запрос на выборку из двух таблиц
столкнулся с такой вот проблемой. существует допустим две таблицы А (id->1,2,3,4,5) и B.

Запрос на выборку из двух таблиц
есть две таблицы таблица_разделов: id;id_parent;name_razdel таблица_товаров.

Запрос на выборку из двух таблиц
Есть две таблицы EMP(персонал) с полями id,fio,dep_id и DEP(подразделение) c полями dep_id и.

У меня две таблицы: Основная и Сражения
Основная: Название_Корабля,Водоизмещение,Год_спуска_на_воду,ID (ключевое)
Сражения: Название_сражения,Дата_сражения,Место_сражения,Результат,ID( ключевое) и ID_Osn (для связи), связаны через поля ID (Основная) и ID_Osn (Сражения).
В Access-е запрос сделала, он работает:

а в делфи сто раз уже пыталась, все варианты не вспомню))) ну вот последний:

Спасибо большое. Очень помогли. Я пыталась делать с параметром, только криво все написала )))
А если делать запрос на удаление?

Добавлено через 29 минут
Я еще ламер в этом деле((( опять только первую строку выдает(
Вы можете написать код в делфи (то, что должно быть в процедуре нажатия кнопки)? Заранее спасибо.

Сообщение от QSunny
Сообщение от QSunny

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Запрос на выборку из двух таблиц
Всем доброго времени суток. Помогите пожалуйста составить SQL-запрос. Есть две таблицы.

Запрос на выборку из двух таблиц Mysql
Всем доброго времени. Суть вопроса такова : есть 2 таблицы — первая: Куплено вторая: Продано. Обе.

Запрос на выборку данных из двух таблиц с суммированием
Пишу программу на VB.net, и никак не получается составить запрос к БД Access/ В БД Access есть.

Запрос на выборку из двух таблиц и сложение результата
Здравствуйте! Мне нужно из 2-х несвязанных таблиц выбирать 2 значения по времени и складывать их.

Источник

Как связать в делфи 2 таблицы через ADOquery?

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Как в делфи добавить через Adoquery в таблицу вещественное число, через insert
Как в делфи добавить через Adoquery в таблицу вещественное число, через insert. При добавлении у.

Как связать две формы через ADOQuery?
я создал 4 таблицы в акссее и 2 формы. в одной форме анкета студентов (все работает) а на в второй.

Как связать 2 таблицы в делфи
Здравствуйте. Подскажите как связать таблицы в делфи. Имеем табл1 (владелец) с полями ФИО id.

Как связать таблицы через sql запрос
Добрый день, имеется, к примеру, такие таблицы со связью.

опишу конкретнее свою ситуация.
у меня 2 таблицы.. связаны в аксессе через столбцы ФАМИЛИЯ. теперь мне надо связать их в делфи. через adoquery. потом на эту форму добавить BITBTN и чтоб при нажатии на него у меня открывалась форма с компонентами dbedit и BITBTN для добавления данных в эти 2 таблицы. и после добавления данных в таблицы, и чтоб при выборе одного из фамилии, у меня отображались данные связанные искючительно с этой фамилией и на второй таблице.

Добавлено через 1 минуту
спасибо за совет Waddonato r) тока я чета через фильтр не очень понял как делать.

Waddonator спасибо большое.

щас попробую разобраться)

Добавлено через 15 часов 13 минут
у меня на 5 строке, где вводится ключевые поля, выходит ошибка. кажется чего то не хватает. filrer поменял на filter. все равно не пашет. теперь не знаю че делать. Waddonator, подскажи что нибудь.. буду благодарен.

Добавлено через 3 минуты
у меня на 5 строке, где вводится ключевые поля, выходит ошибка. кажется чего то не хватает. filrer поменял на filter. все равно не пашет. теперь не знаю че делать. Waddonator, подскажи что нибудь.. буду благодарен.

Получается связь таблиц только через компоненты ADOQuery делается? А в ClientDataSet (для подчиненной) поля MasterSource, MasterFields, IndexFieldName заполнять вообще не надо?

Я думал их стыковать главную-подчиненную только через ClientDataSet можно, а ADOQuery у них однотипно настраиваются.

А то проблема в чем: если ADOQuery ставлю для подчиненной, то в случае отсутствия подчиненных записей для какой-либо записи из главной таблицы — вылазит ошибка «key violation» и программа вылетает. А если для подчиненной вместо ADOQuery поставить ADOTable — то все нормально. А мне бы хотелось все-таки ADOQuery в подчиненной, там же SQL можно менять и т.д.

Может в свойстве SQL ADOQuery подчиненной весь косяк? В этом запросе можно что-то ставить типа ORDER BY например?

Источник

Delphi две таблицы запрос

Вы здесь: Home *delphi* Все статьи Репликация, синхронизация из двух баз например на Firebird , гетерогенные запросы . Сравнение таблиц

Репликация, синхронизация из двух баз например на Firebird , гетерогенные запросы . Сравнение таблиц

Статья от автора Крайнего http://krayny.ru: Вопрос очень интересный, но наверно готовые программы не подойдут по синхронизации баз. Есть три базы: А(таблица 1,2,3)- расположение в интернет на дохлых скоростях, доступ всеми юзерами и базы В(таблица1,2) и С(таблица3) которые дополняют базу А из других источников. Вся проблема в таблицах поля ID — уникальным записям. которые могут не совпадать при добавлении в базу А с другими базами В, С. Предварительно вижу решение, создания дополнительной таблицы в базе А, с ходом и логом синхронизации на котором будут ID всех баз источник и получатель, дата обновления, имя таблицы первоисточника. Второй вариант создание в базе А, в каждой таблице доп. поля с ID номером соотвествия из другой базы (например В). С новыми записями понятно, а вот актуальностью самих записей которые редактировались, думаю тут только решение — отдельные поля по датам обновления, либо что-то то похожее на контрольную сумму всей строки чтоб засекать измения. Делать несколько этапную синхронизацию. как практически реализую думаю. Профессорских статей в интернет много, но кратких и практических мало, нужно смотреть как это будет работать у самого )).

Читайте также:  Вес пня при корчевке таблица

Зеркалирование, полный клон не подходит т.к. будут отличатся ID в разных базах с одинаковыми записями. И на базе А возможно подтирание старой информации. Начал движение в сторону работы с каждой таблицей базы, а именно по вопросу сравнение таблиц. Тут решено дополнять базы на информацию которой нет в базе А, в этом варианте тогда должно быть уникальное еще поле помимо ID записи. У меня оно нашлось, спец. № отличительный по ней и будет сравнивать, у кого то может быть эл. почта, счет — фактура, № заказа , артикул и т.п.

Мы имеем одну прогу, с соединенными базами, допустим двумя с разных IP. И тут наткунулся на проблему. Из Delphi не могу сделать запрос сравнивания двух таблиц из разных БД. Отписался на форумы, ответ был унылый, не возможно или сложными путями, а хотел делать уже на найденных примерах. Вот вопрос на форуме.

Есть две разные базы(соединение в одной программе, на разные IP) через компоненты FIB(FIBDatabase) реализация на Delphi. Нужно сравнить две таблицы по полям одинаковые по структуре. Пытаюсь сделать что-то вроде этого;
ПРИМЕР
select x1.fld from table x1 where not EXISTS(select x2.fld from table x2 where x2.fld=x1.fld ) — выбрать записи которые не совпадают.

но с pfibdataset не могу указать вторую таблицу в другой базе, названия таблиц совпадают.
и не могу продолжить
DM.efSDS.SelectSQL.Clear;
DM.efSDS.SelectSQL.Add(‘SELECT X1.fld FROM X1 WHERE. ‘);

На форуме видел и это ПРИМЕР: SELECT a.fld1, a.fld2 FROM db1.table1 a, db2.table1 b WHERE a.id=b.id , и это не мойму как сделать.

Ясно все когда две таблицы в одной базе. Как мне в коде запроса сослатся на другую таблицу в другой базе( подключенные в разных FIBDatabase,fibdataset ) с таким же именем, не могу понять как практически реализовать это. И вывести как угодно , допустим DBGrid. Может кто подскажет как на Delphi это реализовать, примеры.

В основном получил два ответа: 1. Как-то через BDE 2. Что это гетерогенные запрос , п..дец даже не представляю что это, в Firebird не применимый (кто-то пишет, можеть быть возможно в Firebird 3.0). Были ответы перехода на платные базы и возможности делать гетерогенные запросы в Oracle. Тут стало, ясно, натнулся на камни, все не просто.

Был ответ, делать два разных запроса по каждой таблице и сравнивать их, почти построчно.Логически выглядит примерно так наверно

Мда, с 100 записями все просто было, а база большая. Кажется, тупик. И мысли поворачиваются назад к идеи в начале статьи, отдельная таблица сравнения или доп. поле. Все эти сложные замуты и поиска готового варианта или комманд запроса, какие то переборы записей и т.п. — все не подходит. И тут Интернет НЕ ПОМОГ !. Будет делатся по совственному принципу, думаю получится быстро.

Личное решение, которое пойдет не только к Firebird:

1. У всех баз есть свои записи с ID, надо следить когда были измения, неважно какие и что в строках. Измения будет следить отдельным полем Даты+время, создаем во всех таблицах и на всех базах допустим поле data_edit (новая запись БД , дату ставим текущую, редактирование тоже). Зачем всем базам? При копирование записей в базу А(основную) , например с В(источники) тоже переносим время. Когда даты не совпадут, станет ясно база менялась у кого-то.

2. Для быстрого переноса на базу А(основную), должно быть место куда мы записываем какое последнюю последовательную ID с баз B,C мы переносили. Со временем данные новые появляют на базах B,С, ID увеличиваются. Уточняем какие последние сейчас на B,С, на чем остановились на А , и докопируем новые данные. Остается проблема как распознавать разные базы B, С, кто есть кто — это не проблема, просто, создадим отличительные где-то метки в базе.

3. Получается для обслуживания поле data_edit , фиксация последнего ID при переносе с других баз B, C. Для надежности и ясности добавляем в базу А еще два поля во все таблицы это ID первоисточника из других баз(допустим ID_primary) и поле метки с какой базы дополнения (base_primary) ,

4. Остается актуализация базы А, когда нет новых записей, но наличием редактирования. Тут нам уже помогут поле data_edit что мы создали и его быстрое нахождение в другой базе по полю ID_primary, а base_primary — укажет мы ли тут хозяйничали. Имея даты изменения, можно быстрее следить только за изменнными данными, а не гонять все базы от 1 записи и до бесконечности.

Решение покажется сложным, но логически очень быстрым при дохлом интернет у базы А. Остается реализовать это.

5. Создаем програмулку или кнопочку, которая сама собирает названия таблиц, раставляет новые метки, создает новые поля в оговоренные в пунктах 1-4 выше, не ковыряя все руками (в разработке).

INSERT INTO CURRENCY (ID, ISO_LAT, NAME, ISSHOW, HTMLCODE, RCODE) VALUES (840, ‘USD’, ‘Доллары США’, ‘Y’, ‘$’, ‘R01235’);
INSERT INTO CURRENCY (ID, ISO_LAT, NAME, ISSHOW, HTMLCODE, RCODE) VALUES (810, ‘RUR’, ‘Рубли РФ’, ‘Y’, ‘р.’, NULL);

Из форума сравнение и замена MINUS

I have two equal queries whit different filter applied on the same table. the first query returns (1,2,3,4,5) and the second returns (3,4,5).

I want apply the MINUS/EXCEPT operator: select1 minus select2 = (1,2)

How should I implements this logic using firebird SQL dialect ? (I’musing superserver v2.1)

I’m getting the opposite results performing select1 UNION select2 = (1,2,3,4,5)

In FB there is no minus operator, so :

The MINUS operator does not exist in Firebird. The closest approximation I can think of is something like the example below. This uses Common Table Expressions, introduced in Firebird 2.1, but could of course also work with subqueries (I just find CTE more readable)

In this query I use LEFT JOIN to combine select1 and select2 , and then only retain those rows from select1 that do not occur in select2

Нужно объединить запросы. Например, есть запрос суммарные покупки за день, есть запрос суммарные продажи за день. Нужно чтобы в результирующем наборе были поля: дата, объем покупок, объем продаж. Как это сделать? К сожалению в Interbase нет конструкции типа
select * from table1 left join (select * from table2).

1. select (select count(*) from table1), (select count(*) from table2) from rdb$database

Можно использовать UNION если поля результирующих рекордсетов одинаковые

Возможно я не верно понял Ваш вопрос, но что если попробовать так:

Если что не так то объясните подробнее что Вам требуется …

SELECT T1.ID, T2.ID
FROM T1
FULL OUTER JOIN T2 ON (T2.ID = T1.ID)
WHERE T1.ID IS NULL OR T2.ID IS NULL

типа этого
select t1.*
from table1 t1 left join table2 t2 on t1.id = t2.id
where t2.id is null

Читайте также:  Таблица коэффициентов стран для клубов

select . from table1 where not exists(select…from table2 where…)
Пойдет ?

Данный вопрос не закрытый, редактируется по мере реализации вопроса…

Источник

SQL-запросы в Delphi

Компоненты Delphi для работы с базами данных были созданы в расчете на работу с SQL и архитектурой клиент/сервер. При работе с ними вы можете воспользоваться характеристиками расширенной поддержки удаленных серверов. Delphi осуществляет эту поддержку двумя способами. Во-первых, непосредственные команды из Delphi позволяют разработчику управлять таблицами, устанавливать пределы, удалять, вставлять и редактировать существующие записи. Второй способ заключается в использовании запросов на языке SQL, где строка запроса передается на сервер для ее разбора, оптимизации, выполнения и передачи обратно результатов.

Примечание: Данный документ представляет собой коллективный труд нескольких авторов, которые индивидуально несут ответственность за качество предоставленной здесь информации. Borland не предоставлял, и не может предоставить никакой гарантии относительно содержимого данного документа.

  • Введение
  • Компонент TQuery
    • Свойство SQL
    • Свойство Params
    • Источник данных
    • Команда Format
    • Open против ExecSQL
  • Компонент TStoredProc
  • TDatabase
  • Выводы

1. Введение

Данный документ делает акцент на втором методе доступа к базам данных, на основе запросов SQL (pass-through). Авторы не стремились создать курсы по изучению синтаксиса языка SQL и его применения, они ставили перед собой цель дать несколько примеров использования компонентов TQuery и TStoredProc. Но чтобы сделать это, необходимо понимать концепцию SQL и знать как работают selects, inserts, updates, views, joins и хранимые процедуры (stored procedures). Документ также вскользь касается вопросов управления транзакциями и соединения с базой данных, но не акцентирует на этом внимание. Итак, приступая к теме, создайте простой запрос типа SELECT и отобразите результаты.

2. Компонент TQuery

Если в ваших приложениях вы собираетесь использовать SQL, то вам непременно придется познакомиться с компонентом TQuery. Компоненты TQuery и TTable наследуются от TDataset. TDataset обеспечивает необходимую функциональность для получения доступа к базам данных. Как таковые, компоненты TQuery и TTable имеют много общих признаков. Для подготовки данных для показа в визуальных компонентах используется все тот же TDatasource. Также, для определения к какому серверу и базе данных необходимо получить доступ, необходимо задать имя псевдонима. Это должно выполняться установкой свойства aliasName объекта TQuery.

Свойство SQL

Все же TQuery имеет некоторую уникальную функциональность. Например, у TQuery имеется свойство с именем SQL. Свойство SQL используется для хранения SQL-запроса. Ниже приведены основные шаги для составления запроса, где все служащие имеют зарплату свыше $50,000.

    Создайте объект TQuery

Задайте псевдоним свойству DatabaseName. (Данный пример использует псевдоним IBLOCAL, связанный с демонстрационной базой данных employee.gdb).

Выберите свойство SQL и щелкните на кнопке с текстом — ‘. ‘ (три точки, Инспектор Объектов — В.О.). Должен появиться диалог редактора списка строк (String List Editor).

Введите: Select * from EMPLOYEE where SALARY>50000. Нажмите OK.

Выберите в Инспекторе Объектов свойство Active и установите его в TRUE.

Разместите на форме объект TDatasource.

Установите свойство Dataset у TDatasource в Query1.

Разместите на форме TDBGrid.

  • Установите его свойство Datasource в Datasource1.
  • Свойство SQL имеет тип TStrings. Объект TStrings представляет собой список строк, и чем-то похож на массив. Тип данных TStrings имеет в своем арсенале команды добавления строк, их загрузки из текстового файла и обмена данными с другим объектом TStrings. Другой компонент, использующий TStrings — TMemo. В демонстрационном проекте ENTRSQL.DPR (по идее, он должен находится на отдельной дискете, но к «Советам по Delphi» она не прилагается — В.О.), пользователь должен ввести SQL-запрос и нажать кнопку «Do It» («сделать это»). Результаты запроса отображаются в табличной сетке. В Листинге 1 полностью приведен код обработчика кнопки «Do It».

    Свойство Params

    Этого должно быть достаточно для пользователя, знающего SQL. Тем не менее, большинство пользователей не знает этого языка. Итак, ваша работа как разработчика заключается в предоставлении интерфейса и создании SQL-запроса. В Delphi, для создания SQL-запроса на лету можно использовать динамические запросы. Динамические запросы допускают использование параметров. Для определения параметра в запросе используется двоеточие (:), за которым следует имя параметра. Ниже приведен пример SQL-запроса с использованием динамического параметра:

    Если вам нужно протестировать, или установить для параметра значение по умолчанию, выберите свойство Params объекта Query1. Щелкните на кнопке ‘. ‘. Должен появиться диалог настройки параметров. Выберите параметр Dept_no. Затем в выпадающем списке типов данных выберите Integer. Для того, чтобы задать значение по умолчанию, введите нужное значение в поле редактирования «Value».

    Для изменения SQL-запроса во время выполнения приложения, параметры необходимо связать (bind). Параметры могут изменяться, запрос выполняться повторно, а данные обновляться. Для непосредственного редактирования значения параметра используется свойство Params или метод ParamByName. Свойство Params представляет из себя массив TParams. Поэтому для получения доступа к параметру, необходимо указать его индекс. Для примера,

    Свойство asInteger читает данные как тип Integer (название говорит само за себя). Это не обязательно должно указывать но то, что поле имеет тип Integer. Например, если тип поля VARCHAR(10), Delphi осуществит преобразование данных. Так, приведенный выше пример мог бы быть записан таким образом:

    Если вместо номера индекса вы хотели бы использовать имя параметра, то воспользуйтесь методом ParamByName. Данный метод возвращает объект TParam с заданным именем. Например:

    В листинге 2 приведен полный код примера.

    Обратите внимание на процедуру, первым делом подготавливающую запрос. При вызове метода prepare, Delphi посылает SQL запрос на удаленный сервер. Сервер выполняет грамматический разбор и оптимизацию запроса. Преимущество такой подготовки запроса состоит в его предварительном разборе и оптимизации. Альтернативой здесь может служить подготовка сервером запроса при каждом его выполнении. Как только запрос подготовлен, подставляются необходимые новые параметры, и запрос выполняется.

    Источник данных

    В предыдущем примере пользователь мог ввести номер отдела, и после выполнения запроса отображался список сотрудников этого отдела. А как насчет использования таблицы DEPARTMENT, позволяющей пользователю легко перемещаться между пользователями и отделами?

    Примечание: Следующий пример использует TTable с именем Table1. Для Table1 имя базы данных IBLOCAL, имя таблицы — DEPARTMENT. DataSource2 TDatasource связан с Table1. Таблица также активна и отображает записи в TDBGrid.

    Способ подключения TQuery к TTable — через TDatasource. Есть два основных способа сделать это. Во-первых, разместить код в обработчике события TDatasource OnDataChange. Например, листинг 3 демонстрирует эту технику.

    Листинг 3 — Использования события OnDataChange для просмотра дочерних записей

    Техника с использованием OnDataChange очень гибка, но есть еще легче способ подключения Query к таблице. Компонент TQuery имеет свойство Datasource. Определяя TDatasource для свойства Datasource, объект TQuery сравнивает имена параметров в SQL-запросе с именами полей в TDatasource. В случае общих имен, такие параметры заполняются автоматически. Это позволяет разработчику избежать написание кода, приведенного в листинге 3 (*** приведен выше ***).

    Фактически, техника использования Datasource не требует никакого дополнительного кодирования. Для подключения запроса к таблице DEPT_NO выполните действия, приведенные в листинге 4.

    Листинг 4 — Связывание TQuery c TTable через свойство Datasource

    Выберите у Query1 свойство SQL и введите:

    Выберите свойство Datasource и назначьте источник данных, связанный с Table1 (Datasource2 в нашем примере)

    Выберите свойство Active и установите его в True

    Это все, если вы хотите создать такой тип отношений. Тем не менее, существуют некоторые ограничения на параметризованные запросы. Параметры ограничены значениями. К примеру, вы не можете использовать параметр с именем Column или Table. Для создания запроса, динамически изменяемого имя таблицы, вы могли бы использовать технику конкатенации строки. Другая техника заключается в использовании команды Format.

    Команда Format

    Команда Format заменяет параметры форматирования (%s, %d, %n и пр.) передаваемыми значениями. Например,

    Читайте также:  Как проще выучить таблицу умножения для детей

    Результатом вышеприведенной команды будет ‘Select * from EMPLOYEE’. Функция буквально делает замену параметров форматирования значениями массива. При использовании нескольких параметров форматирования, замена происходит слева направо. Например,

    Результатом команды форматирования будет ‘Select * from EMPLOYEE where EMP_ID=3’. Такая функциональность обеспечивает чрезвычайную гибкость при динамическом выполнении запроса. Пример, приведенный ниже в листинге 5, позволяет вывести в результатах поле salary. Для поля salary пользователь может задавать критерии.

    Листинг 5 — Использование команды Format для создания SQL-запроса

    В этом примере мы используем методы Clear и Add свойства SQL. Поскольку «подготовленный» запрос использует ресурсы сервера, и нет никакой гарантии что новый запрос будет использовать те же таблицы и столбцы, Delphi, при каждом изменении свойства SQL, осуществляет операцию, обратную «подготовке» (unprepare). Если TQuery не был подготовлен (т.е. свойство Prepared установлено в False), Delphi автоматически подготавливает его при каждом выполнении. Поэтому в нашем случае, даже если бы был вызван метод Prepare, приложению от этого не будет никакой пользы.

    Open против ExecSQL

    В предыдущих примерах TQuerie выполняли Select-запросы. Delphi рассматривает результаты Select-запроса как набор данных, типа таблицы. Это просто один класс допустимых SQL-запросов. К примеру, команда Update обновляет содержимое записи, но не возвращает записи или какого-либо значения. Если вы хотите использовать запрос, не возвращающий набор данных, используйте ExecSQL вместо Open. ExecSQL передает запрос для выполнения на сервер. В общем случае, если вы ожидаете, что получите от запроса данные, то используйте Open. В противном случае допускается использование ExecSQL, хотя его использование с Select не будет конструктивным. Листинг 6 содержит код, поясняющий сказанное на примере.

    Все приведенные выше примеры предполагают использования в ваших приложениях запросов. Они могут дать солидное основание для того, чтобы начать использовать в ваших приложениях TQuery. Но все же нельзя прогнозировать конец использования SQL в ваших приложениях. Типичные серверы могут предложить вам другие характеристики, типа хранимых процедур и транзакций. В следующих двух секциях приведен краткий обзор этих средств.

    3. Компонент TStoredProc

    Хранимая процедура представляет собой список команд (SQL или определенного сервера), хранимых и выполняемых на стороне сервера. Хранимые процедуры не имеют концептуальных различий с другими типами процедур. TStoredProc наследуется от TDataset, поэтому он имеет много общих характеристик с TTable и TQuery. Особенно заметно сходство с TQuery. Поскольку хранимые процедуры не требуют возврата значений, те же правила действуют и для методов ExecProc и Open. Каждый сервер реализует работу хранимых процедур с небольшими различиями. Например, если в качестве сервера вы используете Interbase, хранимые процедуры выполняются в виде Select-запросов. Например, чтобы посмотреть на результаты хранимой процедуры, ORG_CHART, в демонстрационной базе данных EMPLOYEE, используйте следующих SQL-запрос:

    При работе с другими серверами, например, Sybase, вы можете использовать компонент TStoredProc. Данный компонент имеет свойства для имен базы данных и хранимой процедуры. Если процедура требует на входе каких-то параметров, используйте для их ввода свойство Params.

    4. TDatabase

    Компонент TDatabase обеспечивает функциональность, которой не хватает TQuery и TStoredProc. В частности, TDatabase позволяет создавать локальные псевдонимы BDE, так что приложению не потребуются псевдонимы, содержащиеся в конфигурационном файле BDE. Этим локальным псевдонимом в приложении могут воспользоваться все имеющиеся TTable, TQuery и TStoredProc. TDatabase также позволяет разработчику настраивать процесс подключения, подавляя диалог ввода имени и пароля пользователя, или заполняя необходимые параметры. И, наконец, самое главное, TDatabase может обеспечивать единственную связь с базой данных, суммируя все операции с базой данных через один компонент. Это позволяет элементам управления для работы с БД иметь возможность управления транзакциями.

    Транзакцией можно считать передачу пакета информации. Классическим примером транзакции является передача денег на счет банка. Транзакция должна состоять из операции внесения суммы на новый счет и удаления той же суммы с текущего счета. Если один из этих шагов по какой-то причине был не выполнен, транзакция также считается невыполненной. В случае такой ошибки, SQL сервер позволяет выполнить команду отката (rollback), без внесения изменений в базу данных. Управление транзакциями зависит от компонента TDatabase. Поскольку транзакция обычно состоит из нескольких запросов, вы должны отметить начало транзакции и ее конец. Для выделения начала транзакции используйте TDatabase.BeginTransaction. Как только транзакция начнет выполняться, все выполняемые команды до вызова TDatabase.Commit или TDatabase.Rollback переводятся во временный режим. При вызове Commit все измененные данные передаются на сервер. При вызове Rollback все изменения теряют силу. Ниже в листинге 7 приведен пример, где используется таблица с именем ACCOUNTS. Показанная процедура пытается передать сумму с одного счета на другой.

    И последнее, что нужно учесть при соединении с базой данных. В приведенном выше примере, TDatabase использовался в качестве единственного канала для связи с базой данных, поэтому было возможным выполнение только одной транзакции. Чтобы выполнить это, было определено имя псевдонима (Aliasname). Псевдоним хранит в себе информацию, касающуюся соединения, такую, как Driver Type (тип драйвера), Server Name (имя сервера), User Name (имя пользователя) и другую. Данная информация используется для создания строки соединения (connect string). Для создания псевдонима вы можете использовать утилиту конфигурирования BDE, или, как показано в примере ниже, заполнять параметры во время выполнения приложения.

    TDatabase имеет свойство Params, в котором хранится информация соединения. Каждая строка Params является отдельным параметром. В приведенном ниже примере пользователь устанавливает параметр User Name в поле редактирования Edit1, а параметр Password в поле Edit2. В коде листинга 8 показан процесс подключения к базе данных:

    Этот пример показывает как можно осуществить подключение к серверу без создания псевдонима. Ключевыми моментами здесь являются определение DriverName и заполнение Params информацией, необходимой для подключения. Вам не нужно определять все параметры, вам необходимо задать только те, которые не устанавливаются в конфигурации BDE определенным вами драйвером базы данных. Введенные в свойстве Params данные перекрывают все установки конфигурации BDE. Записывая параметры, Delphi заполняет оставшиеся параметры значениями из BDE Config для данного драйвера. Приведенный выше пример также вводит такие понятия, как сессия и метод GetTableNames. Это выходит за рамки обсуждаемой темы, достаточно упомянуть лишь тот факт, что переменная session является дескриптором database engine. В примере она добавлена только для «показухи».

    Другой темой является использование SQLPASSTHRU MODE. Этот параметр базы данных отвечает за то, как натив-команды базы данных, такие, как TTable.Append или TTable.Insert будут взаимодействовать с TQuery, подключенной к той же базе данных. Существуют три возможных значения: NOT SHARED, SHARED NOAUTOCOMMIT и SHARED AUTOCOMMIT. NOT SHARED означает, что натив-команды используют одно соединение с сервером, тогда как запросы — другое. Со стороны сервера это видится как работа двух разных пользователей. В любой момент времени, пока транзакция активна, натив-команды не будут исполняться (committed) до тех пор, пока транзакция не будет завершена. Если был выполнен TQuery, то любые изменения, переданные в базу данных, проходят отдельно от транзакции.

    Два других режима, SHARED NOAUTOCOMMIT и SHARED AUTOCOMMIT, делают для натив-команд и запросов общим одно соединение с сервером. Различие между двумя режимами заключаются в передаче выполненной натив-команды на сервер. При выбранном режиме SHARED AUTOCOMMIT бессмысленно создавать транзакцию, использующую натив-команды для удаления записи и последующей попыткой осуществить откат (Rollback). Запись должна быть удалена, а изменения должны быть сделаны (committed) до вызова команды Rollback. Если вам нужно передать натив-команды в пределах транзакции, или включить эти команды в саму транзакцию, убедитесь в том, что SQLPASSTHRU MODE установлен в SHARED NOAUTOCOMMIT или в NOT SHARED.

    5. Выводы

    Delphi поддерживает множество характеристик при использовании языка SQL с вашими серверами баз данных. На этой ноте разрешите попрощаться и пожелать почаще использовать SQL в ваших приложениях.

    Источник

    Adblock
    detector