![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Модификация записей в Access с помощью Delphi
Первокурсница © (2010-09-16 20:59:00)Доброго времени суток!
Задали на самостоятельное изучение тему "Как с помощью программы Delphi добавлять, удалять и редактировать записи в таблице Access".
Написала программу, следуя указаниям методички, она должна соответственно добавлять, удалять и редактировать записи.
Но возникло 2 проблемы:
- Программа не редактирует записи, только удаляет и добавляет нормально
- После нажатия кнопок "Добавить" или "Удалить" DBGrid1 на форме очищается, а этого быть не должно, нужно чтобы добавленные/удалённые/изменённые записи сразу же отображались на DBGrid1, без перезапуска программы.
вот код:
unit LAB3;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, DBGrids, DB, ADODB, StdCtrls;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Button1: TButton;
DBGrid1: TDBGrid;
Button2: TButton;
Button3: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
procedure DBGrid1CellClick(Column: TColumn);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
X: integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); {Добавление записей}
begin
ADOQuery1.Active:=false;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO Таблица1');
ADOQuery1.SQL.Add('(TovarName,Price,Sklad)');
ADOQuery1.SQL.Add('VALUES("'+ Edit1.Text +'",'+Edit2.Text+','+ Edit3.Text+')');
ADOQuery1.ExecSQL;
end;
procedure TForm1.DBGrid1CellClick(Column: TColumn);
begin
X:=DataSource1.DataSet.FieldByName('IDCode').AsInteger;
end;
procedure TForm1.Button2Click(Sender: TObject); {Удаление записей}
begin
ADOQuery1.Active:=false;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('DELETE FROM Таблица1');
ADOQuery1.SQL.Add('WHERE IDCode='+ IntToStr(X));
ADOQuery1.ExecSQL;
end;
procedure TForm1.Button3Click(Sender: TObject); {Редактирование записей}
begin
ADOQuery1.Active:=false;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('UPDATE Таблица1');
ADOQuery1.SQL.Add('SET TovarName='+'"'+ Edit1.Text+'"'+
',Price='+Edit2.Text+
',Sklad='+Edit3.Text);
ADOQuery1.SQL.Add('WHERE IDCode='+IntToStr(X));
ADOQuery1.ExecSQL;
end;
end.
Помогите кто чем может! :(
И. Павел (2010-09-17 11:07:00) [41]> SQL.Add - этим грешат только ламеры
Этим грешат те, кто не знает о предварительном парсинге запроса и по каким-то причинам использует Add (например, при динамической генерации запроса по частям, или просто так нравится - ведь метод открыт, значит должен работать).
Ega23 (2010-09-17 11:04:00) [42]
> то предполагается, что вы болжны понимать:
Для тех кто в танке: SQL.Add - этим грешат только ламеры и Влад Ошин баловаться любил ещё.
Есть SQL.Text, как у любого TStrings.
12 (2010-09-17 11:03:00) [43]
> Это что ж за методички с такими рекомендациями?
+ А нафига делать сначала SQL.Clear, потом SQL.Add несколько раз, если можно сразу SQL.Text := ....
сплошь и рядом..
у меня приличная БД скопилась подобных проектов, пока первокам решал лабы по их методичкам(когда работы не было другой)
поначалу писал было нормально (ну, относительно :))
стали заворачивать, появлялись претензии от лаборантов - от "неправильно", до "не сам писал"
а мне это надо - еще и объяснить каждому в 51й раз, что это такое написано..
Чувачок написал методичку, она была утверждена, преподает по ней.
Еще пару напечатает - зп повысят, за методологическую работу.
И тут один умный нашелся..
У нас в области все как один любят губера, и губер тоже нормально относится. Вы поймите, пока мы договаривались много наших полегло..
И тут такие вы: " Голосуйте за ИванИваныча, Голосуйте за ИванИваныча.."
И народ в такой ситуации может что угодно сделать, а зачем нам бунт, безжалостный и беспощадный?
И. Павел (2010-09-17 11:01:00) [44]Если вы с уверенностью пишете пишете:
> А какие-такие ошибки могут возникнуть при использовании
> ADODataSet и ADOCommand действительно лучше использовать. Но совершенно по другой причине.
И считаете себя:
> это не для Начинающих
то предполагается, что вы болжны понимать:
> А какие-такие ошибки могут возникнуть при использовании
> SQL.Add?
Ошибки связаны с парсированием только части запроса - этот вопрос обсуждался тут раньше, да и на delphikingdom всплывал. А метод Add провоцирует пользователя вводить запрос по частям.
Ega23 (2010-09-17 10:55:00) [45]
> Лучше использовать ADODataSet и ADOCommand, т.к. с ADOQuery1
> можно получить странные ошибки: например при использовании
> SQL.Add.
1. ADODataSet и ADOCommand действительно лучше использовать. Но совершенно по другой причине. По какой - добро пожаловать в Базы и там понесётся, это не для Начинающих.
2. А какие-такие ошибки могут возникнуть при использовании SQL.Add?
3. А нафига делать сначала SQL.Clear, потом SQL.Add несколько раз, если можно сразу SQL.Text := .... ?
Плохиш (2010-09-17 10:47:00) [46]
> ADOQuery1.Active:=false;
> ADOQuery1.Close;
>
Масло маслянное.
Это что ж за методички с такими рекомендациями?
12 (2010-09-17 10:18:00) [47]не,
> Написала программу, следуя указаниям методички,
думаешь возможно возможного автора ткнуть носом и получить нормальную оценку?
:)
Anatoly Podgoretsky (2010-09-17 10:14:00) [48]> 12 (17.09.2010 10:12:02) [2]
AdoDataset + параметры
12 (2010-09-17 10:12:00) [49]> Скорее всего, DBGrid1 связан с ADOQuery1,
да 100 пудов, других не объявлено
procedure TForm1.Button1Click(Sender: TObject); {Добавление записей}
var
s:string;
begin
s:= ADOQuery1.sql.text;
ADOQuery1.Active:=false;
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('INSERT INTO Таблица1');
ADOQuery1.SQL.Add('(TovarName,Price,Sklad)');
ADOQuery1.SQL.Add('VALUES("'+ Edit1.Text +'",'+Edit2.Text+','+ Edit3.Text+')');
ADOQuery1.ExecSQL;
ADOQuery1.sql.text := s;
ADOQuery1.open;
end;
и т.д.
И. Павел (2010-09-17 09:52:00) [50]> DBGrid1 на форме очищается
Скорее всего, DBGrid1 связан с ADOQuery1, а при Active := false вы закрываете выборку. Потом делаете запросы INSERT/DELETE/UPDATE. Значит, после этого вам нужно снова открыть выборку:
ADOQuery1.Active := false;
ADOQuery1.SQL.Text := 'SELECT * FROM Таблица1';
ADOQuery1.Open;
PS:
Лучше не использовать русские имена таблиц и полей.
При передаче текстовых (да и других не целых) величин в запрос лучше использовать параметры.
Лучше использовать ADODataSet и ADOCommand, т.к. с ADOQuery1 можно получить странные ошибки: например при использовании SQL.Add.