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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.05.2010, 22:43   #1
Mrudda
 
Регистрация: 05.05.2010
Сообщений: 7
Печаль Вставка записи в таблицу БД через запрос

Доброго времени!
Задача: добавить запись.

Код:

Код:
procedure TForm3.Button2Click(Sender: TObject);
var max_ID:integer;
begin
   Table1.Active:=True;
   Form1.DataBase1.StartTransaction;
  try
    Query1.close;
    Query1.SQL.clear;
    Query1.SQL.ADD('Select Max(ID) as max_ID from opisanie_preparata');
    Query1.open;
    max_id:=Query1.fieldbyName('max_ID').asinteger+1;

    Query1.SQL.Add('INSERT INTO "opisanie_preparata" (ID,Nazvanie, Kategorya, Sostav, Srok_godnosty, Upakovka, Gotovim_v_apteke, Cena) ');
    Query1.SQL.Add('VALUES ('+max_ID+',"'+DBEdit1.Text+'", "'+DBEdit2.Text+'", "'+DBEdit3.Text+'", "'+DBEdit4.Text+'", "'+DBEdit5.Text+'", "'+DBEdit7.Text+'", "'+DBEdit6.Text+'")');
    Query1.ExecSQL;

    Form1.DataBase1.Commit;
  except
    Form1.DataBase1.RollBack;
    raise;
    Query1.Active:=true;
  end;

end;
Error:Incompatible types: 'String' and 'Integer' на
Query1.SQL.Add('VALUES ('+max_ID+',"'+DBEdit1.Text+'", "'+DBEdit2.Text+'", "'+DBEdit3.Text+'", "'+DBEdit4.Text+'", "'+DBEdit5.Text+'", "'+DBEdit7.Text+'", "'+DBEdit6.Text+'")');
Ее понимаю, почему.
Help, плз!

Последний раз редактировалось Stilet; 06.05.2010 в 08:50.
Mrudda вне форума Ответить с цитированием
Старый 05.05.2010, 23:10   #2
Droid
Форумчанин
 
Аватар для Droid
 
Регистрация: 24.04.2008
Сообщений: 440
По умолчанию

перепиши свой запрос по нажатию на кнопку на вот этот и будет все работать)
Код:
procedure TFD_SP.BitBtn1Click(Sender: TObject);
var
idss,i: integer;
begin
idss:=DBLCB1.KeyValue;
DM.ADOQ_SP.Close;
DM.ADOQ_SP.SQL.Clear;
DM.ADOQ_SP.SQL.Text:='INSERT INTO suicidalnaya_popitka (data_suicida, id_sposob_suicida,id_pacienta) VALUES (:ds,:idss,:idp);';
DM.ADOQ_SP.Parameters.ParamByName('ds').Value:= FormatDateTime('yyyy-mm-dd', datetimepicker1.Date);
DM.ADOQ_SP.Parameters.ParamByName('idss').Value:=idss;
DM.ADOQ_SP.Parameters.ParamByName('idp').Value:=DM.ADOQ_PACid_pacienta.Value;
DM.ADOQ_SP.ExecSQL;
DM.ADOQ_SP.Close;
DM.ADOQ_SP.SQL.Clear;
DM.ADOQ_SP.SQL.Add('SELECT * FROM suicidalnaya_popitka sp LEFT OUTER JOIN pacient 
pt ON sp.id_pacienta=pt.id_pacienta INNER JOIN sposob_suicida ss ON ss.id_sposob_suicida=sp.id_sposob_suicida WHERE sp.id_pacienta=:idp');
DM.ADOQ_SP.Parameters.ParamByName('idp').Value:=DM.ADOQ_PACid_pacienta.Value;
DM.ADOQ_SP.Open;
1 старый программист, лучше новых 2-х
Droid вне форума Ответить с цитированием
Старый 05.05.2010, 23:39   #3
Mrudda
 
Регистрация: 05.05.2010
Сообщений: 7
По умолчанию

))
Всё б хорошо, да нужно через Query(

Последний раз редактировалось Mrudda; 05.05.2010 в 23:42.
Mrudda вне форума Ответить с цитированием
Старый 06.05.2010, 02:59   #4
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Код:
procedure TFD_SP.BitBtn1Click(Sender: TObject);
var
idss,i: integer;
begin
idss:=DBLCB1.KeyValue;
DM.Query1.Close;
DM.Query1.SQL.Clear;
DM.Query1.SQL.Text:='INSERT INTO suicidalnaya_popitka (data_suicida, id_sposob_suicida,id_pacienta) VALUES (:ds,:idss,:idp);';
DM.Query1.ParamByName('ds').Value:= FormatDateTime('yyyy-mm-dd', datetimepicker1.Date);
DM.Query1.ParamByName('idss').Value:=idss;
DM.Query1.ParamByName('idp').Value:=DM.ADOQ_PACid_pacienta.Value;
DM.Query1.Open;
DM.Query1.Close;
DM.Query1.SQL.Clear;
DM.Query1.SQL.Add('SELECT * FROM suicidalnaya_popitka sp LEFT OUTER JOIN pacient 
pt ON sp.id_pacienta=pt.id_pacienta INNER JOIN sposob_suicida ss ON ss.id_sposob_suicida=sp.id_sposob_suicida WHERE sp.id_pacienta=:idp');
DM.Query1.ParamByName('idp').Value:=DM.ADOQ_PACid_pacienta.Value;
DM.Query1.Open;
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 06.05.2010, 08:41   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Артём, ну кто же добавление в таблицу делает через .Open ?! Только через ExecSQL и никак не иначе!!


2 Mrudda, если уж Вам жалко ещё один Query задействовать, то кто будет старый запрос закрывать и старый текст запроса получения максимального значения очищать?!!!!

попробуйте так:
Код:
  ....
  Query1.close;
  Query1.SQL.clear;
  Query1.SQL.ADD('Select Max(ID) as max_ID from opisanie_preparata');
  Query1.open;
  max_id := Query1.fieldbyName('max_ID').asinteger + 1;

  Query1.close;
  Query1.SQL.clear;

  Query1.SQL.Add('INSERT INTO "opisanie_preparata" (ID,Nazvanie, Kategorya, Sostav, Srok_godnosty, Upakovka, Gotovim_v_apteke, Cena) ');
  Query1.SQL.Add('VALUES (' + max_ID + ',"' + DBEdit1.Text + '", "' + DBEdit2.Text + '", "' + DBEdit3.Text + '", "' + DBEdit4.Text + '", "' + DBEdit5.Text + '", "' + DBEdit7.Text + '", "' + DBEdit6.Text + '")');
  Query1.ExecSQL;
  ....
p.s. содержимое команды Insert into я не анализировал. Да и вообще, лучше сделать через параметры (например, так, как в примере выше показал artemavd)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.05.2010, 10:02   #6
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Цитата:
Артём, ну кто же добавление в таблицу делает через .Open ?! Только через ExecSQL и никак не иначе!!
Сорри, Сергей, забыл про то, про что сам недавно говорил. .

P.S. Не Артём, а Артем
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 06.05.2010, 14:57   #7
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от Mrudda Посмотреть сообщение
Error:Incompatible types: 'String' and 'Integer'
вернемся к тексту ошибки
если рассматривать такой способ формирования запроса на вставку записи, то просто нужно конвертнуть ваш новый айдишник в строчку
Код:
Query1.SQL.Add('VALUES (' + IntToStr(max_ID) + ',"' + DBEdit1.Text + '", "' + ...
ну и по параметризации уже раскрыли тему - будет проще работать и тебе и субд

а что за субд? а то такой (select max(ID)+1) способ получения нового значения ключевого поля в многопользовательской системе грозит серьезными проблемами - может есть возможность заюзать триггер/генератор для этого?!
soleil@mmc вне форума Ответить с цитированием
Старый 07.05.2010, 22:09   #8
Mrudda
 
Регистрация: 05.05.2010
Сообщений: 7
По умолчанию

Спасибо вам, огромное.
soleil@mmc, субд - Access((.
(Я понимаю, что это извращение, но не факт, что удастся переубедить человека, дающего такие задания.)
Mrudda вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Добавление записи через список в связанную таблицу(при связи с Access) megaten БД в Delphi 5 17.05.2009 15:57
Вставка значения в таблицу с автоинкриментным полем artemavd БД в Delphi 5 16.05.2009 12:14
расширение и вставка данных в таблицу Dennikid Общие вопросы Delphi 12 06.10.2008 09:34
Вставка картинки в таблицу sabina_smile Помощь студентам 7 18.10.2007 16:29