![]() |
|
|
#1
|
|||
|
|||
|
Имеется bd Access,adoquert,adoconnected,datasource,..
Зановить данные в таблицу получается,удалять тоже,только обновление происходит по странному... Создал просто обычную таблицу,так сказать для пробы.Первичный ключ стоит ,текстовое фио и ид числовое... значит пытаюсь обновить так Код:
ADOQuery1.SQL.Text := 'UPDATE table1 SET fio = ' + QuotedStr(Edit2.Text) + ' WHERE id='+Edit1.Text+ ''; ADOQuery1.ExecSQL; |
|
#2
|
||||
|
||||
|
А нафига замыкающие кавычки в запросе? Помоему так правильнее:
Код:
ADOQuery1.SQL.Text := 'UPDATE table1 SET fio = ' + QuotedStr(Edit2.Text) + ' WHERE id='+Edit1.Text; |
|
#3
|
|||
|
|||
|
Та же самая проблема...Если обновляет то надо перезапускать ...а если не перезапустить и попробывать внести или удалить данные то та же ошибка ...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
|
|||
|
|||
|
Если datasource привязан к этому query, то, теоретически, возникает такая ситуация - Вы выполняете ExecSQL, что в свою очередь выполняет запрос и, если правильно помню, переводит позицию query.active в false. Наверное не очень ясно выражаюсь - попробуйте разделить функции отображения данных из базы и редактирование базы на 2 разных компонента. Один query работает на отображение информации (все запросы с SELECT), вторым query (или даже лучше command) вносите данные в БД (Запросы INPUT, UPDATE, DELETE).
Но могу и ошибаться. Проверить пока что негде. Последний раз редактировалось PiboDIE, 23.06.2009 в 16:12. |
|
#5
|
|||
|
|||
|
Если делать как ты говоришь ,то получиться так что выбьет второй квери в пасивное положение..полбому обоим квери нужно в свойствах стандартный запрос делать на выделение данных из таблицы..если я конечно не ошибаюсь..поэтому не получается возможным разбить на два компонента так как обязательно обоим делать селект из базы..я так думаю..попробывать как ты говоришь, я просто создам полную копию первому квери..ведь что бы поставить второй квери в активную позицию выбивает ошибку ,что надо запрос в свойствах заполнить.
|
|
#6
|
|||
|
|||
|
Зачем обоим выполнять выборку? Вроде как один квери справлялся до этого. Просто смысл в том, что отображение данных из базы должен выполнять один компонент, а внесение данных - другой. Можно, конечно, все реализовать на базе одного компонента, но в этом случае перед выполнением ExecSQL отключить датасорс, а после выполнения - заново отфильтровать данные из базы и включить датасорс.
Проблема скорее всего кроется в том, что один компонент не может не сбивая фильтр производить изменения в базе данных. |
|
#7
|
|||
|
|||
|
Посмотри как это делает программа 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
|
|||
|
|||
|
Цитата:
Что мне в это свойство вписать ?Оно .как я понял не может быть пустым...в первом в свойстве стоит выбор данных из бд..а во второй что вписать в это свойство? |
|
#9
|
|||
|
|||
|
Цитата:
|
|
#10
|
|||
|
|||
|
Через второй квери ,который в пасивном положении и который только вносит данные ни че не может сделать..ошибка та же закрытый дата сет..
Последний раз редактировалось Booo, 25.06.2009 в 00:58. |
|
#11
|
|||
|
|||
|
Попробуйте создать новый проект, накидать на форму ADOConnection, 2 ADOQuery, DataSource и DBTable (точно не помню, я отображение данных вручную делаю через стандартные компоненты.)
Далее создайте простую базу данных и заполните парой тройкой записей. И уже на новом проекте реализуйте отображение с помощью первого квери и изменения с помощью второго. Я в свою очередь дома тоже попробую (если не забуду , но это уже будет не ранее 20 часов ) |
|
#12
|
|||
|
|||
|
Прикладываю пример, где у меня ошибок не возникает. Среда разработки 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Последний раз редактировалось PiboDIE, 25.06.2009 в 20:11. |
|
#13
|
|||
|
|||
|
В принципе все эти телодвижения можно выполнять имея всего 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
|
|||
|
|||
|
Спасибо за старания ..но проект твой незапустился =(ошибку выбивает ..это не суть .Мне обязательно надо два едита ,где в первом вбивается ид о пользователе,а во втором фио..если это новый пользователь то ид и фио внесуться в бд ,как новая запись..если хотим обновить инфу о пользователе,то в первыи едит вбиваем ид того пользователя ,кого хотим апдейтнуть, а в фио новое фио(которое соответственно обновит старое фио) ...ну в общем я попробую по твоему последнему посту ..спасибо за старания...только проект , не запустился..сижу и так тока ночью ,времени нету,поробую то что ты написал потом скажу что получилось))
|
|
#15
|
|||
|
|||
|
АААААА ФАКИНГ ШИТ ЗЕ БЕСТ!!!PibODie Thank you very much ..я должен те телку с большими сиськами !!!!Спасибо спасибо!!
|