Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 SQL запрос с аустыми значениями даты и времени  [new]
Валерий666
Member

Откуда:
Сообщений: 200
Сервер MySQL 5.5
Среда Delphi 7
Коннекторы Zlib



Выполняю запрос:

 Form1.ZQWork.SQL.Add('INSERT INTO registration');
  Form1.ZQWork.SQL.Add('(dateadd,timeadd,id,fio,phonepref,phone,number,'+
    'city,adress,home,apartment,dateclose,timeclose,'+
    'creator,status,executer,respons_exe,st1,st2,st3,st4,st5,'+
    'pstartdate,pstarttime,pstopdate,pstoptime,'+
    'content,'+
    'stage,pod,'+
    'description) VALUES (''' + trim(dateadd1) +  ''',''' + trim(timeadd1) +   ''',''' + trim(id.Text) +    ''',''' + trim(fio.Text) +    ''',''' + trim(phonepref.Text) +      ''',''' + trim(phone.Text) +     ''',''' + trim(number.Text) +
    ''',''' + trim(city.Text) +  ''',''' + trim(adress.Text) +    ''',''' + trim(home.Text) +  ''',''' + trim(apartment.Text) +   ''',''' + trim(dateclose1) +    ''',''' + trim(timeclose1) +
    ''',''' + trim(creator.Text)+  ''',''' + inttostr(status.ItemIndex)+   ''',''' + trim(executer.text)+ ''',''' + trim(respons_exe.text)+   ''',''' + booltostr(st1.Checked)+   ''',''' + booltostr(st2.Checked)+  ''',''' + booltostr(st3.Checked)+  ''',''' + booltostr(st4.Checked)+  ''',''' + booltostr(st5.Checked)+
    ''',''' + trim(pstartdate1)+  ''',''' + trim(pstarttime1)+   ''',''' + trim(pstopdate1)+ ''',''' + trim(pstoptime1)+
    ''',''' + trim(content.Text)+
    ''',''' + trim(etag.Caption)+ ''',''' + trim(num_pod.Caption) +
    ''',''' + trim(description.Text) +  ''')');


Еси все данные в (DATE\TIME) введены, то все отлично. Не дает закинуть пустые значения. Приходится городить вот такие костыли:
 if  dateadd.Text='  .  .    ' then   dateadd1:='0000-00-00' else  DateTimeToString(dateadd1,'yyyy-mm-dd',strtodate(dateadd.Text))  ;
 if  dateclose.Text='  .  .    ' then   dateclose1:='0000-00-00' else   DateTimeToString(dateclose1,'yyyy-mm-dd',strtodate(dateclose.Text))  ;
 if  timeadd.Text='  :  ' then timeadd1:='00:00:00' else timeadd1:=timeadd.Text;
  if  timeclose.Text='  :  ' then timeclose1:='00:00:00' else timeclose1:=timeclose.Text;


При таком значении(и в любой другой переменной, которая соответствует столбцу в БД типа DATE\TIME)
 timeclose1:=''

вываливается эксепшен с ошибкой на пустое начение.
Поля в БД стоят не уникальные, пустые.

Как быть? неужели нельзя записать пустое значение в поле даты или времени?

К сообщению приложен файл. Размер - 146Kb
4 янв 18, 11:43    [21081358]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
Док
Member

Откуда: Казань
Сообщений: 5869
про параметры и триггеры before insert ТС, похоже, не слышал ни разу....
4 янв 18, 12:49    [21081476]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 54505
Блог
Валерий666
Как быть? неужели нельзя записать пустое значение в поле даты или времени?

Как всегда в таких случаях, есть два пути решения проблемы, один простой, другой правильный. Простой путь - разобраться, как записать пустое значение без дельфы, а уже вооружившись этим знанием - подумать, как сделать это в дельфе. Правильный - выкинуть всё, что Вы здесь написали и привели, и сделать адекватно, прочитав перед этим - как именно это следует делать.

P.S. Если увидите в книжке или в статье что-то подобное тому, что Вы написали - отправляйте в мусорную корзину.
4 янв 18, 12:56    [21081493]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
Док
Member

Откуда: Казань
Сообщений: 5869
Валерий666,

1. у тебя есть тип TimeStamp. Храни там дату и время, по мере необходимости будешь извлекать или то, или другое, или оба два - т.о. образом кол-во полей может уменьшиться на 25-30%
2. используй параметры, типа
Form1.ZQWork.SQL.Text:= 'INSERT INTO registration (dateadd,timeadd...)  VALUES (:dateadd,:timeadd ...)';
Form1.ZQWork.SQL.Prepare;
Form1.ZQWork.SQL.ParamByName('dateadd').Value:= nil;
Form1.ZQWork.SQL.ParamByName('timeadd').Value:= nil;
Form1.ZQWork.SQL.Active:= True;


ps. я бы был поосторожнее с названиями полей типа dateadd, ибо это вполне может оказаться какой-нибудь функцией в твоей БД

pss. ты это за деньги делаешь или учебное задание? Если первое - твоему работодателю не позавидуешь
4 янв 18, 13:19    [21081525]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
Валерий666
Member

Откуда:
Сообщений: 200
Док
Валерий666,

1. у тебя есть тип TimeStamp. Храни там дату и время, по мере необходимости будешь извлекать или то, или другое, или оба два - т.о. образом кол-во полей может уменьшиться на 25-30%
2. используй параметры, типа
Form1.ZQWork.SQL.Text:= 'INSERT INTO registration (dateadd,timeadd...)  VALUES (:dateadd,:timeadd ...)';
Form1.ZQWork.SQL.Prepare;
Form1.ZQWork.SQL.ParamByName('dateadd').Value:= nil;
Form1.ZQWork.SQL.ParamByName('timeadd').Value:= nil;
Form1.ZQWork.SQL.Active:= True;


ps. я бы был поосторожнее с названиями полей типа dateadd, ибо это вполне может оказаться какой-нибудь функцией в твоей БД

pss. ты это за деньги делаешь или учебное задание? Если первое - твоему работодателю не позавидуешь


Да, надо сделать по человечески через параметры.
За это никто не платит. Попросили максимально быстро набыдлокодить работающую версию.
4 янв 18, 14:56    [21081713]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
Валерий666
Member

Откуда:
Сообщений: 200
Делаю так:
 Form1.ZQWork.Active:=false;
  Form1.ZQWork.SQL.Clear;
    Form1.ZQWork.SQL.Add('INSERT INTO registration (dateadd,timeadd)'+
    'VALUES'+
    '(:dateadd,:timeadd)');

Form1.ZQWork.Prepare;
Form1.ZQWork.ParamByName('dateadd').Value:= nil;
Form1.ZQWork.ParamByName('timeadd').Value:= nil;

    try
    Form1.ZQWork.Active:= True;
  except on e: EDatabaseError do
      messageDlg(e.message, mtError, [mbOK], 0);
  end;

Ругается тут: Form1.ZQWork.Prepare;
и тут
.....Value:= nil;
В uses подключен Variants
4 янв 18, 15:34    [21081762]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
Polesov
Member

Откуда:
Сообщений: 524
Привет.

Валерий666
Ругается тут: Form1.ZQWork.Prepare;
А как ругается?

Валерий666
и тут
.....Value:= nil;
Form1.ZQWork.ParamByName('dateadd').Value:= null;

Но лучше
Form1.ZQWork.ParamByName('dateadd').Clear;

С уважением, Polesov.
4 янв 18, 16:17    [21081827]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
Валерий666
Member

Откуда:
Сообщений: 200
Polesov
Привет.

Валерий666
Ругается тут: Form1.ZQWork.Prepare;
А как ругается?

Валерий666
и тут
.....Value:= nil;
Form1.ZQWork.ParamByName('dateadd').Value:= null;

Но лучше
Form1.ZQWork.ParamByName('dateadd').Clear;

С уважением, Polesov.


Как-то так. Эмпирическим путем выявлено, что ему что-то не нравится в параметрах. Т.к. на саму подготовку в рабочем запросе эксепшена нет...

К сообщению приложен файл. Размер - 11Kb
4 янв 18, 16:30    [21081848]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
Валерий666
Member

Откуда:
Сообщений: 200
Валерий666,
Разобрался. Неведомо почему но IDE выславляло не верную точку.
Ругалось в итоге на вот это
Form1.ZQWork.Active:= True;
4 янв 18, 16:39    [21081865]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 46361

Валерий666
Ругалось в итоге на вот это

И правильно делало, поскольку запрос insert не может быть активным.

Posted via ActualForum NNTP Server 1.5

4 янв 18, 16:58    [21081915]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
VDSoft
Member

Откуда:
Сообщений: 40
Dimitry Sibiryakov,

В ряде случаев (и скорее всего в случае ТС, раз у него в конце концов это заработало) эффект от него такой же, как и от ExecSQL, хотя конечно же это не профессионально. ))
4 янв 18, 18:19    [21082067]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
alekcvp
Member

Откуда:
Сообщений: 1201
Валерий666
Валерий666,
Разобрался. Неведомо почему но IDE выславляло не верную точку.

Такое бывает если в исходнике с переводами строки косяк, например где-то вместо CrLf просто Lf.
Это может получиться при вставке текста из интернета, например.
Надо открыть файл в редакторе, который умеет управлять типом Line Endings, принудительно выставить нормальные и пересохранить.
4 янв 18, 18:36    [21082094]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
VDSoft
Member

Откуда:
Сообщений: 40
alekcvp,

При (ручном) форматировании даты, очевидно, же, что неверно выставляло. ))
А что у меня прямое? - сказал верблюд. (с) )))
4 янв 18, 18:41    [21082104]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
rgreat
Member

Откуда:
Сообщений: 4582
INSERT INTO registration (dateadd,timeadd...) VALUES (NULL,NULL ...)
4 янв 18, 18:47    [21082115]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
fraks
Member

Откуда: Новосибирск
Сообщений: 1394
Для сервера Firebird передача в параметр NULL делается так:

QIns.ParamByName('param_name').Clear;


Возможно с вашей либой и сервером это так же будет работать.
4 янв 18, 20:43    [21082321]     Ответить | Цитировать Сообщить модератору
 Re: SQL запрос с аустыми значениями даты и времени  [new]
Док
Member

Откуда: Казань
Сообщений: 5869
Dimitry Sibiryakov
И правильно делало, поскольку запрос insert не может быть активным.

Верно. Exec.
5 янв 18, 02:41    [21082628]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить