SQLDb

Модератор: Модераторы

SQLDb

Сообщение arriah » 22.07.2016 13:26:41

Привет, коллеги :)
Есть небольшой вопросик.

Имеется база данных, там куча полей, одна из которых date в формате timestamp. Нужные поля отображаются в гриде. Дату привел к "читабельному формату" чтобы нормально в DBGrid видно было:

Код: Выделить всё
procedure TForm1.ConnectToBase(Sender: TObject);
begin
try
   MySql56Conn.Connected:=true;
except
   ShowMessage('Нет соединения с базой данных');
end;
try
   QueryNews.SQL.Text:='SET CHARACTER SET UTF8 ';
   QueryNews.ExecSQL;
   QueryNews.Close;
   QueryNews.SQL.Text:='SELECT *,FROM_UNIXTIME(Date) as NewsDate FROM d_post WHERE '+
                      'from_unixtime(date) >= now() - interval 1 day ' +
                      'ORDER BY Date DESC';
   QueryNews.Open;
except
   ShowMessage(' Ошибка при выполнении SQL запроса.');
   MySql56Conn.Connected:=false;
end;
// далее разные обработки
end;

procedure TForm1.Approve(Sender: TObject);
var
NewsApprove:TDBEdit:
begin
   NewsApprove:=TDBEdit.Create(nil);
   NewsApprove.DataSource:=DataSource1;
   NewsApprove.DataField:='Approve':
   while not SQLNews.EOF do begin
     SQLNews.Edit;
     IF NewsApprove='0' then NewsApprove:='1';
     SQLNews.Post;
   end;
  SQLNews.ApplyUpdates;
end;

Так вот в DBGrid все показывается нормально, но при выполнении TForm1.Approve ругается что поле NewsDate не найдено.. В реальное базе его же нет, ибо оно создано в selecte, что он туда хочет записать?

В примере могут быть ошибки, пишу по памяти

И попутный вопрос, как работает SQLTransaction? Вернее. как его правильно использовать дабы базу не поломать в случае чего :)
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: SQLDb

Сообщение Снег Север » 22.07.2016 13:36:03

Правильно ругается. Не всякий датасет можно напрямую редактировать. Вам надо сделать отдельный update, а после него вызвать SQLNews.Refresh.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47

Re: SQLDb

Сообщение arriah » 22.07.2016 13:54:00

Снег Север писал(а):Правильно ругается. Не всякий датасет можно напрямую редактировать. Вам надо сделать отдельный update, а после него вызвать SQLNews.Refresh.

Согласен, но когда из запроса убираю
Код: Выделить всё
FROM_UNIXTIME(Date) as NewsDate


то все нормально.
То есть мне нужна отдельная процедура UPDATE, в которой прописать типа
Код: Выделить всё
SQLNews.Close;
SQLnews.SQL.Text:='UPDATE d_post SET approve="1";
SQLNews.ExecSQL;

Если да, то как пройтись по всем полям DadaSet'a? Или. например, по выбраным или текущему?
arriah
новенький
 
Сообщения: 94
Зарегистрирован: 29.07.2015 16:42:35

Re: SQLDb

Сообщение Снег Север » 22.07.2016 18:50:10

Редактировать в датасете можно напрямую, если там только однозначное соответствие полей с таблицами. Нет вычисляемых полей.
Для UPDATE проще всего сделать запрос вида
Код: Выделить всё
'UPDATE d_post SET approve="1" WHERE ...

и в этом WHERE повторяете то, что у вас в условии SELECT'а.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 2993
Зарегистрирован: 27.11.2007 16:14:47


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4

Рейтинг@Mail.ru