Bazaprogram.ru

Новости из мира ПК
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Delphi update sql

Delphi update sql

Помогите плиз начинающему, не могу понять почему не происходит обновления при SQL запросе (работаю из под Delphi с БД MSSQL):

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add(«UPDATE table1 SET»);
Query1.SQL.Add(«field1=»»123″»»);
Query1.SQL.Add(«WHERE field1 is null»);
Query1.SQL.Add(«UPDATE table1»);
Query1.ExecSQL;

при выполнении такого кода все проходит без ошибок, но данные не заносятся в таблицу (не меняются).
если я использую «INSERT, «SELECT» или «DELETE» в Query1, то все проходит без проблем, а с «UPDATE» ничего не получается.
Также, возникают проблемы при использовании метода
Query1.Open вместо Query1.ExecSQL. выскакивает ошибка «Error creating cursor handle».
В консоли UPDATE работает отлично, но из под Delphi не желает работать.
Помогите плиз разобраться с этим.
Пишите на мыло, т.к. с инетом проблемы
aleksf@mail.ru
Заранее благодарен, Алек.


sniknik ( 2003-12-12 23:28 ) [1]

второй апдейт в пакете явно лишний.


Hawk2 ( 2003-12-12 23:35 ) [2]

>Также, возникают проблемы при использовании метода
>Query1.Open вместо Query1.ExecSQL. выскакивает ошибка «Error >creating cursor handle».
Метод Open нужно вызывать при выборке SELECT, а при INSERT, UPDATE и DELETE нужно вызывать метод ExecSQL.


Aleksf ( 2003-12-13 11:25 ) [3]

sniknik: да, лишний
Hawk2: при использовании ExecSQL для UPDATE все проходит без ошибок, но данные не заносятся (не обновляются), но зато без ошибок. Почему не заносятся? может я чего забыл допистать?


sniknik ( 2003-12-13 11:38 ) [4]

> но данные не заносятся (не обновляются), но зато без ошибок
без ошибок значит запрос верный получился
не обновляется, а условие срабатывает ->
WHERE field1 is null ?
если с SELECT — ом его небось пустой рекордсет выдает.

может у тебя там пустые строки вместо null — ов
сделай условие другим

WHERE DATALENGTH(RTRIM(field1)) = 0
(трим можно убрать, но только не всегда строка пустая даже если ты туда явно «» внес (зависит от того как поле создано))


Aleksf ( 2003-12-13 22:02 ) [5]

sniknik
нет, поле из начала null, поэтому условие у меня «. is null»
может дело еще в чем нить?
если не трудно, попробуй у себя использовать простой пример с этим Query и UPDATE, если у тебя получится, то пришли кусок кода, может я не так что-то делаю.


Aleksf ( 2003-12-13 22:07 ) [6]

sniknik
кстати, я работаю без использования DBNavigator, а данные меняю через обычный TEdit
а запрос «SELECT * FROM table1 WHERE field1 is null» проходит отлично. И через консоль запрос UPDATE работает отлично, но вот из Delphi с Query не хочет. (((


sniknik ( 2003-12-13 23:20 ) [7]

> а запрос «SELECT * FROM table1 WHERE field1 is null» проходит отлично
значит и UPDATE должен.
или (если селект пустой) условие неверное. вариантов нет (если не хочеш проверить на пустые строки).

> если не трудно, попробуй у себя использовать простой пример с этим Query и UPDATE, если у тебя получится, то пришли кусок кода
мне незачем это еще раз пробовать пробовал сотню раз, это работает
UPDATE table1
SET field1=»123″
WHERE field1 is null

а вот это всетаки проверь (прямо пакетом) ибо вижу непонял ты меня в прошлый раз
CREATE TABLE Table1 (ID INT Identity (1, 1), Field1 Char(10),Field2 VarChar(20), I INT)
INSERT INTO Table1 (I) VALUES (1)
UPDATE table1 SET field1=»», field2=»»
SELECT DATALENGTH(field1) AS Fil1, DATALENGTH(field2) AS Fil2 FROM Table1
чему Fil1 и Fil2? а ведь ложили одно и тоже «» одинаковой длинны.


Наталия ( 2003-12-14 07:55 ) [8]

Попробуй вместо явного указания значения в запросе передать его параметром. Может, там что-нибудь с кавычками?


JibSkeart ( 2003-12-14 11:09 ) [9]

кстати а если у иебя будет несколко пустых значений ,
то они все изменятся на 123

Читать еще:  Delphi распознавание речи

или тебе так и надо ?


Aleksf ( 2003-12-14 17:01 ) [10]

JibSkeart: да, так мне и нужно, это просто пример я привел
Наталия: кавычки ставятся если Requestlive=True, а у меня он False


sniknik ( 2003-12-14 19:24 ) [11]

> кавычки ставятся если Requestlive=True, а у меня он False
бред какой. не поделишся источником сего?
особенно учитывая что update не возвращает рекордсет, и следовательно что true что false ему совершенно параллельно.

Наталия © (14.12.03 07:55) [8]
кавычки в этом случае, (в запросе, MSSQL) правильны «»-строка, «» или [] указание что это имя поля (с пробелами и т.д. если сразу не понять что это имя поля, надо ставить)


ЮЮ ( 2003-12-15 02:49 ) [12]

>но данные не заносятся (не обновляются)

Откуда такое мнение?
Добавь после ExecSQL
Application.MessageBox(IntToStr(Query1.RowsAffected),»Records updated(Query1)», 0);
и лишь затем утверждай, что ничего не изменяется


Aleksf ( 2003-12-15 20:34 ) [13]

Запросы SQL для обновления данных (UPDATE)

Изучаем SQL

  • 1. Введение в SQL
  • 2. Запросы на выборку
  • 3. Условия в запросах
  • 4. Cортировка данных
  • 5. Вставка записи
  • 6. Вставка нескольких записей
  • 7. Изменение записи

Под обновлением данных в БД подразумевается изменение значений в существующих записях таблицы. При этом возможно как изменение значений полей в группе строк (даже всех строк таблицы), так и правка значения поля отдельной строки.

В SQL, изменить запись в таблице БД можно с помощью команды UPDATE. В самом минимальном виде команда обновления данных выглядит следующим образом:

UPDATE таблица SET поле = значение

Здесь, UPDATE – команда указывающая, что запрос на обновление данных;

таблица – название таблицы, в которой будет проводиться изменения;

SET – команда, после которой через запятую указываются поля с назначаемыми им значениями;

поле – поле таблицы, в которое будет внесено изменение;

значение – новое значение, которое будет внесено в поле.

Например, если необходимо задать полю во всех строках таблицы значение равное нулю, можно выполнить такой запрос:

UPDATE goods SET price = 0

В этом случае, поле price абсолютно во всех имеющиеся строках таблицы примет значение 0.

Изменение одного значения

Изменение значения всех полей в таблице необходимо крайне редко. Чаще всего необходимо поменять значение какой-то конкретной записи. Для этого в завершении строки с командой UPDATE будет добавлена директива WHERE, в которой указывается условие, определяющее с какой именно строкой нужно выполнить операцию обновления.

num
(номер товара)
title
(название)
price
(цена)
1Чайник300
2Чашка100
3Ложка25
4Тарелка100

Для примера, нужно обновить стоимость товара с известным нам его значением num. Для этого, выполним следующий запрос:

UPDATE goods SET price = 150 WHERE num = 2

Теперь, перед операцией изменения полей, будет выбрана строка, удовлетворяющая условию num = 2. Такая строка в таблице одна. В этой стоке цена и будет изменена на значение 150. В результате получим таблицу с измененной ценой товара.

Внесение изменений в несколько строк с условием отбора

Если вспомнить все многообразие условий в запросе, можно представить себе насколько разнообразными могут быть выборки. Поэтому и запросы на обновления могут выполняться либо с одной строкой, либо с группой строк, либо со всеми строками таблицы. Все зависит от стоящей перед вами задачи, а так же с какими строками таблицы нужно выполнять операции обновления.

Например, мы хотим уменьшить в два раза цену всех товаров, которые сейчас стоят от 100 и более. Запрос:

UPDATE goods SET price = price / 2 WHERE price >= 100

Условие WHERE здесь содержит правило, по которому будут выбраны только товары с ценой равной или более 100, а те товары, цена у которых ниже 100, затронуты запросом не будут.

Читать еще:  Как отключить защиту protect

price = price / 2 – формула, по которой будет вычисляться новая цена товаров. Новая цена будет записана равной старой цене поделенной на два.

В результате выполнения такого запроса получим таблицу с измененными записями:

num
(номер товара)
title
(название)
price
(цена)
1Чайник150
2Чашка50
3Ложка25
4Тарелка50

Обновление значений в нескольких полях строки

При необходимости обновлять сразу несколько полей, все поля с их значениями указываются после директивы SET через запятую. Например, нужно изменить название и цену товара с кодом 2 на «утюг», стоимостью 300:

UPDATE goods SET title = «утюг» , price = 300 WHERE num = 2

Такой запрос каждому соответствующему полю в строке назначит его значение. А условие укажет, в какой именно строке будут выполнены изменения.

Выше приведены основные виды операций обновления. На их основе формируется запросы для решения большинства задач изменения данных в разработке с применением SQL.

Еще материалы из этого раздела

Комментарии

Добрый день!
А можно ли сделать так:
UPDATE goods SET title, price = 100 WHERE num = 2

То есть присвоить двум полям одно значение?

Добрый день, Анастасия.
Простейший вариант:
UPDATE goods SET price = (RAND() * 100) WHERE num = 2

Здесь назначается случайное число до 100, так как функция RAND() вернет дробное от 0 до 1. Поэтому еще стоит обратить внимание на тип поля, когда в БД запись заносится. В данном случае, без округления, вещественное может быть записано.

Добрый день, Василий.
Одна строка таблицы — это одна запись. Если вы хотите исправить в одной записи таблице (строке таблицы), то так и будет:
UPDATE goods SET title = «утюг», price = 300 WHERE num = 2

title = «утюг», price = 300 — для каждого столбца строки.

Добрый день, Василий.

Чтобы реализовать это именно одним запросом, можно сделать так. Но на мой взгляд, стоит делать проще и понятнее для себя. Ведь для сборки этого запроса вы так же будете использовать цикл. Вопрос в том, что эффективнее: реализовать циклически сложный запрос или циклически выполнить несколько простых запросов.

Подобное решение, как мне кажется применимо, например, в обновлении прайс-листа. Но, т.к. задача не часто выполнимая, то нет смысла усложнять ее, пусть даже для повышения скорости выполнения. Хотя все зависит от конкретных условий.

Надеюсь, я ответил на ваш вопрос, Василий.

Есть простая таблица в sql. И по нажатию на кнопку сохранить выполняется сохранение изменений. Запрос такой:
$query = «UPDATE `comp` SET `comp_login`= ‘$comp_login’, `comp_name` = ‘$comp_name’, `see` = ‘$see’, `p_status` = ‘$p_status’, `comp_text` = ‘$comp_text’ WHERE ` «;
Значения переменных берутся с пост запроса. Примерно такие: $comp_login = mysql_real_escape_string($request[‘comp_login’]);

Вопрос: Мне нужно знать была ли обновлена строка. Даже если ничего не было изменено, то тоже нужно вернуть истину.
Если проверить так: if(mysql_affected_rows() >0) , то возвращается ложь, если ничего не было изменено.

А if(mysql_affected_rows() == -1) выполняется только, если есть конкретные ошибки. Т.е. в таблице есть стpока enum со значениями ‘0’,’1′. Если я в это поле отправляю текст, то ставит 0 и пишет нет ошибки.

Как обычно проверяют такие условия?

А можете ли помочь с таким вопросом:
Есть сайт технической поддержки. И есть пользователи, которые оставляют на нем заявку в компанию. На нем есть таблица с полями: id_client(id пользователя AI, PK), name_client(Имя потльзователя), status(один ко многим), date_r(дата регистрации).

Статусы у всех пользователей будут разные. Например:
у пользователя 1: открыто, отменено, закрыто, передано, принято.
у пользователя 2: открыто, отменено, закрыто, исполнено, в ожидании.
у каждого клиента должны быть видны несколько статусов для выбора (только ему принадлежащие), а у другого клиента (другие статусы, принадлежащие именно ко второму клиенту)

Статусы в любое время могут добавляться( не удаляются).
Я пока придумал только так:
1. вариант:
Вторая таблица такая: id_status, id_client, open, close, cancelled, sent, accepted.
id_status — AI PK, id_client — указывает на первую таблицу на пользователя, другие поля сами статусы и имеют значение enum: ‘0’, ‘1’ — в зависимости присутствует для пользователя ставиться 0 или 1.

Читать еще:  Font background css

Когда необходимо добавлять статус какому либо клиенту сначала ставлю 1 для нужного пользователя, а для всех других проставляю 0.
2 Вариант.
Во второй таблице statuses (id_statuses, name_status) записаны все статусы. В таблице пользователя в поле status записать несколько значений id_statuses разделенных разделителями, которые принадлежат ему.

Может можно реализовать попроще?

Добрый день, Иван.
Не знаю, правильно ли я понял вопрос.
Я бы сделал гораздо больше таблиц: пользователи, статусы, заявки, статусы_заявки. Последняя в случае, если одной заявке может соответствовать несколько статусов. Если нет, то она не нужна.

Например, если нужно чтобы пользователю могло быть назначено несколько статусов, то: сама таблица пользователя (id, имя, прочее), список_статусов (id, название, . ), статусы_пользователя (id, id_пользователя, id_статуса). Таим образом у вас будет обеспечена и целостность данных и не будет в таблицах не будет избыточности.

Delphi.FireDAC. Выполнение SQL команд

Данная статья о выполнении SQL команд в FireDAC. Основа для статьи – официальная документация.

Далее мы рассмотрим как отправлять команды через различные компоненты FireDAC.

TFDConnection

TFDConnection предлагает несколько перегруженных ExecSQL методов. Они просты для использования и полезны, когда

-Не нужно возвращать никаких результатов

-Когда SQL команда выполняется только однажды и не требуется, чтобы она находилась в подготовленном состоянии

-Нет необходимости для расширенной настройки параметров

-Нет необходимости для работы с SQL в дизайн режиме

Далее, в документации приводится такой пример

Для параметризованного запроса достаточно выполнить

Также TFDConnection предлагает методы ExecSQLScalar, отличные от ExecSQL. Как написано в документации ExecSQLScalar возвращает значение первой колонки в первом ряду первого result set

TFDQuery

FDQuery это более универсальный компонент для работы с SQL запросами. Он может и выполнять команды, не возвращающие множеств и наоборот, выполнять команды, возвращающие множества.

FDQuery можно использовать как в Runtime так и в Design режимах. В документации приводится пример как можно пользоваться компонентом в Design режиме

FDQuery в дизайн режиме

Чтобы воспользоваться FDQuery в дизайн режиме, нужно бросить его на форму. Свойство TFDQuery.Connection ,будет автоматически установлено, если на форме присутствует FDConnection. Двойной клик по компоненту и мы получим Query Editor

В этом окне можно задавать SQL команды, определять параметры и макросы, а также настраивать опции.

При нажатии на Execute выполнится запрос. Если команда возвращает множество, оно будет отображено во вкладке RecordSet, а структура множества будет отражена во вкладке Structure. Если DBMS возвращает сообщения об ошибках или предупреждения, они будут отражены во вкладке Messages.

Кнопка NextRecordSet позволяет пройтись по всем множествам, возвращаемым командой.

При тестировании DML команд, таких как UPDATE/INSERT/DELETE, если не подразумевается изменение множества из данного окна, то лучше поставить галочку AutoRollBack.

Кнопка OK для сохранения изменений в TFDQuery.

Использование параметров

Параметры в запросах это один из лучших приемов при разработке приложений БД. Главные достоинства это:

-Мы строим только одну SQL команду и используем её несколько раз с разными значениями параметров. DBMS, в свою, очередь будет строить план выполнения команды только один раз. Это снижает загрузку DBMS.

-В следующий раз, когда вы дадите команду на исполнение, только значения параметров будут передаваться в DBMS. Это снижает нагрузку на сеть.

-Не придется заботиться о формате SQL констант, например константа даты в Access SQL.

Чтобы добавить параметр в SQL запрос, достаточно использовать следующий синтакс :

То есть, в SQL запросе просто пишем двоеточие и имя константы. После этого ассоциируем соответствующие значения, используя коллекцию параметров. Далее в документации приводится такой пример

Ссылка на основную публикацию
Adblock
detector