1 / 1 / 1
Регистрация: 18.07.2011
Сообщений: 90
1

Пунктуация в динамическом SQL-запросе

11.08.2011, 19:21. Показов 2850. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я запутался в пунктуации при формировании запроса. Помогите разобраться!
Ошибка: TypeMissmatch in expression.
C++
1
2
3
4
5
6
7
   float min, max;
   min=a-0.01; max=a+0.01;
  ShowMessage(min);
  ShowMessage(max); // - здесь видно, что до этого места всё правильно
   Query1->Close();
   Query1->SQL->Clear();
   Query1->SQL->Text="Select Stoim From Tar_Setka Where Razr between '"+FloatToStr(min)+"' and '"+FloatToStr(max)+"'";
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.08.2011, 19:21
Ответы с готовыми решениями:

Параметры в динамическом запросе
Читаю Архангельского: "Теперь обратимся к компоненту Query. Если Вы введёте в его свойство SQL...

Как использовать Операторы конкатенации в динамическом sql ?
Здравствуйте подскажите пожалуйста как можно использовать знаки конкатенации в динамическом sql ....

Пунктуация
в метод вкидываем секунды, на выходе получаем строку формата: 7 years, 246 days, 15 hours, 32...

Пунктуация
Как правильно расставить знаки препинания, совсем не из этой области, или перенести слова "базы...

8
214 / 116 / 14
Регистрация: 30.05.2011
Сообщений: 1,772
Записей в блоге: 15
11.08.2011, 19:40 2
а что если попробовать вместо функций поставить переменные с сохраненным значением. чисто для проверки. sql очень нежная штука. попробуй просто переменные. и вот эти плюсы, это для с++ такие отсечки? я просто не силен в этом
0
1 / 1 / 1
Регистрация: 18.07.2011
Сообщений: 90
11.08.2011, 21:12  [ТС] 3
Если подставить числа -
C++
1
 Query1->SQL->Text="Select Stoim From Tar_Setka Where Razr between 1,5 and 1,8";
- работает отлично.
Глядя на этот пример - правильней будет убрать одинарные кавычки:
C++
1
Query1->SQL->Text="Select Stoim From Tar_Setka Where Razr between "+FloatToStr(min)+" and "+FloatToStr(max)+"";
Но тогда начинает писать ошибку - Invalid use of keyword.
0
4956 / 2420 / 531
Регистрация: 05.06.2008
Сообщений: 7,518
Записей в блоге: 3
12.08.2011, 10:42 4
Цитата Сообщение от vvspl Посмотреть сообщение
Если подставить числа - Query1->SQL->Text="Select Stoim From Tar_Setka Where Razr between 1,5 and 1,8"; - работает отлично.
Глядя на этот пример - правильней будет убрать одинарные кавычки:
Query1->SQL->Text="Select Stoim From Tar_Setka Where Razr between "+FloatToStr(min)+" and "+FloatToStr(max)+"";

Но тогда начинает писать ошибку - Invalid use of keyword.
Проверял работает

C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::Raznica()
 {
  float min = 1000, max = 2000;
  ADOQuery1->Close();
  ADOQuery1->SQL->Clear();
  //ADOQuery1->SQL->Add("SELECT * FROM Vklad WHERE Summa_vklada BETWEEN 1000 AND 2000");
  ADOQuery1->SQL->Add("SELECT * FROM Vklad WHERE Summa_vklada BETWEEN "+FloatToStr(min)+" AND "+FloatToStr(max)+"");
  ADOQuery1->Open();
 }
1
Почетный модератор
8784 / 2537 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
12.08.2011, 11:04 5
vvspl, а вы не пробовали хотя бы проанализировать, какую информацию несет это исключение? так оно проще искать и решение проблемы...

Ошибка: TypeMissmatch in expression. - это означает ошибку в выражении по типам... 300 раз писал, что числовые значения в sql запросе не берутся в кавычки, отсюда и ошибка

Ошибка: Invalid use of keyword. - ошибка в использовании ключевых слов... в вашем случае все просто - у вас разделитель в системе стоит ".", а вы же сами в рабочем примере указываете, что работает с числами с разделителем ","... всего лишь надо либо указать нужный разделитель, либо использовать параметризированные запросы, которые вместо вас будут подставлять значения в нужном формате...
1
1 / 1 / 1
Регистрация: 18.07.2011
Сообщений: 90
12.08.2011, 14:49  [ТС] 6
Я с этим запросом мучаюсь четыре дня. Поверьте - вариантов перебрал очень много. Ни один нормально не работает. Насчёт точки и запятой - проверено много раз. Даже ошибка одинаковая. Насчёт целых чисел, как указано в ответе сверху - всё работает!!!!!!!! ДРОБИ НЕ РАБОТАЮТ!!!!!!
Я уже не знаю, что мне ещё пробовать((((
Насчёт параметризованных запросов - не могу разобраться с ними. Подскажите ещё такой способ! - это пока единственное, что не пробовал нормально.

Добавлено через 2 минуты
Мой код от Вашего - ничем не отличается. Почти. С целыми числами мой запрос тоже отлично работает. А с дробями - НЕТ!!!

Цитата Сообщение от Sasha Посмотреть сообщение
Проверял работает

C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::Raznica()
 {
  float min = 1000, max = 2000;
  ADOQuery1->Close();
  ADOQuery1->SQL->Clear();
  //ADOQuery1->SQL->Add("SELECT * FROM Vklad WHERE Summa_vklada BETWEEN 1000 AND 2000");
  ADOQuery1->SQL->Add("SELECT * FROM Vklad WHERE Summa_vklada BETWEEN "+FloatToStr(min)+" AND "+FloatToStr(max)+"");
  ADOQuery1->Open();
 }
0
Почетный модератор
8784 / 2537 / 144
Регистрация: 07.03.2007
Сообщений: 11,873
12.08.2011, 15:41 7
vvspl, какой тип данных в этом поле?


параметрический запрос


и кстати вы уже эту тему поднимали... там вам примеры запросов давали...
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
12.08.2011, 16:38 8
C++
1
2
3
4
5
6
7
8
9
void __fastcall TForm1::Raznica()
 {
  float fmin = 1000, fmax = 2000;
  ADOQuery1->Close();
  ADOQuery1->SQL->Text = "SELECT * FROM Vklad WHERE Summa_vklada BETWEEN :p1 AND :p2";
  ADOQuery1->Parameters->ParamByName("p1")->Value = fmin;
  ADOQuery1->Parameters->ParamByName("p2")->Value = fmax;
  ADOQuery1->Open();
 }
Чтобы не было недоразумений при работе со статическими запросами (без параметров) надо запрос отлаживать непосредстаенно в клиенте (например для акцеса в самом акцесе). Хотя и это не дает гарантии т.к. на разных ПК разные локали, к тому же скл-сервер тоже можно перенастроить..
Самое универсальное - параметричиские запросы, в этом можно не сомневаться !
1
1 / 1 / 1
Регистрация: 18.07.2011
Сообщений: 90
12.08.2011, 20:46  [ТС] 9
Спасибо!

Я как раз решил свою проблему при помощи параметризованного запроса:

C++
1
2
3
4
5
6
7
8
9
10
a=Query1->FieldByName("Razr")->AsFloat;
   float min, max;
   min=a-0.01; max=a+0.01;
   Query1->Close();
   Query1->SQL->Clear();
   Query1->SQL->Text="Select Stoim From Tar_Setka Where Razr between :min And :max";
   Query1->Params->ParamByName("min")->Value=min;
   Query1->Params->ParamByName("max")->Value=max;
   Query1->Open(); 
   float b=Query1->FieldByName("Stoim")->AsFloat;
Тема закрыта.
0
12.08.2011, 20:46
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.08.2011, 20:46
Помогаю со студенческими работами здесь

Пунктуация
Всем привет. Я вывожу дату таким образом: <?=$oneNews;?> Подскажите как мне тут же указать формат...

Ошибка "неверное завершение SQL-предложения" в простом SQL запросе
SELECT d.DEPARTMENT_ID, d.DEPARTMENT_NAME, e.EMPLOYEE_ID, e.LAST_NAME FROM employees AS...

if в SQL-запросе
формирую в ADOQuery SQL-запрос в котором нужно представить два поля НОМЕР и ДАТА в формате "НОМЕР...

Ошибка в SQL-запросе
доброе утро! столкнулась с такой ошибкой: "поставщик данных или другая служба вернули состояние...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

Новые блоги и статьи
В чем отличие между INNER JOIN и OUTER JOIN
bytestream 22.01.2025
В современных базах данных информация часто распределена между множеством взаимосвязанных таблиц, что делает операции объединения JOIN неотъемлемой частью работы с SQL. Эти операции позволяют. . .
Как сделать первую букву заглавной в JavaScript
bytestream 22.01.2025
JavaScript предоставляет разработчикам множество инструментов для эффективной работы с текстовыми данными. Одной из часто встречающихся задач при обработке строк является преобразование первой буквы. . .
Что такое Big O нотация и алгоритмическая сложность
bytestream 22.01.2025
Введение в алгоритмическую сложность В мире разработки программного обеспечения эффективность алгоритмов играет crucial роль в создании качественных приложений. Алгоритмическая сложность. . .
Как решать конфликты объединения (merge) в Git
bytestream 22.01.2025
Что такое конфликты слияния Конфликты слияния в системе контроля версий Git возникают в ситуациях, когда две или более ветки разработки содержат несовместимые изменения в одних и тех же участках. . .
Как использовать регулярные выражения
bytestream 22.01.2025
Регулярные выражения представляют собой мощный инструмент для работы с текстовыми данными, который позволяет осуществлять поиск, проверку и манипуляцию строками на основе определенных шаблонов. Этот. . .
Как выйти из Vim
bytestream 22.01.2025
Vim (Vi IMproved) представляет собой один из самых влиятельных текстовых редакторов в истории компьютерной индустрии, эволюционировавший из своего предшественника Vi, созданного Биллом Джоем в 1976. . .
NoSQL базы данных: что это такое и какие существуют
bytestream 22.01.2025
В современную эпоху цифровой трансформации объемы данных растут экспоненциально, создавая новые вызовы для традиционных систем управления базами данных. NoSQL (Not Only SQL) представляет собой. . .
Обновление исследования от команды MCM (январь 2025 г.)
Programma_Boinc 22.01.2025
Обновление исследования от команды MCM (январь 2025 г. ) Мы продолжаем изучать молекулярные сигнатуры, связанные с раком легких, с текущим фокусом на GCM1, факторе транскрипции, участвующем в. . .
Как работать с Kafka в Go (Golang)
bytestream 22.01.2025
Apache Kafka представляет собой распределенную платформу потоковой передачи данных, которая произвела революцию в области обработки событий и интеграции микросервисов. Эта система, изначально. . .
Как использовать RabbitMQ в Go (Golang)
bytestream 22.01.2025
RabbitMQ представляет собой надежный и широко используемый брокер сообщений, который играет ключевую роль в построении современных распределенных систем и микросервисной архитектуры. В основе работы. . .
Как преобразовать список списков в простой список в Python
bytestream 22.01.2025
При работе с Python разработчики часто сталкиваются с необходимостью обработки сложных структур данных, среди которых особое место занимают вложенные списки. Эти структуры представляют собой списки,. . .
Что такое GUID / UUID и как их создать
bytestream 22.01.2025
В мире разработки программного обеспечения существует постоянная потребность в уникальной идентификации объектов, записей и ресурсов. Эта задача становится особенно актуальной в распределенных. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru