Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2010, 13:29   #1
Explosion
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 50
Вопрос ADOQuery, добавление в таблицу.

Темa: ADOQuery, добавление в таблицу.

Здраствуйте, я только учуся прогать, очень прошу помочь с добавлением в таблицу через компоненты ADO.

Чтоб все вопросы отпали:
- БД пишется на SQL Managment Studio 2005;
- Приложение в Delphi 7;
- Связывал базу и приложение через комопоненты ADO;
- Все ADO компоненты содержатся на DataModule;
- Таблицы привязаны с DataSet'ами;
- Имеются DataSource для связи с ADOQuery;
- Имя полей таблицы, в которую добавляются данные: "PK_Brand" (это первичный ключ, тип integer, свойство identity - yes)
и "Brand"(тип varchar)
- На форме Form1 содержится DBGrid который привязан к датасурсу таблицы бренд, а также содержится edit.

Итак на одной из форм на событие "нажатие" кнопки написал такой код для добавление в таблицу:

Код:
procedure TFormBrand.Button1Click(Sender: TObject);
begin
with datamodule2 do
  begin
    ADOQueryBrandAdd.Close
    ADOQueryBrandAdd.SQL.Clear;
    ADOQueryBrandAdd.SQL.Add('insert into Brand (brand) values (___)');
    ADOQueryBrandAdd.Open;
    ADOQueryBrandAdd.EnableControls;
    ADOQueryBrandAdd.Active:=true;
  end;
end;

end.
Мне нужно там, где прочерк в value добавить значение из Edit1.text.
Если вы предложите использование параметра пожалуйста привидите пример кода и
как этим параметром вообще пользоватся...

Если бы пользовался компонентами BDE то код выглядел следующим бы образом думаю:

Код:
procedure TFormBrand.Button1Click(Sender: TObject);
begin
with datamodule2 do
  begin
    QueryBrandAdd.Close
    QueryBrandAdd.SQL.Clear;
    QueryBrandAdd.ParamByName('ParamBrand').AsString:=Edit1.Text;
    QueryBrandAdd.SQL.Add('insert into Brand (brand) values (:ParamBrand)');
    QueryBrandAdd.Open;
    QueryBrandAdd.EnableControls;
    QueryBrandAdd.Active:=true;
  end;
end;
А с АДО компонентами как эт провернуть?

Последний раз редактировалось Stilet; 04.03.2010 в 14:16.
Explosion вне форума Ответить с цитированием
Старый 04.03.2010, 15:40   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

1) запомните.
Если получаете данные из запроса, делаете ему .Open
если же изменяете данные (Insert / Delete / update )
То выполняете ВашdataSet.ExecSQL;

2) никаких хитростей в ADO нет!
можете поступать ТОЧНО так же, как Вы поступали с DBE (только обращение к параметрам идёт через коллекцию .Parameters)
примерно так:
Код:
    QueryBrandAdd.SQL.Clear;
    QueryBrandAdd.SQL.Add('insert into Brand (brand) values (:ParamBrand)');
    QueryBrandAdd.Parameters.ParamByName('ParamBrand').AsString:=Edit1.Text;
    QueryBrandAdd.ExecSQL;

Последний раз редактировалось Serge_Bliznykov; 04.03.2010 в 15:43.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 05.03.2010, 10:49   #3
Explosion
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 50
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
1) запомните.
Если получаете данные из запроса, делаете ему .Open
если же изменяете данные (Insert / Delete / update )
То выполняете ВашdataSet.ExecSQL;
Спасибо большое за разъяснение! Теперь буду использовать open и ExecSQL к месту и по назначению =)

Такой вопрос, в коллекции parametrs выбираем ParamByName, а дальше типы не выбираются... После точки нет AsString, AsInteger и т.д. И когда пробую в ручном порядке набить, то выдается ошибка, в которой говорится мол левая часть кода не может связаться с правой.

Полазил по форуму, где-то использовали Value, вроде работает:
Код:
ADOQueryBrandAdd.Parameters.ParamByName('ParamBrand').Value:=Edit1.Text;
Сейчас такая проблема, в первый раз запись добавляется, но стоит еще раз нажать на кнопку выпадается ошибка такого характера: "Project такой-то raised exception class EDatabaseError with massage:'ADOQueryBrandAdd: Parametr ParamBrand not found'."
Параметр не найден =\

И еще такой вопрос, как обновить записи в DBGrid?

На данный момент код выглядит так:
Код:
procedure TFormBrand.Button1Click(Sender: TObject);
begin
    ADOQueryBrandAdd.DisableControls;
    ADOQueryBrandAdd.Close
    ADOQueryBrandAdd.SQL.Clear;
    ADOQueryBrandAdd.Parametrs.ParamByName('ParamBrand').Value:=Edit1.Text;
    ADOQueryBrandAdd.SQL.Add('insert into Brand (brand) values (:ParamBrand)');
    ADOQueryBrandAdd.ExecSQL;
    ADOQueryBrandAdd.EnableControls;
end;

end.
Подскажите пожалуйста на первый взгляд чего не хватает чтоб избежать данной ошибки и чего не хватает для обновления дбгрида на форме?

Последний раз редактировалось Explosion; 05.03.2010 в 12:20.
Explosion вне форума Ответить с цитированием
Старый 05.03.2010, 14:09   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вы не обратили внимание, а я ведь в своём примере (пост #2) не зря, сначала задал текст запроса,
а потом уже задавал параметер!!!
Это это важно! (удивительно, как у Вас первый раз срабатывает ))

Код:
    ADOQueryBrandAdd.SQL.Clear;
    ADOQueryBrandAdd.SQL.Add('insert into Brand (brand) values (:ParamBrand)');
    ADOQueryBrandAdd.Parametrs.ParamByName('ParamBrand').Value:=Edit1.Text;
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.03.2010, 09:33   #5
Explosion
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 50
По умолчанию

Serge_Bliznykov, спасибо вам за помощь =-) Надеюсь эта тема поможет не только мне.
И все-таки логику я так и не уловил... Почему мы используем параметр, у которого еще не определено значение, в тексте запроса и только после текста запроса присваиваем значение параметру? Я просто наверно "параметр" не правильно представляю в голове, для меня это как переменная, которую используют в запросах, а ведь если это переменная то ее нельзя использовать в выражениях предварительно не присвоив значения.

P.S. ДБГрид обновлятся ни в какую не хочет =[

Последний раз редактировалось Explosion; 10.03.2010 в 10:03.
Explosion вне форума Ответить с цитированием
Старый 18.03.2010, 12:06   #6
Explosion
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 50
По умолчанию

Если кому-то это в будущем поможет, то чтоб обновить ДБГрид надо было отсоединится от таблицы и снова присоединится, то есть в моем случае тупо:
Код:
DataSet.Active:=False;
DataSet.Active:=True;
Explosion вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
добавление записей в таблицу MDmitry PHP 3 27.12.2009 11:08
Добавление данных в таблицу. Hobbit_88 БД в Delphi 11 06.06.2009 13:52
Добавление даты в таблицу smoky Microsoft Office Access 5 24.11.2008 12:56
Дбавление в таблицу из запроса ADOQuery. VladimirAleks БД в Delphi 2 12.09.2007 13:49
добавление записей в таблицу strannik БД в Delphi 5 10.05.2007 08:12