Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.06.2009, 03:08
Booo Booo вне форума
Новичок
 
Регистрация: 03.07.2008
Сообщения: 93
Репутация: 10
По умолчанию ADO проблемы...

Имеется bd Access,adoquert,adoconnected,datasource,..
Зановить данные в таблицу получается,удалять тоже,только обновление происходит по странному...
Создал просто обычную таблицу,так сказать для пробы.Первичный ключ стоит ,текстовое фио и ид числовое...
значит пытаюсь обновить так
Код:
ADOQuery1.SQL.Text := 'UPDATE table1 SET fio = ' + QuotedStr(Edit2.Text) + ' WHERE id='+Edit1.Text+ '';
ADOQuery1.ExecSQL;
то есть ясно ..что обновить фио того пользователя у кого ид остался такой же..после того ,как нажимаю обновить кнопку...с сетки все исчезает.если выйду и зайду ,то обновление прокатило!Но если обновить ,понаблюдать это событие интересное (исчезновение всего с сетки )и попробывать удалить или внести запись ,получаем ошибку на то что cannot perform this operation on a close data set..как исправить ,что бы он обновлял и не требовался перезапуск проги.
Ответить с цитированием
  #2  
Старый 20.06.2009, 14:58
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А нафига замыкающие кавычки в запросе? Помоему так правильнее:
Код:
ADOQuery1.SQL.Text := 'UPDATE table1 SET fio = ' + QuotedStr(Edit2.Text) + ' WHERE id='+Edit1.Text;
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 23.06.2009, 15:30
Booo Booo вне форума
Новичок
 
Регистрация: 03.07.2008
Сообщения: 93
Репутация: 10
По умолчанию

Та же самая проблема...Если обновляет то надо перезапускать ...а если не перезапустить и попробывать внести или удалить данные то та же ошибка ...Project Project1.exe raised exception class EDatabaseError with messasge 'ADOQuery1:Cannot perform this operation on a closed dataset'.Process stopped.Use Step or Run to continue.
Ответить с цитированием
  #4  
Старый 23.06.2009, 16:05
PiboDIE PiboDIE вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 28
Репутация: 10
По умолчанию

Если datasource привязан к этому query, то, теоретически, возникает такая ситуация - Вы выполняете ExecSQL, что в свою очередь выполняет запрос и, если правильно помню, переводит позицию query.active в false. Наверное не очень ясно выражаюсь - попробуйте разделить функции отображения данных из базы и редактирование базы на 2 разных компонента. Один query работает на отображение информации (все запросы с SELECT), вторым query (или даже лучше command) вносите данные в БД (Запросы INPUT, UPDATE, DELETE).
Но могу и ошибаться. Проверить пока что негде.

Последний раз редактировалось PiboDIE, 23.06.2009 в 16:12.
Ответить с цитированием
  #5  
Старый 23.06.2009, 23:52
Booo Booo вне форума
Новичок
 
Регистрация: 03.07.2008
Сообщения: 93
Репутация: 10
По умолчанию

Если делать как ты говоришь ,то получиться так что выбьет второй квери в пасивное положение..полбому обоим квери нужно в свойствах стандартный запрос делать на выделение данных из таблицы..если я конечно не ошибаюсь..поэтому не получается возможным разбить на два компонента так как обязательно обоим делать селект из базы..я так думаю..попробывать как ты говоришь, я просто создам полную копию первому квери..ведь что бы поставить второй квери в активную позицию выбивает ошибку ,что надо запрос в свойствах заполнить.
Ответить с цитированием
  #6  
Старый 24.06.2009, 09:05
PiboDIE PiboDIE вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 28
Репутация: 10
По умолчанию

Зачем обоим выполнять выборку? Вроде как один квери справлялся до этого. Просто смысл в том, что отображение данных из базы должен выполнять один компонент, а внесение данных - другой. Можно, конечно, все реализовать на базе одного компонента, но в этом случае перед выполнением ExecSQL отключить датасорс, а после выполнения - заново отфильтровать данные из базы и включить датасорс.
Проблема скорее всего кроется в том, что один компонент не может не сбивая фильтр производить изменения в базе данных.
Ответить с цитированием
  #7  
Старый 24.06.2009, 15:42
Atomic1 Atomic1 вне форума
Прохожий
 
Регистрация: 24.06.2009
Сообщения: 2
Репутация: 10
По умолчанию

Посмотри как это делает программа DA-GENERATOR
Программа автоматически создает DELPHI исходники для работы с таблицами

САЙТ ПРОГРАММЫ : FDEVELOPER.COM
DEMO ВЕРСИЯ - http://fdeveloper.com/index.php?name=Files&op=cat&id=2
HELP - http://fdeveloper.com/index.php?name...iew_file&lid=2
ВИДЕО УРОКИ - http://fdeveloper.com/index.php?name=Files&op=cat&id=4

ПРИМЕРЫ СГЕНЕРИРОВАННЫХ ПРОГРАММ - http://fdeveloper.com/index.php?name=Files&op=cat&id=5
Ответить с цитированием
  #8  
Старый 24.06.2009, 23:28
Booo Booo вне форума
Новичок
 
Регистрация: 03.07.2008
Сообщения: 93
Репутация: 10
По умолчанию

Цитата:
Сообщение от PiboDIE
Зачем обоим выполнять выборку?
смотри я выношу второй квери на форму...показываю че куда подключается..пытаюсь сделать его активным..так он мне пишет ,что Missing sql property...
Что мне в это свойство вписать ?Оно .как я понял не может быть пустым...в первом в свойстве стоит выбор данных из бд..а во второй что вписать в это свойство?
Ответить с цитированием
  #9  
Старый 25.06.2009, 00:21
PiboDIE PiboDIE вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 28
Репутация: 10
По умолчанию

Цитата:
Сообщение от Booo
смотри я выношу второй квери на форму...показываю че куда подключается..пытаюсь сделать его активным..так он мне пишет ,что Missing sql property...
Что мне в это свойство вписать ?Оно .как я понял не может быть пустым...в первом в свойстве стоит выбор данных из бд..а во второй что вписать в это свойство?
В том-то и дело, что второй квери в active переводить не нужно. Active := true только в случае выборки из базы данных. Для внесения/удаления/изменения данных просто заполняешь Query.SQL.Text запросом и выполняешь ExecSQL, в актив не переводишь! К тому же второй квери, который будет отвечать за правку базы связываешь только с connection, никакие датасорсы ему для работы ненужны.
Ответить с цитированием
  #10  
Старый 25.06.2009, 00:53
Booo Booo вне форума
Новичок
 
Регистрация: 03.07.2008
Сообщения: 93
Репутация: 10
По умолчанию

Через второй квери ,который в пасивном положении и который только вносит данные ни че не может сделать..ошибка та же закрытый дата сет..

Последний раз редактировалось Booo, 25.06.2009 в 00:58.
Ответить с цитированием
  #11  
Старый 25.06.2009, 09:31
PiboDIE PiboDIE вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 28
Репутация: 10
По умолчанию

Попробуйте создать новый проект, накидать на форму ADOConnection, 2 ADOQuery, DataSource и DBTable (точно не помню, я отображение данных вручную делаю через стандартные компоненты.)
Далее создайте простую базу данных и заполните парой тройкой записей.
И уже на новом проекте реализуйте отображение с помощью первого квери и изменения с помощью второго. Я в свою очередь дома тоже попробую (если не забуду , но это уже будет не ранее 20 часов )
Ответить с цитированием
  #12  
Старый 25.06.2009, 20:06
PiboDIE PiboDIE вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 28
Репутация: 10
По умолчанию

Прикладываю пример, где у меня ошибок не возникает. Среда разработки Delphi 2007

База данных Access2002-2003
1 таблица tbl_user
4 поля id, username, password, age (В принципе age даже не участвует в запросах )

Unit1.pas
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls, Mask, DBCtrls;

type
  TForm1 = class(TForm)
    dbConnection: TADOConnection;
    dbQuerySelect: TADOQuery;
    dbQueryEdit: TADOQuery;
    dsSelect: TDataSource;
    DBGrid1: TDBGrid;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  rnd_num: integer;
begin
  rnd_num := Random(100000);
  dbQueryEdit.SQL.Text := 'INSERT INTO `tbl_user` (`username`, `password`) VALUES (''user'+IntToStr(rnd_num)+''', ''pwd'+IntToStr(rnd_num)+''')';
  dbQueryEdit.ExecSQL;
  dbQuerySelect.Active := false;
  dbQuerySelect.Active := true;
end;

procedure TForm1.FormActivate(Sender: TObject);
begin
  Randomize;
  dbConnection.Connected := true;
  dbQuerySelect.Active := true;
end;

end.

Unit1.dfm
Код:
object Form1: TForm1
  Left = 0
  Top = 0
  Caption = 'Form1'
  ClientHeight = 439
  ClientWidth = 763
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'Tahoma'
  Font.Style = []
  OldCreateOrder = False
  OnActivate = FormActivate
  PixelsPerInch = 96
  TextHeight = 13
  object DBGrid1: TDBGrid
    Left = 8
    Top = 8
    Width = 729
    Height = 233
    DataSource = dsSelect
    TabOrder = 0
    TitleFont.Charset = DEFAULT_CHARSET
    TitleFont.Color = clWindowText
    TitleFont.Height = -11
    TitleFont.Name = 'Tahoma'
    TitleFont.Style = []
  end
  object Button1: TButton
    Left = 120
    Top = 256
    Width = 75
    Height = 25
    Caption = 'Button1'
    TabOrder = 1
    OnClick = Button1Click
  end
  object dbConnection: TADOConnection
    ConnectionString = 
      'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=1.mdb;Persist Secur' +
      'ity Info=False'
    LoginPrompt = False
    Mode = cmShareDenyNone
    Provider = 'Microsoft.Jet.OLEDB.4.0'
    Left = 16
    Top = 248
  end
  object dbQuerySelect: TADOQuery
    Connection = dbConnection
    CursorType = ctStatic
    Parameters = <>
    SQL.Strings = (
      'SELECT * FROM tbl_user')
    Left = 16
    Top = 280
  end
  object dbQueryEdit: TADOQuery
    Connection = dbConnection
    Parameters = <>
    Left = 80
    Top = 280
  end
  object dsSelect: TDataSource
    DataSet = dbQuerySelect
    Left = 16
    Top = 312
  end
end
Вложения
Тип файла: rar db.rar (15.5 Кбайт, 17 просмотров)

Последний раз редактировалось PiboDIE, 25.06.2009 в 20:11.
Ответить с цитированием
  #13  
Старый 25.06.2009, 20:24
PiboDIE PiboDIE вне форума
Прохожий
 
Регистрация: 17.06.2009
Сообщения: 28
Репутация: 10
По умолчанию

В принципе все эти телодвижения можно выполнять имея всего 1 квери, но тогда алгоритм должен быть примерно следующий

Записи отфильтрованы и отображаются пользователю
1) При возникновении необходимости (нажатие кнопки) внести/удалить/изменить записи отключаем квери
Query.Active := false;
Не забываем отключить датасорс
DataSource.Enabled := false;
2)Запоминаем предыдущий запрос, который отображал данные (Не обязательно запоминать, он может являться константой)
tmp_query := Query.SQL.Text;
3)Оформляем новый запрос к базе (внесение/изменение/удаление данных)
Query.SQL.Text := 'INSERT/UPDATE/DELETE ...';
4)Выполняем запрос на изменение данных
Query.ExecSQL;
5)Восстанавливаем предыдущий запрос (на отображение данных)
Query.SQL.Text := tmp_query;
6)Фильтруем данные из базы
Query.Active := true;
Восстанавливаем активность датасорса
DataSource.Enabled := true;

То есть смысл в том, что - квери не может одновременно отображать данные и вносить изменения в базу. (Я могу заблуждаться, но пришел именно к такому выводу)
Ответить с цитированием
  #14  
Старый 26.06.2009, 23:29
Booo Booo вне форума
Новичок
 
Регистрация: 03.07.2008
Сообщения: 93
Репутация: 10
По умолчанию

Спасибо за старания ..но проект твой незапустился =(ошибку выбивает ..это не суть .Мне обязательно надо два едита ,где в первом вбивается ид о пользователе,а во втором фио..если это новый пользователь то ид и фио внесуться в бд ,как новая запись..если хотим обновить инфу о пользователе,то в первыи едит вбиваем ид того пользователя ,кого хотим апдейтнуть, а в фио новое фио(которое соответственно обновит старое фио) ...ну в общем я попробую по твоему последнему посту ..спасибо за старания...только проект , не запустился..сижу и так тока ночью ,времени нету,поробую то что ты написал потом скажу что получилось))
Ответить с цитированием
  #15  
Старый 26.06.2009, 23:56
Booo Booo вне форума
Новичок
 
Регистрация: 03.07.2008
Сообщения: 93
Репутация: 10
По умолчанию

АААААА ФАКИНГ ШИТ ЗЕ БЕСТ!!!PibODie Thank you very much ..я должен те телку с большими сиськами !!!!Спасибо спасибо!!
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 03:55.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter