Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

TQuery

2.0K
15 января 2004 года
laifik
37 / / 23.10.2003
Пытаюсь понять, почему так происходит? И пока не знаю ответа.
База SQL находится на удаленном сервере. Записей уже более 9 тыс. В программе она подсоединяется через TTable, поэтому загружается долго. Конечно, правильнее делать через TQuery. Попыталась сделать маленький пример, чтобы посмотреть, как быстро загружается база. Оказалось, если подсоединить одну таблицу из базы, причем данных там более 9 тыс - загружается мгновенно. Если на эту же форму кинуть еще один DBGrid, подсоединить через TQuery еще одну таблицу с маленьким набором данных (всего 2 поля и примерно 50 записей типа "10410"), то база загружается также, как будто бы я подсоединяюсь через TTable.
Это первая часть вопроса. А второй:
вторая таблица является для первой таблицей подстановки и связывается по ключу в отношении "один- ко многим". Если подсоединяться через TTable, то можно вывести выпадающий список через DBLookupComboBox. А как это сделать в запросе? Причем, вторую таблицу я хочу загрузить тоже через запрос.
Хочу заметить, что тестируя свой первый вопрос, для второй таблицы я пока не учитываю никаких ключей связи. Просто подключаю ее параллельно с первой. Заранее спасибо!
293
15 января 2004 года
SEDEGOFF
586 / / 06.10.2002
Во первых ТТабле грузит все записи таблицы - вот из за этого и тормазит (Это ты сама знаешь). Куери запрашивает только несколько записей (столько - сколько можно отобразить), и как эффект - быстрая загрузка.
Связь можно сдалать програмно через обычный комбо.
А вот почему у тебя с двумя запросами тормозит я не знаю. Проверь еще раз - нет ли звязи между ними или не создано в первом запросе лукап поле относительно второго поля
2.0K
16 января 2004 года
laifik
37 / / 23.10.2003
Я ошибочно создала новую тему. Продолжаю:
Запрос по Table1:
SELECT * FROM ТблДелоОсн ORDER BY NomerPP
NomerPP - это уникальный ключ Table1.
Запрос по Table2:
SELECT dbo.ТблЗаказ.Kod, dbo.ТблЗаказ.Zakaz
FROM dbo.ТблЗаказ
Kod - это уникальный ключ Table2.
Table2 таблица-подстановка для поля, например, project, Table1.
В С++ Билдере я пока обрубила все связи, чтобы просто проверить скорость работы запросов на одной форме. Но в схеме SQL эти связи по ключу есть.
Но и это не имеет значения. Т.к., в качестве эксперимента, вместо Table2 я подключила Table3, которая и в SQL не имеет никакой связи с Table1. Запросы загружаются очень долго. А по отдельности - мгновенно.
Не могу понять этому причину. Оба запроса должны загружаться мгновенно.
И по поводу ComboBox. Я понимаю, что его нужно загрузить на событии
void __fastcall TForma::ComboBox1DropDown(TObject *Sender), а затем сделать, чтобы при выборе значения из списка оно прописалось в поле таблицы 1? Правильно я мыслю?
2.0K
16 января 2004 года
laifik
37 / / 23.10.2003
По поводу загрузки докопалась до причины. При открытии запроса я пользовалась методом Open(). Запросы загружались долго. А попробовала Active = true, загрузились быстро. Почему? В книге Архангельского написано, что по большому счету нет разницы, каким методом загружать запрос.
И хотелось бы еще получить конкретный вопрос по ComboBox. Вопрос этот в моем предыдущем комментарии.:roll:
293
16 января 2004 года
SEDEGOFF
586 / / 06.10.2002
На счет долгой загрузки - у меня так и не получилось добиться твоего результата

По поводу Комбо. Ты почти права. Надо в событии OnChange Обрабатывать изменения или если у тебя статичная форма, то при сохранении информации
2.0K
16 января 2004 года
laifik
37 / / 23.10.2003
Если можно, приведите, пожалуйста, код, по которому загружаете 2 запроса.
Что-то я поторопилась с выводами. Загрузила 2 таблицы, обе большие и снова тормоз.
В аналогичном примере сделала то же самое, тормоз. Что происходит?:devil:
293
19 января 2004 года
SEDEGOFF
586 / / 06.10.2002
В Событии OnCreate формы

Screen->Cursor = crHourGlass;
String sql1 = "..";
String sql2 = "..";
Query1->SQL->Text = sql1;
Query2->SQL->Text = sql2;
Query1->Prepare();
Query2->Prepare();
Query1->Open();
Query2->Open();
Screen->Cursor = crDefault;

Хотя вместо Query я бы посоветовал вам DataSet - он лучше во всех отношения
2.0K
19 января 2004 года
laifik
37 / / 23.10.2003
Что-то все равно не получается. Query1 и Query3 - данных много. Но по отдельности данные загружаются мгновенно. Стоит скомбинировать вместе с Query2 хотя бы один запрос, и начинает тормозить. Хотя в Query2 данных ну оччченьи мало.
Делаю как Вы.
Screen->Cursor = crHourGlass;
String sql1 = "SELECT * FROM ТблЗаказ ORDER BY NomerPP";
String sql2 = "SELECT ТблЗаказ.Kod, ТблЗаказ.Zakaz FROM ТблЗаказ";
String sql3 = "SELECT * FROM ТблЧертеж Where Nomerpp=:NomerPP";
Query1->SQL->Text = sql1;
Query2->SQL->Text = sql2;
Query3->SQL->Text = sql3;
Query1->Prepare();
Query2->Prepare();
Query3->Prepare();
Query1->Open();
Query2->Open();
Query3->Open();
Screen->Cursor = crDefault;
Если использую компонент Database и в ТQuery подключаюсь через псевдоним, а сами компоненты размещаю на Data Module,
DataModule->Query1 и т.д.
то выдается какая-то формочка, где есть сообщение:"Access in invalid memory".
Когда подключала TTable, этого не было.
А компонент DataSet -это SQLDataSet?
2.0K
23 января 2004 года
laifik
37 / / 23.10.2003
Так до конца вопрос я не выяснила. Но буду довольствоваться тем, что запрос загружается долго, а работает быстро.
Вопрос сейчас в другом. Хотелось бы разобраться с запросами досконально, а именно, с компонентом TQuery.
Методом Open() я открываю запрос на просмотр. Как я понимаю, Add() позволяет мне добавлять записи. В литературе описывается этот метод для добавления одной записи конкретного поля. А если у меня в запросе 45 полей. Тогда как?
Почему приятнее использовать таблицу: там вставляешь Insert() и добавляется строка из этих 45 полей и в каждое можно внести значение.
Если можно, скинте код по данному вопросу. Буду очень благодарна, если мне это поможет разобраться с запросами.:)
293
23 января 2004 года
SEDEGOFF
586 / / 06.10.2002
Запрос в TQuery открывает на набор данных только на чтение - и никак нельзя добавлять новыес строки и даже редактировать. TTable - это компонент на основе DataSet - он автоматически генерирует строки на вставку, изменение, чтение и удаление записей. Но он очень тяжелый - поэтому лучше использовать DataSet - где самому настроить все запросы.

По поводу TQuery - если долго загружает, но быстро ищет - это значит что в память грузяться все строки таблицы - я точно не знаю но скорее всего это предусмотрено методом Open(). Посмотрите еще настройки. Обычно чтобы загрузить все данные сразу (для быстрого поиска) я делаю так
Query->Open();
Query->FetchAll();
2.0K
23 января 2004 года
laifik
37 / / 23.10.2003
Вот про DataSet мне уже намекали. Но я так и не поняла, из какой вкладки этот компонент. В чистом виде не нашла. Есть BDEClientDataSet, SQLDataSet и т.д.
Мне бы этот компонент подошел. В литературе не нашла ничего подобного.:!!!:
293
25 января 2004 года
SEDEGOFF
586 / / 06.10.2002
гзы. ихменяюсь, у бде нет датасета в чистов виде. Но есть такой компонент UpdateSQL. В него прописываешь все запросы а в TQuery ссылаешся на этот объект
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог