Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Никак не могу найти пример работы с ADO


Автор: Gunslinger 11.1.2009, 14:29
В гугле нашел примеры только под vb, net и делфи. С базами никогда до этого не сталкивался. Где есть инфа по описанию, как работать с ADO? Какой день уже с ним морочаюсь.
Почитал здесь, оказывается, для чтения, записи, модификации нужно различные параметры прописывать.
из компоентов кинул: ADOConnection, ADOQuery
для примера база: отдельный дбф на пару полей id - автоинкрементное, name, fam - строковые.
нужно читать-писать-модифицировать, + возможность изменять путь к дбф (из меню в самой проге).

Автор: Rodman 11.1.2009, 21:44
Лови http://forum.vingrad.ru/index.php?show_type=forum&showtopic=174138&kw=%D0%BF%D1%80%D0%BE%D1%81%D1%82%D0%B5%D0%B9%D1%88%D0%B8%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B1%D0%B0%D0%B7%D0%BE%D0%B9...
Он тоже на делфи.. по сути все точки на стрелочки поменять надо...

а остальные методы описаны...

задавай вопросы по ним...

Автор: Данкинг 11.1.2009, 23:45
Цитата(Gunslinger @  11.1.2009,  14:29 Найти цитируемый пост)
делфи

И в чём разница с Билдером? smile 

Цитата(Gunslinger @  11.1.2009,  14:29 Найти цитируемый пост)
писать-модифицировать

С dbf сиё возможно только запросами, т.е. AdoTable.Edit....AdoTable.Post не прокатит.

Автор: Gunslinger 12.1.2009, 09:55
Цитата(Rodman @  11.1.2009,  21:44 Найти цитируемый пост)
Лови пример...

поймал, но...
 
Цитата(Данкинг @  11.1.2009,  23:45 Найти цитируемый пост)
С dbf сиё возможно только запросами, т.е. AdoTable.Edit....AdoTable.Post не прокатит. 

мне друг как-то код набросал:
Код

  ADOQuery1->Insert();
   ADOQuery1NAME->Value="Серега"; 
  ADOQuery1FAM->Value="Иванов";
  ADOQuery1DATE->Value=StrToDateDef("d/m/y", Date());

только через драйвер джетовский под аксесс работал. Я сделал также, но под vfp-драйвер - не работает. 
Так каким образом можно с рботать с dbf?

Автор: Данкинг 12.1.2009, 11:43
Цитата(Gunslinger @  12.1.2009,  09:55 Найти цитируемый пост)
Так каким образом можно с рботать с dbf? 

Я же говорю - запросами. Update, Insert.

Автор: Gunslinger 12.1.2009, 12:24
Цитата(Данкинг @  12.1.2009,  11:43 Найти цитируемый пост)
Я же говорю - запросами. Update, Insert

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

Автор: Данкинг 12.1.2009, 12:30
Цитата(Gunslinger @  12.1.2009,  12:24 Найти цитируемый пост)
в свойство sql ADOQuery?

Угу.

Цитата(Gunslinger @  12.1.2009,  12:24 Найти цитируемый пост)
Но я там написал селект на всю таблицу, чтобы в квери все поля добавить можно было.

В данном случае удобнее было бы использовать AdoTable для отображения данных таблицы. А так - ну да, вторую кверю заюзай. smile Или же сначала добавь поля, а потом уже делай select...

Автор: Gunslinger 12.1.2009, 13:09
Цитата(Данкинг @  12.1.2009,  12:30 Найти цитируемый пост)
Или же сначала добавь поля, а потом уже делай select...

если ты про Add all fields, то без зпаписи селекта в sql ADOConnection'а выводится сообщение об ошибки проперти sql... 
Ладно, буду на каждый запрос свою квери делать со своей sql. Тогда:
1. В чем разница, если писать запрос в проперть или в коде, как у Rodman'a? Ты говорил, что с dbf'ами нужно запросами. Получается, такое разнообразие потому, что ADO - компонент для работы с различными бд, из-за его универсальности?
2. Как в sql-коде указать переменную программы, которую нужно записать?

Автор: Данкинг 12.1.2009, 23:05
Цитата(Gunslinger @  12.1.2009,  13:09 Найти цитируемый пост)
1. В чем разница, если писать запрос в проперть или в коде, как у Rodman'a? 

А как там у него? Пример качать неохота. smile В любом случае, в .sql.text пишется запрос, а как ещё-то можно.

Цитата(Gunslinger @  12.1.2009,  13:09 Найти цитируемый пост)
Как в sql-коде указать переменную программы, которую нужно записать? 

Через параметры логичней всего.

Код

AdoQuery.Close;
AdoQuery.SQL.Clear;
AdoQuery.SQL.Add('insert into TABLE values(:par1, :par2)');
AdoQuery.Parameters.ParamByName('par1').Value:='aaaa';
AdoQuery.Parameters.ParamByName('par2').Value:='bbbb';

Автор: Gunslinger 13.1.2009, 11:27
Цитата(Данкинг @  12.1.2009,  23:05 Найти цитируемый пост)
Через параметры логичней всего.

AdoQuery.Close;
AdoQuery.SQL.Clear;
AdoQuery.SQL.Add('insert into TABLE values(:par1, :par2)');
AdoQuery.Parameters.ParamByName('par1').Value:='aaaa';
AdoQuery.Parameters.ParamByName('par2').Value:='bbbb';


Вот, такой код у него. 
Попробовал - в таблицу ничего не добавляется:
Код

ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("insert into MAIN values(:Name, :Fam)");
ADOQuery1->Parameters->ParamByName("Name")->Value="aaaa";
ADOQuery1->Parameters->ParamByName("Fam")->Value="bbbb";

Таблица Main.dbf; 
Поля: id (автоинк), Name (чар), Fam(чар).
Компоненты: ADOConnection (тест подключения проходит), ADOQuery (в проперти параметры видт названия полей; проперть SQL пустая).
Смотрю через фокс.

--------------
в проперти параметров квери названия полей пропали. можно добавить только цифры: 0, 1,2, ...

Автор: Данкинг 14.1.2009, 01:07
Цитата(Gunslinger @  13.1.2009,  11:27 Найти цитируемый пост)
Попробовал - в таблицу ничего не добавляется:

А ADOQuery1->ExecSQL сделал, надеюсь?

Автор: Gunslinger 14.1.2009, 09:36
Цитата(Данкинг @  14.1.2009,  01:07 Найти цитируемый пост)
А ADOQuery1->ExecSQL сделал, надеюсь?

Неаsmile По поиску смотрел - была тема, где эта команда проскакивала. Но я тогда прогнал. Сейчас:
Код

ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("insert into MAIN values(:Name, :Fam)");
ADOQuery1->Parameters->ParamByName("Name")->Value="aaaa";
ADOQuery1->Parameters->ParamByName("Fam")->Value="bbbb";
ADOQuery1->ExecSQL

В проперти параметерс квери создал две переменные с именами Name и Fam - те поля таблицы, куда запись будет. Первый раз строка добавилась, на второй раз вылезла ошибка: Неправильно определен объект Parameter. Предоставлены несовместимые типы или неполные сведения. 


Автор: Данкинг 14.1.2009, 11:47
Цитата(Gunslinger @  14.1.2009,  09:36 Найти цитируемый пост)
В проперти параметерс квери создал две переменные с именами Name и Fam - те поля таблицы, куда запись будет.

А зачем в проперти смамой квери что-то писать? Достаточно параметры указать в самом коде, т.е. как в примере.

Автор: Gunslinger 14.1.2009, 12:26
Цитата(Данкинг @  14.1.2009,  11:47 Найти цитируемый пост)
А зачем в проперти смамой квери что-то писать?

он такую ошибку выдавал - вот я и написал. Сейчас в проперти все стер - все равно такую ошибку пишет. Подсвечивает синим закрывающую скобку обработика нажатия кнопки, куда поместл код - как раз за ADOQuery1->ExecSQL();

Автор: Данкинг 14.1.2009, 13:55
Цитата(Gunslinger @  14.1.2009,  12:26 Найти цитируемый пост)
Сейчас в проперти все стер - все равно такую ошибку пишет. 

Не знаю тогда, я всё так же пишу, и работает. Попробуй на самом фоксе те же данные ввести.

Автор: Gunslinger 14.1.2009, 17:30
Цитата(Данкинг @  14.1.2009,  13:55 Найти цитируемый пост)
Не знаю тогда, я всё так же пишу, и работает. Попробуй на самом фоксе те же данные ввести. 

с фокса нормально вводятся. Если бы вообще не вставлялось, а тут один раз делает инсерт - и все, дальше ошибка. Раз работает, скорее всего я настройки компонентов неправильно сделал... Либо с драйвером проблема, но не думаю. 

Автор: Данкинг 14.1.2009, 17:52
А строка подключения какая?

Автор: Gunslinger 15.1.2009, 09:14
Привет! Строка подключения: 
Код

Provider=VFPOLEDB.1;Data Source=D:\MY_PROGRAM;Mode=Share Deny None;
Extended Properties="";User ID="";Password="";Mask Password=False;
Cache Authentication=False;Encrypt Password=False;Collating Sequence=MACHINE;DSN=""

Из компонентов на форме: ADOConnection, ADOQuery.
Выставил в проперти ADOConnection Connected=true, проперть Mode выставилась в: cmShareDenyNone

Автор: Данкинг 15.1.2009, 11:52
У меня строка подключения всегда короче, типа такой:

'Provider=VFPOLEDB.1;Data Source=D:\MY_PROGRAM;Password="";Collating Sequence=MACHINE'

Кстати, пробелов в пути к таблице нет?

Автор: Gunslinger 15.1.2009, 15:18
Цитата(Данкинг @  15.1.2009,  11:52 Найти цитируемый пост)

Кстати, пробелов в пути к таблице нет?

нет.
Попробовал твою строку сокращенную - та же песня. Привязался к этому Parameter... Ты в кверях какие свойства настраиваешь (если запрос не в проперти, а в коде)? Вообще "критические" настройки у этих компонентов (кроме строки подключения) есть?

Автор: Данкинг 15.1.2009, 23:38
Цитата(Gunslinger @  15.1.2009,  15:18 Найти цитируемый пост)
Ты в кверях какие свойства настраиваешь

Ничего не настраиваю кроме привязки к AdoConnection... Ну а если в самом запросе вместо параметров написать "aaaa", "bbbb", будет работать?!

Автор: Gunslinger 16.1.2009, 11:34
Сюда я помещал листинг без закомментированной строки
Код

ADOQuery2->SQL->Clear();

, а в коде так:
Код

//ADOQuery1->Close();
ADOQuery1->SQL->Clear(); <---------раскомментировал - заработало
ADOQuery1->SQL->Add("insert into MAIN(Name,Fam) values(:Name, :Fam)");
ADOQuery1->Parameters->ParamByName("Name")->Value="aaaa";
ADOQuery1->Parameters->ParamByName("Fam")->Value="bbbb";
ADOQuery1->ExecSQL();

Извини за шухер. 

Зачем нужен Close()? Это если в связке с Open() - сначала сформировал запрос, затем только открыл соединение?
Теперь про select, delete, update. По прмеру кода Родмана:
Код

ADOQuery2->SQL->Clear();
ADOQuery2->SQL->Add("delete from MAIN where (Name=:Name)");
ADOQuery2->Parameters->ParamByName("Name")->Value="od";
ADOQuery2->ExecSQL();

Ошибки не выдает, но и не удаляет. Сделал через квери1 - так же.

Автор: Gunslinger 20.1.2009, 16:03
Код

{
ADOQuery2->SQL->Clear();
ADOQuery2->SQL->Add("delete from MAIN(Name,Fam) where Name=:Name;");
ADOQuery2->Parameters->ParamByName("Name")->Value="od";
ADOQuery2->ExecSQL();
}


Variable 'NAME' is not found. 

Автор: Rodman 20.1.2009, 21:13
NAME - это зареганное слово
Код

{
ADOQuery2->SQL->Clear();
ADOQuery2->SQL->Add("delete from MAIN where [Name]=:Prm;");
ADOQuery2->Parameters->ParamByName("Prm")->Value="od";
ADOQuery2->ExecSQL();
}
а так?

Автор: Gunslinger 21.1.2009, 09:56
Цитата(Rodman @  20.1.2009,  21:13 Найти цитируемый пост)
а так?

опять про Name кричит. Сменил условие на второе поле, благо табличка тестовая.
Код

ADOQuery2->SQL->Clear();
ADOQuery2->SQL->Add("delete from MAIN where Fam=:Prm;");
ADOQuery2->Parameters->ParamByName("Prm")->Value="bbbb";
ADOQuery2->ExecSQL();
}

Теперь молчит, но не удаляет, хотя в табличке таких записей есть.
Name - зарегина ADO?
В пропертях квери кроме строки подключения к ADOConnection больше ничего указывать не нужно?

Автор: Данкинг 21.1.2009, 11:49
Цитата(Rodman @  20.1.2009,  21:13 Найти цитируемый пост)
NAME - это зареганное слово

Я про это подумал, но не сказал, поскольку фокс и так работает обычно.

Цитата(Gunslinger @  16.1.2009,  11:34 Найти цитируемый пост)
Теперь про select, delete,

По поводу delete: ведь на фоксе "delete from..." только помечает на удаление, а для физического удаления нужно ввести команду "pack". А вот как это сделать запросом через ADO - я так и не выяснил. smile 

Цитата(Gunslinger @  16.1.2009,  11:34 Найти цитируемый пост)
Зачем нужен Close()? 

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

Добавлено через 3 минуты и 32 секунды
Цитата(Gunslinger @  21.1.2009,  09:56 Найти цитируемый пост)
Name - зарегина ADO?

Сколько я с фоксом работаю - проблем с полем NAME никогда не возникало...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)