Форум программистов, компьютерный форум, киберфорум
Delphi: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
1 / 1 / 1
Регистрация: 04.06.2013
Сообщений: 75

UniDAC (mysql) построение запроса

16.12.2015, 11:26. Показов 4253. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть проблема с удаленной базой. Периодически выполнение запроса приводит к ошибке типа нет такого поля. С локальной базой такая проблема не возникает.
С базой везде работаю так:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
UniQuery1.SQL.Text:='SELECT Date,Amount FROM payments where cons_id=:user_id and Date >=:from and Date <=:to';
UniQuery1.ParamByName('user_id').AsInteger:=strtoint(AdvStringGrid1.Cells[0,ARow]);
UniQuery1.ParamByName('from').AsDate:=FromDate.Date;
UniQuery1.ParamByName('to').AsDate:=ToDate.Date;
  try
    UniQuery1.open;
      except
        on E: Exception do begin
                                     ShowMessage(EDAError(e).Message);
                                  exit;
      end;
  end;
обязательно ли делать
UniQuery1.Close;
UniQuery1.SQL.Clear;
перед каждым новым запросом?
И какая разница между UniQuery1.SQL.Text и UniQuery1.SQL.Add?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.12.2015, 11:26
Ответы с готовыми решениями:

Delphi XE + UniDac + Mysql
привет Я хочу спросить, как реализовать доступ пользователей к программе? Я использую Delphi XE - UniDAC - MySQL. делаю следующее: ...

MySql+Delphi+dbGrid+uniDAC
Как вывести в dbGrid данные из БД MySql и с использованием компонента uniDAC. У меня вот стандартными компонентами получалось...

UniDac MySQL + потоки = access violation
Доброго времени суток. Столкнулся с проблемой при работе с БД MySQL из потоков через компоненты UniDAC. Приведу пример: Есть...

29
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
16.12.2015, 12:02
в приведенном примере вообще нет особого смысла пользоваться параметрическим запросом
выигрыш - чтобы сервер не тратил время на подготовку (prepare) запроса, а только подставлял параметры
если каждый раз текст запроса меняется, то prepare идет тоже заново
в таком случае проще сделать
query.SQL.text := format('sql запрос прямо тут', []);
query.Open;
без всяких ParamByName

SQL.text - заменяет весь текст в TStrings
SQL.Add - добавляет строку к TStrings
1
1 / 1 / 1
Регистрация: 04.06.2013
Сообщений: 75
16.12.2015, 13:00  [ТС]
спасибо! все по делу.
А не подскажите как заэкранировать '

сделал так:
Delphi
1
UniQuery1.SQL.Text:=Format('SELECT Date,Amount FROM payments where cons_id='+AdvStringGrid1.Cells[0,ARow]+' and Date >="'+FormatDateTime('yyyy-mm-dd', FromDate.Date)+'" and Date <="'+FormatDateTime('yyyy/mm/dd', ToDate.Date)+'"',[]);
не работает

Добавлено через 11 минут
Delphi
1
Format('SELECT Date, Amount FROM payments where cons_id='+AdvStringGrid1.Cells[0,ARow]+' and Date >='''+FormatDateTime('yyyy-mm-dd', FromDate.Date)+''' and Date <='''+FormatDateTime('yyyy-mm-dd', ToDate.Date)+'''',[]);
вот так все норм
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
16.12.2015, 13:14
Delphi
1
2
3
4
5
6
var s,dt1,dt2:string;
 
dt1:=ansiQuotedStr( FormatDateTime('yyyy-mm-dd', FromDate.Date), '''');
dt2:=ansiQuotedStr( FormatDateTime('yyyy-mm-dd', ToDate.Date), '''');
s:=format('SELECT Date, Amount FROM payments where cons_id=%s and Date >=%s and Date <=%s',
  [AdvStringGrid1.Cells[0,ARow], dt1,dt2 ]);
1
1 / 1 / 1
Регистрация: 04.06.2013
Сообщений: 75
16.12.2015, 13:39  [ТС]
krapotkin
вот спасибо!
век живи век учись!
сейчас попробую

Все работает. Но периодически при работе с удаленной базой выходит что в запросе нет такого поля
Delphi
1
2
3
4
5
6
7
8
9
10
with DataModule1 do begin
UniQuery1.SQL.Text:='SELECT COUNT(*) FROM clients';
try
UniQuery1.open;
except
  on E: Exception do begin
                      ShowMessage(EDAError(e).Message);
                      exit;
                      end;
end;
периодически говорит поля COUNT(*) нет. С локальной базой такого не замечается.
обязательно ли делать UniQuery1.Close после того как было выполнено UniQuery1.open?
и нужно ли делать UniQuery1.SQL.Clear при формировании нового запроса?
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
16.12.2015, 14:29
SQL.Clear === SQL.Text :=''
соответственно, если заполняется text, не нужно
про Count что-то нечисто. так не бывает
попробуйте явно поименовать поле
SQL
1
SELECT COUNT(*) AS C FROM clients
и обращаться к нему как "C"
0
1 / 1 / 1
Регистрация: 04.06.2013
Сообщений: 75
16.12.2015, 14:50  [ТС]
krapotkin
тоже самое но нет поля С теперь говорит.
не пойму в чем дело. На локальном сервере бд такого не замечаю.
Версии мускула одинаковы что удаленный что локальный сервер.
0
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
16.12.2015, 21:07
какой-нибудь dbgrid или еще чего к нему не подключен??
0
1 / 1 / 1
Регистрация: 04.06.2013
Сообщений: 75
17.12.2015, 08:55  [ТС]
Да есть один dbgrid на другой форме, но она не активна.
К стати когда эта форма активна, то периодически бывают ошибки как на первой так и на второй форме.
Неужели надо разные запросы использовать? На каждою форму свой Query?
0
5982 / 4557 / 1095
Регистрация: 29.08.2013
Сообщений: 28,193
Записей в блоге: 3
17.12.2015, 09:05
kko, напиши функцию - ей передавай SQL запрос
в функции создавай Connection, Query, выполняй запрос и возвращай в качестве результата StrinGrid с данными
0
1 / 1 / 1
Регистрация: 04.06.2013
Сообщений: 75
17.12.2015, 09:13  [ТС]
Сейчас организационно все так:
Основная форма -> меню -> подключение к базе -> диалог айпи, порт, логин, пароль -> создается Connection с событием при потере соединения восстановить его.
Потом много форм, где просто использую Query.
Раньше в каждой форме были свои Query, сейчас я вынес их на не визуальную форму.
qwertehok, Вы предлагаете закрывать соединение после каждого обращения к базе?
0
5982 / 4557 / 1095
Регистрация: 29.08.2013
Сообщений: 28,193
Записей в блоге: 3
17.12.2015, 09:17
kko, конечно, выполнили запрос, получили данные и отключились.
0
1 / 1 / 1
Регистрация: 04.06.2013
Сообщений: 75
17.12.2015, 11:15  [ТС]
а если запрос в цикле с 1000 и больше итераций не слишком часто открыть -закрыть будет? Конечно можно закрыть и после цикла, но тогда все внутри одной функции не получится сделать.
То есть держать соединение всегда в открытом состоянии нельзя?
0
5982 / 4557 / 1095
Регистрация: 29.08.2013
Сообщений: 28,193
Записей в блоге: 3
17.12.2015, 11:37
Цитата Сообщение от kko Посмотреть сообщение
То есть держать соединение всегда в открытом состоянии нельзя?
что значит нельзя? нельзя на ноль делить, да и то...
делайте как хотите

а вот
Цитата Сообщение от kko Посмотреть сообщение
запрос в цикле с 1000 и больше итераций
это нужно переписывать
1
 Аватар для krapotkin
6849 / 4676 / 1464
Регистрация: 14.04.2014
Сообщений: 20,671
Записей в блоге: 21
17.12.2015, 12:09
все очень индивидуально и зависит от задачи, от сервера, и от комплекта компонентов доступа
в Firebird+FibPlus например, это решалось наличием длинной чисто читающей транзакции для вывода на экран и короткой пишущей, автоматически подключающейся для модификации данных,
при этом компоненты предусматривали refresh измененной записи, иначе изменения не отображались на экране
как там в UniXXX я не знаю...
1000 запросов это точно перебор
лучше создать один и 1000 условий в нем
0
1 / 1 / 1
Регистрация: 04.06.2013
Сообщений: 75
17.12.2015, 13:30  [ТС]
запросы оптимизировал...
почему все таки иногда запрос вызывает ошибку в виде не наличия поля, либо не возвращает данных?
0
5982 / 4557 / 1095
Регистрация: 29.08.2013
Сообщений: 28,193
Записей в блоге: 3
17.12.2015, 13:37
Цитата Сообщение от kko Посмотреть сообщение
почему все таки иногда запрос вызывает ошибку
иногда запрос неправильный

а вообще спросите у автора запроса - почему он пишет кривые запросы
0
1 / 1 / 1
Регистрация: 04.06.2013
Сообщений: 75
17.12.2015, 13:42  [ТС]
запрос всегда один и тот же
SQL
1
SELECT COUNT(*) FROM clients
периодически возникает исключение что нет столбца COUNT(*)
0
5982 / 4557 / 1095
Регистрация: 29.08.2013
Сообщений: 28,193
Записей в блоге: 3
17.12.2015, 13:47
kko, а субд какая?
0
1 / 1 / 1
Регистрация: 04.06.2013
Сообщений: 75
17.12.2015, 13:51  [ТС]
mySQL
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.12.2015, 13:51
Помогаю со студенческими работами здесь

Построение запроса
Доброго дня всем. Нужна ваша помощь в построении запроса. Есть таблица, скрин прикреплен. Я хочу вывести эту таблицу в dbgri, но что бы...

Ошибка при отправке запроса MySQL через JDBC MySQL connector
При помощи Maven я вызываю зависимости Twilio и JDBC MySQL connector, и собираю .jar файл. У меня есть кнопка Update в моем GUI, когда я ее...

Построение запроса
Есть таблица Product. maker model type A 1232 PC A 1233 PC A 1276 Printer A 1298 Laptop A 1401 Printer A 1408 Printer ...

Построение запроса
Ребята, подскажите какую-нибудь книгу или книги о том как правильно строить запросы в oracle. А то пишу так: select * from sotr where...

Построение запроса
Всем привет! Помогите построить запрос по заданию. Задание: Построить запрос, который строит таблицу первого полугодия 1997...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru