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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.09.2013, 14:48   #1
impeee
Пользователь
 
Регистрация: 11.09.2013
Сообщений: 56
По умолчанию Delphi + БД Paradox7 + TQuery, SQL-запрос

Здравствуйте.

Возникла проблема с SQL-запросом, который удаляет строку в таблице Paradox7, находя ее по дате. Такой вот код у меня:

Код:
  FrmEmitent.Query1.Close;
  FrmEmitent.Query1.SQL.Clear;
  FrmEmitent.Query1.SQL.Add('DELETE FROM emitents\' + FrmEmitent.Lbl_CurrentEmitent.Caption + ' WHERE _date = "' + DBGrid1.DataSource.DataSet.FieldByName('_Date').AsString + '";');
  FrmEmitent.Query1.ExecSQL;
_date - это название столбца с датами, имеет формат ftDate.

Код:
  ...
  Table1.FieldDefs.Add('_Date',ftDate,0,True);
  ...
выскакивает стандартная ошибка, запрос обрывается на "WHERE _date =", на знаке равенства. даты имеют вид ДД.ММ.ГГГГ в таблице, и в DBGrid1 соответственно, но сравнить он как-то не может видимо. в запросе я убирал символы кавычек ", писал вручную, например "11.09.2013", а также "11.09.13", все варианты перепробывал - результат один и тот же. синтаксис запроса верный, к примеру по колонке "High" вида ftFloat он спокойно все находит, а вот с датами у него какой-то заскок, никак ему.

Помогите, пожалуйста. Как мне обратится к датам через SQL-запрос в парадоксе!
impeee вне форума Ответить с цитированием
Старый 11.09.2013, 15:00   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
FrmEmitent.Query1.SQL.Add('DELETE FROM emitents\' + FrmEmitent.Lbl_CurrentEmitent.Caption + ' WHERE _date = :MyDate');
FrmEmitent.Query1.Parameters.ParamByName('MyDate').Value:=DBGrid1.DataSource.DataSet.FieldByName('_Date').AsDateTime;
ADD

Сергей, не сговариваясь даже параметр одинаково назвали
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 11.09.2013 в 15:05.
Аватар вне форума Ответить с цитированием
Старый 11.09.2013, 15:02   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

так же, как и в любой другой СУБД - используйте параметры (параметрический запрос)!

т.е. запрос должен выглядеть примерно так:
Код:
FrmEmitent.Query1.SQL.Add('DELETE FROM emitents\' + FrmEmitent.Lbl_CurrentEmitent.Caption + ' WHERE _date = :MyDate;' );
FrmEmitent.Query1.Parameters.ParamByName('MyDate').asDateTime :=  DBGrid1.DataSource.DataSet.FieldByName('_Date').asDateTime;
// как вариант:
// FrmEmitent.Query1.Parameters.ParamByName('MyDate').asValue :=  DBGrid1.DataSource.DataSet.FieldByName('_Date')..asValue;



UPDATE
Цитата:
Сообщение от Аватар
Код:
..._date = :MyDate');
ОМГ! Неужели мы все настолько одинаково/шаблонно мыслим?!!! (см. имя переменной в моём примере!!)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.09.2013, 15:29   #4
impeee
Пользователь
 
Регистрация: 11.09.2013
Сообщений: 56
По умолчанию

Аватар, Serge_Bliznykov - возможно вы находитесь в каком-то одном информационном поле, что если вы соседи по лестничной площадке, но даже не подозреваете об этом? )

через объявление параметра тоже не работает ( не знаю, я уже просто в отчаянии. в SQL-запросе, на знаке равенства вновь останавливается. если "_Date" = :MyDate (заключить в ковычки), он пишет ошибку о несоответствии типов. Если FieldByName('_Date').asString - то ошибок не возникает, но и никаких действий не происходит, видимо не может найти значение и удаляет "ничего".

что ж делать. может даты хранить в текстовом поле, ftString? и конвертировать текст в дату по-символьно.. (
impeee вне форума Ответить с цитированием
Старый 11.09.2013, 15:54   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
если "_Date" = :MyDate (заключить в ковычки), он пишет ошибку о несоответствии типов.
ничего не надо заключать в кавычки!!

посмотрите, может быть, имя поля с подчёркиванием не нравится. Попробуйте переменовать _date -> в dateEmit (не факт, что причина в этом, но всё возможно...)
это раз.

во-вторых, залезьте в таблицу с помощью любого браузера данных
(хотя бы тот же Database Workshop возьмите
Цитата:
Код:
 dbw32.zip Database Workshop 5.24
             ----------------------
             Professional  tool  for  managing,  handling   and
             analizing  data  bases  with  a   wide   range  of
             possibilities.  Supported database types: Paradox,
             DBase,  Clarion,  Interbase,   MySql,   EasyTable,
             DBISAM, MS Access, KeyDb, TinyDb.
обратите внимание. Не исключено, что в поле хранится не только дата, но и время.


во-третьих, сделайте запрос на выборку данных (киньте на форму DBGrid, TDataSource и TQuery - свяжите их друг с другом. Выполните запрос на отображение данных (SELECT .... where dateEmit = :MyDate )
посмотрите, что возвращается и почему так.


Цитата:
что ж делать. может даты хранить в текстовом поле, ftString? и конвертировать текст в дату по-символьно.. (
ну, имхо, это самый последний-распоследний вариант!! Если уж ничего не выйдет, то можно хранить и в виде строки. Только тогда уже храните в универсальном виде (например, как это делает тип DATE в DBF формате - в формате YYYYMMDD, сегодняшняя дата будет записана в DBF как '20130911' )
Serge_Bliznykov вне форума Ответить с цитированием
Старый 11.09.2013, 16:04   #6
impeee
Пользователь
 
Регистрация: 11.09.2013
Сообщений: 56
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
посмотрите, может быть, имя поля с подчёркиванием не нравится. Попробуйте переменовать _date -> в dateEmit (не факт, что причина в этом, но всё возможно...)
переименовал столбец - и все заработало! причина была действительно в этом. огромное спасибо!
impeee вне форума Ответить с цитированием
Старый 11.09.2013, 16:07   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

не за что!
рад, что угадал причину!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
delphi и SQL запрос world12_tk Помощь студентам 5 17.05.2012 15:35
Сложный запрос при pomoshi TQuery/TADOQuery abr_question БД в Delphi 0 25.05.2010 20:18
Возникла проблема в программировании SQL запроса с помощью компонента TQuery Herly БД в Delphi 23 07.11.2009 18:16
Создание новых таблиц в MS SQL SERVERE через SQL запрос в Delphi S_Yevgeniy Помощь студентам 1 27.10.2009 06:26
sql запрос delphi viperrr Помощь студентам 13 03.07.2009 03:08