|
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
|
||||||||||||||||
Тип параметра в SQL-запросе17.09.2023, 19:43. Показов 1413. Ответов 16
Метки нет (Все метки)
Вот тут хорошо объяснено про SQL запросы и параметры.
Я написал код прочитав сею инструкцию и все заработало. За исключением одного. У меня поля в базе данных АКСЕС x1, y1, z1, ... это координаты имеют тип данных вещественные числа с 10 значащими символами 3 из которых после запятой. Согласно региональным настройкам видимо в базе данных дробная часть отделяется запятой т.е. числа вида 1234,567 Я предполагал что запись ADOQuery1.Parameters.ParamByName('px').D ataType := ftFloat; указывает тип данных в самой базе данных. Когда я так написал и попробовал передать данные то получил ошибку не соответствие типов, видимо потому как RecInsert.X - - это строковый тип полученный после форматирования Format('%.3f', [StrToFloat(......)]) К слову RecInsert.X имет вид 1234,567 хотя исходная строка написана через точку Format('%.3f', [StrToFloat(1234.567890)]) Могли бы вы разъяснить что за тип данных мы тут указываем, тип нашей переменной в Delphi который мы потом будем присваивать? Или что? ADOQuery1.Parameters.ParamByName('px').D ataType := ftString; ADOQuery1.Parameters.ParamByName('px').V alue := RecInsert.X;
И еще второй вопрос как обнулить индекс счетчик? В интернете пишут так. Но у меня вылазиет ошибка синтаксиса в инструкции ALTER TABLE
0
|
||||||||||||||||
| 17.09.2023, 19:43 | |
|
Ответы с готовыми решениями:
16
Как в SQL-запросе запросе функции (СУБД PostgreSQL) в качестве параметра передать значение textBox? Значение параметра в SQL запросе передается с кавычкой. Как правильно указать в Sql запросе логический тип данных и тип "Дата время"? |
|
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
|
|
| 17.09.2023, 23:37 | |
|
Форматировать число или дату для внесения в БД обычно не требуется, а вот для показа пользователю в привычном ему формате, очень даже рекомендуется. Счетчик - это сугубо служебное поле и менять его значение не надо. Желание изменить значение счетчика возникает у новичков, которые хотят его использовать для автоматической нумерации данных. Это поле для этого не подходит, т.к. счетчик гарантирует только уникальность числовых значений, а их непрерывность - нет.
Если все же есть непреодолимое желание сбросить счетчик в начальное состояние, то в Акцесе сделать это можно простой упаковкой БД, при условии, что данных в таблице с полем-счетчиком нет.
0
|
|
|
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
|
|
| 18.09.2023, 11:32 [ТС] | |
|
Наверное я слишком расписал вопрос за которым потерялась суть вопроса. Спрошу проще.
Что означает эта запись? ADOQuery1.Parameters.ParamByName('px').DataType :=ftString; Она обозначает следующее: В запрос параметр 'px' вставить как строку? Так если взять в двойные кавычки " " Но тогда получается что мой запрос приобретает вид вставить в поле x данные из параметра px равные строке "123,45". Хотя поле x у меня в бд это float. Я так понимаю ошибки нет т.к. SQL строку "123,45" в состоянии интерпретировать как число самостоятельно. Когда пробовал писать ADOQuery1.Parameters.ParamByName('px').DataType :=ftFloat; То выдавалась ошибка не совместимость типов. Я не понимаю почему. Я говорю что параметр px нужно интерпретировать как число 123,45 (без кавычек). Ошибка именно несовместимость типа а не ошибка синтаксиса INSERT. Кто нибуть может мне помочь в этом разобраться? ********** Сейчас подумал... Когда пробовал писать ADOQuery1.Parameters.ParamByName('px').DataType :=ftFloat; наверное тут нужно было передать число без форматирования его функцией Format, не обрезая значения после запятой до 3х. Вероятно оно бы в базе автоматически бы обрезалось до 3х знаков после запятой т.к. у меня указано что хранить именно 3 знака. Надо проверить ..вопрос лишь как это число сохраняется в б.д. т.к. число до форматирования имеет вид не целого например 350 а 349,9999999, а уже после применения формат оно превращается в нормальные 350.
0
|
|
|
|
|
| 18.09.2023, 11:36 | |
|
В базе хранится просто несколько байтов - число. Как и в к-нить переменной double.
Для того, чтобы человек мог посмотреть, программа дружески форматирует его в текст. например, в соответствии с форматами, установленными в системе. или в настройках программы. но само число не меняется. В нем нет разделителей вообще. То же и с параметрами. Если мы хотим передать число, то говорим - вот этот параметр - число. И присваиваем в его значение число. А не строку. Как я и писал в блоге, это избавляет нас как раз от необходимости особо форматировать строку, чтобы ее понял сервер БД. Параметр сделает это сам. ну и еще вдогонку не надо использовать одну ложку и для супа и для котлет, и картошку выкопать. параметры специально придуманы, в частности, для того, чтобы готовый SQL раз создать и более не трогать, а только подставлять туда значения этих самых параметров Отдельный компонент для одного SELECT, отдельный для другого. Для DELETE тоже свой. Сколько нужно.
0
|
|
|
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
|
||||||
| 18.09.2023, 16:04 [ТС] | ||||||
|
Попробовал сделать как должно быть так если передавать данные как число. Получаю ошибку "Несоответствие типов данных в выражении условия отбора" при осущетвлении запроса вставки во второй раз. Вставка второго числа.
Причем вставка первой записи появляется в базе данных. Проверочные сообщения выводятся 3 раза так если запрос проходит 1 раз. Числа которые переадаются в первом и во втором случае 817.6425534928789 753.2539989729739 Не могу понять в чем ошибка и почему 1 раз запрос проходит, а второй нет? Ключевые моменты кода:
0
|
||||||
|
|
||||||
| 18.09.2023, 19:19 | ||||||
|
вот то что с ходу в глаза бросается
Open и Close - команды предназначенные для датасета. Т.е. в Query запрос SELECT если там INSERT/DELETE/UPDATE нет никакого Open, соответственно и закрывать нечего далее при отладке мы исключаем все не относящееся и делаем стерильно чистый вариант с константами вот что то не так с циклом ? не так со значениями? убираем и цикл и значения:
0
|
||||||
|
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
|
|||||||||||||||||||||||||||||||
| 19.09.2023, 08:12 [ТС] | |||||||||||||||||||||||||||||||
|
нет не работает. Срабатывает один раз на втором запросе выдает ошибку "Несоответствие типов данных в выражении условия отбора".
======= Но работает так, внутри цикла. Вся база наполнилась этим числом.
========= О работает еще так.
Добавлено через 2 минуты ========= А так не работает
Когда я парсил текстовый файл то сделал следующее т.к. StrToFloat отказывалась преобразовывать в число строку с точкой, она искала в ней запятую. Могло это создать имеющуюся проблему, мне кажется нет.
В общем юзаю так. Несмотря на то что RecInsert.X - тип Single, поле x1 в таблице числовое, а параметр задан как строка ADOQuery1.Parameters.ParamByName('px').D ataType := ftString; по другому не работает почему то. Может кто подскажет в чем дело, почему когда ставишь ADOQuery1.Parameters.ParamByName('px').D ataType := ftFloat; перестает работать выдает выше указанную ошибку.
0
|
|||||||||||||||||||||||||||||||
|
809 / 425 / 37
Регистрация: 05.05.2022
Сообщений: 2,945
|
|
| 19.09.2023, 08:22 | |
|
1) Не парить мозг с параметрами и делать руками, т. е. форматы вещественных и времени указывать явно. Проще будет. А вообще я о параметрах забыл, когда оказалось, что со вложенными запросами в ADO они просто не работали. Может до сих пор не работают.
2) Даже когда использовал, никогда не настраивал их тип руками. Просто создавал в дизайнере, и ЕМНИП так и оставлял, ftUnknown. 3) Юзеру можно показывать, настроив у поля DispleyFormat, если таковое есть. 4) На компонентах запросов экономить не нужно. Компы для людей, а не люди для компов. От экономии нескольких килобайт или десятков килобайт на инстансе компонента ничего не поменяется.
0
|
|
|
|
|||||||||||
| 19.09.2023, 11:09 | |||||||||||
Сообщение было отмечено S0563506 как решение
РешениеНе по теме: этот богомерзкий Access это конечно дно а еще у этой колобуды старческий маразм и оно очень забывчивое вот так - не работает:
1
|
|||||||||||
|
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
|
||||||
| 19.09.2023, 20:43 [ТС] | ||||||
|
Пока Аксес. Это "простой" локальный проект, маленькая программулька, 20 лет назад я его уже делал на аксесе, теперь приходиться заново вспоминать delphi , вообщем можно сказать по привычке юзаю аксесс.
Спасибо за инфу. Засунул установку типов вовнутрь цикла рядом с присвоением все заработало, спасибо.
0
|
||||||
|
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
|
||||||||||||||||
| 22.09.2023, 12:39 [ТС] | ||||||||||||||||
|
Параметр внутри функции в SQL запросе. Не ругается но присвоения по этому полю не проходять. Если поставить просто число то все работает.
0
|
||||||||||||||||
|
809 / 425 / 37
Регистрация: 05.05.2022
Сообщений: 2,945
|
|
| 22.09.2023, 14:21 | |
|
Некрасиво ему, это еще не пробовал выражения на Си писать, у нас в инсте даже специально задания были, расшифровать код на Си. Все проще, чем гадать, как оно там в параметрах преобразуется.
0
|
|
|
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
|
|||||||
| 23.09.2023, 10:52 | |||||||
Сообщение было отмечено S0563506 как решение
Решение
1
|
|||||||
|
2 / 2 / 0
Регистрация: 11.09.2023
Сообщений: 193
|
|||||||
| 30.09.2023, 22:29 [ТС] | |||||||
Дошел до вашего совета под каждый запрос свой элемент. Например мне необходимо Combox наполнять значениями из базы данных, прошлая программа (первая программа) не была сильно динамичной и я наполнял Комбобокс при создании формы каждый раз переписывая запросы в одном и том же AdoQuery. Сейчас же (2я программа) хочу производить наполнение по событию OnClick. Теперь становиться понятно что для этого действа как раз желательно иметь статический запрос сформированный прямо в конструкторе. Вероятно это действительно несколько ускорит обработку данного события. Вы это имели виду? На динамические события вешать статические запросы если возможно или юзать параметры? А вы так делаете вешаете на онклик наполнение чекбокса. Так если он каждый раз при клике будет делать запрос к БД, это считается нормальным стилем написания программы. Еще прочитал на форуме про ADOCommand. Команды вроде как быстрее делать через него. Как я понял, "команды" - это то что не требует возврата данных так если обновить, удалит, вставить и т.д все кроме SELECT лучше делать через ADOCommand. Это так?
0
|
|||||||
|
809 / 425 / 37
Регистрация: 05.05.2022
Сообщений: 2,945
|
||
| 30.09.2023, 22:45 | ||
|
0
|
||
|
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
|
||
| 30.09.2023, 23:02 | ||
|
Предположим, что в базе есть данные-справочники, они как правило заполняются разово и в дальнейшем не меняются. Очевидно, что в приложении для комбобокса эти данные достаточно получить один раз. Совсем другая ситуация с изменяемыми данными. Тут уже есть необходимость получить максимально свежие данные и следовательно запрос надо выполнять всякий раз, как возникает необходимость их отображения, а при правильном подходе уже полученные запросом данные желательно еще и обновлять с некоторой периодичностью.
1
|
||
|
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
|
||
| 01.10.2023, 01:57 | ||
|
0
|
||
| 01.10.2023, 01:57 | |
|
Помогаю со студенческими работами здесь
17
Тип DataTime в SQL-запросе В запросе LINQ to Entities нельзя конструировать тип сущности или сложный тип Ошибка: "Тип фактического параметра должен быть идентичен типу формального параметра-переменной" тип фактического параметра- переменной string[20] отличается от типа формального параметра string Проверка типа параметра в запросе Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11
— это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
|
Old Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11
Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
|
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
|
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/
O1rJuneU_ls
https:/ / vkvideo. ru/ video-115721503_456239114
|
|
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ВВЕДЕНИЕ
Введу сокращения:
аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
|
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi
ветка по-частям.
коммит Create переделка под биомассу. txt
вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
|
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ *
Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях.
Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её.
Последовательность действий:. . .
|
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
|