Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2013, 11:30   #1
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
Вопрос Цикл изменения записи в MySQL plz

Здравствуйте, есть код который должен у каждой записи в бд снижать ID на -1 но почему то выкидывает ошибку при попытке обновить бд

Код:
Код:
procedure TForm2.Button1Click(Sender: TObject);
var tos,id:integer;
begin
SQLQuery1.SQL.Add('select `id` from `table` where `mod`="'+mods+'" and `server`="'+server+'"');
SQLQuery1.Open;

while not SQLQuery1.Eof do
begin
id := SQLQuery1.FieldValues['id'];
tos := id-1;
SQLQuery1.SQL.Add('update table set `id`="'+InttoStr(tos)+'" where `id`="'+Inttostr(id)+'"');
SQLQuery1.ExecSQL;
SQLQuery1.Next;

end;

SQLQuery1.Close;
SQLQuery1.SQL.Clear;

end;
makar3000 вне форума Ответить с цитированием
Старый 02.05.2013, 11:47   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1.Чтобы не было гадания на кофейной гуще нужно не полениться и текст ошибки выложить полностью
2. Если это то, что я подумал, зачем вообще менять идентификатор записи
3. Выбрали например записи с ID 4 и 5. Меняете 5 на 4, а она уже существует
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.05.2013, 12:01   #3
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

1. Ошибка синтаксиса SQL
3. Редактирование идет от 1 и выше

Это самый простой способ решить мою проблему. Но синтаксис выбивает ошибку....
makar3000 вне форума Ответить с цитированием
Старый 02.05.2013, 12:05   #4
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

makar3000, а почему не просто:
Код:
procedure TForm2.Button1Click(Sender: TObject);
begin
  SQLQuery1.Close;
  SQLQuery1.SQL.Text := 'UPDATE table SET id = id -1 WHERE mod = :mod AND server = :server';
  SQLQuery1.Parameters.ParamByName('mod').Value := mods; 
  SQLQuery1.Parameters.ParamByName('server').Value := server;
  SQLQuery1.ExecSQL;
end;
?

а что касается поста №1 - у тебя для двух различных операций всего один SQLQuery ... т.е. ты с него и читаешь и им же обновляешь данные. вот они и дерутся между собой. если вынести update в SQLQuery2 - должно быть номально
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 02.05.2013 в 12:09.
Yurk@ вне форума Ответить с цитированием
Старый 02.05.2013, 12:06   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А id символьное, что ли? В кавычки зачем его брать? И повторяю - зачем менять идентификатор? Это высосанная из пальца необходимость
Yurk@, предложенный вариант запросто не прокатит по причине попытки создания неуникального ключа
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 02.05.2013, 12:11   #6
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Аватар, как-то я нигде не увидел указания того что поле ID - уникальное
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...
Yurk@ вне форума Ответить с цитированием
Старый 02.05.2013, 12:15   #7
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

Поле Id не автоинкримент. Приду домой и попробую, а насчет того для чего это извращение не просто так.
makar3000 вне форума Ответить с цитированием
Старый 02.05.2013, 19:00   #8
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

Проблема с циклом...

SQLQuery1: Cannot perform this operation on a closed dataset


Код:

Код:
while not SQLQuery1.Eof do
begin
id := SQLQuery1.FieldValues['id'];
SQLQuery1.SQL.Text := 'UPDATE table SET id = id -1 WHERE id = :id';
SQLQuery1.ParamByName('id').Value := id;
SQLQuery1.ExecSQL;
SQLQuery1.Next;
end;
makar3000 вне форума Ответить с цитированием
Старый 02.05.2013, 19:02   #9
makar3000
Пользователь
 
Регистрация: 26.09.2010
Сообщений: 96
По умолчанию

Цитата:
Сообщение от Yurk@ Посмотреть сообщение
makar3000, а почему не просто:

Потому что у всех записей нужно ID уменьшить на 1
makar3000 вне форума Ответить с цитированием
Старый 02.05.2013, 22:42   #10
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
По умолчанию

Цитата:
Проблема с циклом...
SQLQuery1: Cannot perform this operation on a closed dataset
ну я же написал уже
Цитата:
а что касается поста №1 - у тебя для двух различных операций всего один SQLQuery ... т.е. ты с него и читаешь и им же обновляешь данные. вот они и дерутся между собой. если вынести update в SQLQuery2 - должно быть номально
Цитата:
Потому что у всех записей нужно ID уменьшить на 1
а я вот здесь что по твоему сделал? (особое внимание на id = id -1)
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 02.05.2013 в 23:00.
Yurk@ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как отслеживать изменения в MYSQL Matras SQL, базы данных 2 19.06.2012 11:26
Цикл [PHP/MYSQL] madmaniac Помощь студентам 2 21.01.2012 16:58
История изменения конкретной записи таблицы WhiteDemon БД в Delphi 1 14.02.2011 18:51
Сохранение файла после изменения/удаления записи (Delphi) Kurai Помощь студентам 2 15.05.2010 23:21
Как отловить событие изменения БД MySQL иными от программы средствами (delphi) Art_Divin БД в Delphi 4 12.03.2010 09:46