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

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

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2009, 18:28   #1
Alter1989
 
Регистрация: 10.05.2009
Сообщений: 7
По умолчанию sql-запрос на обновление

Имеется запрос на обновление записи в таблице:
Код:
dm.UpdateQuery.close;
dm.UpdateQuery.SQL.Clear;
dm.UpdateQuery.SQL.add('update z_l set rayon="+rayon.text+",vsego="+Vs.text+",1SP="+P1.te xt+",1SF="+F1.text+",2sp="+P2.text+",2sf="+F2.text +",3sp="+P3.text+",3sf="+F3.text+",4sp="+P4.text+" ,4sf="+F4.text+" where z_l.id like "+IDD.text+"');
dm.UpdateQuery.ExecSQL;
Если изменяю поле rayon и потом перехожу на другую запись, то появляется ошибка: "Недостаточно сведений ключевого поля для обновления", но если изменяю любые другие поля, такой ошибки не возникает.
База MS Access, способ доступа - ADO, ключевое поле - ID. Все поля числового типа.
В чем причина и как это исправить? Заранее спасибо.
Alter1989 вне форума Ответить с цитированием
Старый 11.05.2009, 23:40   #2
koma_grusha
Редкий обитатель
Форумчанин
 
Аватар для koma_grusha
 
Регистрация: 08.04.2009
Сообщений: 170
По умолчанию

пока не знаю что у тебя, но дам советы
1)
Код:
where z_l.id like
замени на
Код:
where z_l.id =
2) если район в базе имеет строковый типа, то надо не просто rayon.text, а желательно использовать QuotedStr(rayon.text), чтобы в запросе она была строкой
Мозг, хорошо устроенный, стоит больше, чем мозг, хорошо наполненный (Мишель Монтень)
koma_grusha вне форума Ответить с цитированием
Старый 12.05.2009, 08:30   #3
Alter1989
 
Регистрация: 10.05.2009
Сообщений: 7
По умолчанию

Пробовал like заменять на =.
where z_l.id = SelectQuery.id - выдает ошибку: "Параметр SelectQuery.id не имеет значения по умолчанию", поэтому поставил like.
Поле rayon в таблице z_l имеет числовой тип, оно связано с полем ID(ключевое поле) из подстановочной таблицей Rayons (один ко многим). Возможно поэтому и не получается его изменить. Вернее, запрос его изменяет, но при переходе на любую другую запись выдает ошибку.
Alter1989 вне форума Ответить с цитированием
Старый 12.05.2009, 11:50   #4
Rekky
Форумчанин
 
Аватар для Rekky
 
Регистрация: 14.01.2009
Сообщений: 312
По умолчанию

У ADO, видимо, вечно проблемы с ключевыми полями((( У меня была такая проблема при удалении...Причину так и не выяснила...но можно попробовать обойти разными способами.Эта ошибка возникает при обновлении.Например,можно поробовать через try .. except
Код:
dm.UpdateQuery.close;
dm.UpdateQuery.SQL.Clear;
dm.UpdateQuery.SQL.add('update z_l set rayon="+rayon.text+",vsego="+Vs.text+",1SP="+P1.te xt+",1SF="+F1.text+",2sp="+P2.text+",2sf="+F2.text +",3sp="+P3.text+",3sf="+F3.text+",4sp="+P4.text+" ,4sf="+F4.text+" where z_l.id like "+IDD.text+"');
dm.UpdateQuery.ExecSQL;
try 
 DM.ТвояТаблица.Refresh;
except;
 Здесь можно какой-нибудь ShowMessage Написать (Напр: ShowMessage ('Запись изменена!')), а можно ничего не писать.
end;
Никому не поставить нас на колени! Мы лежали и будем лежать!
Rekky вне форума Ответить с цитированием
Старый 12.05.2009, 11:54   #5
Rekky
Форумчанин
 
Аватар для Rekky
 
Регистрация: 14.01.2009
Сообщений: 312
По умолчанию

Извините,что то я расписалась))) Про Ентер забыла,в "быстром ответе" автоматичеси переходит...
Никому не поставить нас на колени! Мы лежали и будем лежать!
Rekky вне форума Ответить с цитированием
Старый 12.05.2009, 12:19   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Во-первых, я не очень понял зачем нужно в ковычки брать числовые значения в запросе.
во-вторых, может по этому полю связка есть?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.05.2009, 12:35   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

в сотый раз дам рекомендацию перейти к параметрам
какой бы сервак скл ни был такой переход, в первую очередь, упростит жизнь самому разработчику - не нужно будет путаться с кавычками и приводить не к тому типу (в данном случае зачем-то айдишник приводится к тексту)

и тогда код может выглядеть где-то так
Код:
dm.UpdateQuery.close;
dm.UpdateQuery.SQL.Clear;
dm.UpdateQuery.SQL.add('update z_l set 
dm.UpdateQuery.SQL.add(' rayon=:p0,');
dm.UpdateQuery.SQL.add(' vsego=:p1,');
dm.UpdateQuery.SQL.add(' 1SP=:p2,');
dm.UpdateQuery.SQL.add(' 1SF=:p3,');
dm.UpdateQuery.SQL.add(' 2sp=:p4,');
dm.UpdateQuery.SQL.add(' 2sf=:p5,');
dm.UpdateQuery.SQL.add(' 3sp=:p6,');
dm.UpdateQuery.SQL.add(' 3sf=:p7,');
dm.UpdateQuery.SQL.add(' 4sp=:p8,');
dm.UpdateQuery.SQL.add(' 4sf=:p9 ');
dm.UpdateQuery.SQL.add(' where z_l.id = :p10');
dm.UpdateQuery.ParamByName('p0').AsInteger:=StrToInt(rayon.text);
dm.UpdateQuery.ParamByName('p1').AsInteger:=StrToInt(Vs.text);
dm.UpdateQuery.ParamByName('p2').AsInteger:=StrToInt(P1.text);
dm.UpdateQuery.ParamByName('p3').AsInteger:=StrToInt(F1.text);
dm.UpdateQuery.ParamByName('p4').AsInteger:=StrToInt(P2.text);
dm.UpdateQuery.ParamByName('p5').AsInteger:=StrToInt(F2.text);
dm.UpdateQuery.ParamByName('p6').AsInteger:=StrToInt(P3.text);
dm.UpdateQuery.ParamByName('p7').AsInteger:=StrToInt(F3.text);
dm.UpdateQuery.ParamByName('p8').AsInteger:=StrToInt(P4.text);
dm.UpdateQuery.ParamByName('p9').AsInteger:=StrToInt(F4.text);
dm.UpdateQuery.ParamByName('p10').AsInteger:=StrToInt(IDD.text);
dm.UpdateQuery.ExecSQL;
возможно, что это
Код:
.AsInteger:=StrToInt(
может быть заменено на это
Код:
.AsFloat:=StrToFloat(

Последний раз редактировалось soleil@mmc; 12.05.2009 в 12:54.
soleil@mmc вне форума Ответить с цитированием
Старый 12.05.2009, 14:43   #8
Alter1989
 
Регистрация: 10.05.2009
Сообщений: 7
По умолчанию

Stilet, да, поле rayon действительно связано с другой таблицей. Думаю, поэтому и не получалось его обновить.
Мне посоветовали сделать проще - воспользоваться методами insert и post компонента TQuery, тем самым редактируя саму выборку, а не таблицу. Я как бы не был в курсе, что в TADOQuery можно добавлять, изменять и удалять записи так же как и в TADOTable.
Таким образом, проблема решена.
Всем спасибо за помощь.
Alter1989 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
автоматическое обновление таблице через запрос sql eda Microsoft Office Excel 8 19.04.2011 12:47
SQL запрос Dux БД в Delphi 5 27.08.2008 13:36
Sql запрос из бд Novi4ek Помощь студентам 4 20.05.2008 14:04
SQL-запрос Alexey_vyb БД в Delphi 4 22.05.2007 18:52
SQL запрос на основе другого SQL запрса... Timoxa БД в Delphi 1 07.01.2007 18:15