TQuery
База SQL находится на удаленном сервере. Записей уже более 9 тыс. В программе она подсоединяется через TTable, поэтому загружается долго. Конечно, правильнее делать через TQuery. Попыталась сделать маленький пример, чтобы посмотреть, как быстро загружается база. Оказалось, если подсоединить одну таблицу из базы, причем данных там более 9 тыс - загружается мгновенно. Если на эту же форму кинуть еще один DBGrid, подсоединить через TQuery еще одну таблицу с маленьким набором данных (всего 2 поля и примерно 50 записей типа "10410"), то база загружается также, как будто бы я подсоединяюсь через TTable.
Это первая часть вопроса. А второй:
вторая таблица является для первой таблицей подстановки и связывается по ключу в отношении "один- ко многим". Если подсоединяться через TTable, то можно вывести выпадающий список через DBLookupComboBox. А как это сделать в запросе? Причем, вторую таблицу я хочу загрузить тоже через запрос.
Хочу заметить, что тестируя свой первый вопрос, для второй таблицы я пока не учитываю никаких ключей связи. Просто подключаю ее параллельно с первой. Заранее спасибо!
Связь можно сдалать програмно через обычный комбо.
А вот почему у тебя с двумя запросами тормозит я не знаю. Проверь еще раз - нет ли звязи между ними или не создано в первом запросе лукап поле относительно второго поля
Запрос по 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? Правильно я мыслю?
И хотелось бы еще получить конкретный вопрос по ComboBox. Вопрос этот в моем предыдущем комментарии.:roll:
По поводу Комбо. Ты почти права. Надо в событии OnChange Обрабатывать изменения или если у тебя статичная форма, то при сохранении информации
Что-то я поторопилась с выводами. Загрузила 2 таблицы, обе большие и снова тормоз.
В аналогичном примере сделала то же самое, тормоз. Что происходит?:devil:
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 - он лучше во всех отношения
Делаю как Вы.
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?
Вопрос сейчас в другом. Хотелось бы разобраться с запросами досконально, а именно, с компонентом TQuery.
Методом Open() я открываю запрос на просмотр. Как я понимаю, Add() позволяет мне добавлять записи. В литературе описывается этот метод для добавления одной записи конкретного поля. А если у меня в запросе 45 полей. Тогда как?
Почему приятнее использовать таблицу: там вставляешь Insert() и добавляется строка из этих 45 полей и в каждое можно внести значение.
Если можно, скинте код по данному вопросу. Буду очень благодарна, если мне это поможет разобраться с запросами.:)
По поводу TQuery - если долго загружает, но быстро ищет - это значит что в память грузяться все строки таблицы - я точно не знаю но скорее всего это предусмотрено методом Open(). Посмотрите еще настройки. Обычно чтобы загрузить все данные сразу (для быстрого поиска) я делаю так
Query->Open();
Query->FetchAll();
Мне бы этот компонент подошел. В литературе не нашла ничего подобного.:!!!:
гзы. ихменяюсь, у бде нет датасета в чистов виде. Но есть такой компонент UpdateSQL. В него прописываешь все запросы а в TQuery ссылаешся на этот объект