SQLDb

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

Ответить
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

SQLDb

Сообщение arriah »

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

Имеется база данных, там куча полей, одна из которых 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? Вернее. как его правильно использовать дабы базу не поломать в случае чего :)
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3069
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Правильно ругается. Не всякий датасет можно напрямую редактировать. Вам надо сделать отдельный update, а после него вызвать SQLNews.Refresh.
arriah
новенький
Сообщения: 94
Зарегистрирован: 29.07.2015 15:42:35

Сообщение arriah »

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

Согласен, но когда из запроса убираю

Код: Выделить всё

FROM_UNIXTIME(Date) as NewsDate


то все нормально.
То есть мне нужна отдельная процедура UPDATE, в которой прописать типа

Код: Выделить всё

SQLNews.Close;
SQLnews.SQL.Text:='UPDATE d_post SET approve="1";
SQLNews.ExecSQL;

Если да, то как пройтись по всем полям DadaSet'a? Или. например, по выбраным или текущему?
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3069
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Редактировать в датасете можно напрямую, если там только однозначное соответствие полей с таблицами. Нет вычисляемых полей.
Для UPDATE проще всего сделать запрос вида

Код: Выделить всё

'UPDATE d_post SET approve="1" WHERE ...

и в этом WHERE повторяете то, что у вас в условии SELECT'а.
Ответить