Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Начинаю работать с ADO 
:(
    Опции темы
Sliva
Дата 7.2.2008, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Добрый день! Я пробую работать с компонентами вкладки ADO для бд Access. 
Скажите пожалуйста, с чего начать? С чем связывать DBGrid и TDataSet и что прописывать в ADOConnection?
 smile 
До этого я использовала компоненты TQuery, TTable. В чем отличие? 
PM   Вверх
Rodman
Дата 7.2.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122



разбери. а если че то не понятно - спрашивай
PM MAIL WWW Skype GTalk YIM MSN   Вверх
Savek
Дата 7.2.2008, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 355
Регистрация: 10.4.2006
Где: Воронеж

Репутация: 7
Всего: 7



Если нет литературы, посмотри хотя бы что в гугле есть справка ADO
PM MAIL   Вверх
Exai1e
Дата 7.2.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 908
Регистрация: 3.12.2006
Где: Moscow

Репутация: нет
Всего: 30



Цитата

Работаете с базами данных? Забыли как правильно прописать connection string к вашей базе?
Специальный сайт-справочник-шпаргалка созданный как раз для такого случая:
http://www.connectionstrings.com/

© Delphilab.ru


Это сообщение отредактировал(а) Exai1e - 7.2.2008, 20:57


--------------------
"Решение зависит от выбранного геморроя" © Snowy
"у нас как в армии - либо работает, либо так и задумано"
PM MAIL ICQ   Вверх
Данкинг
Дата 7.2.2008, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Код

procedure TForm1.FormCreate(Sender: TObject);
var p,pp:string;
 
begin
p:=extractfilepath(application.ExeName)+'\sidi.mdb';
pp:='Provider=Microsoft.Jet.OLEDB.4.0;Data Source='+p+';Persist Security Info=False';
conn.ConnectionString:=pp;
conn.Connected:=true;
ado1.TableName :='spisok';
ado2.TableName :='infa';
ado3.TableName :='disks';
ado1.Active:=true;
ado2.Active:=true;
ado3.Active:=true;
end;



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
belousov
Дата 7.2.2008, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 317
Регистрация: 21.11.2006
Где: Москва

Репутация: нет
Всего: 6



а еще можно создать к проекту файл типа DataModule и все эти блоки таблиц и запросов поместить туда, так значительно удобнее


--------------------
NIHIL VERUM EST LICET OMNIA 
PM MAIL WWW ICQ Skype   Вверх
Sliva
Дата 8.2.2008, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



 smile  smile  smile 
На самом деле мне надо по-хорошему в одной программе работать с двумя БД. Одна - Sybase, другая - Access. Из Sybase данные беру и ими надо заполнить таблички в Access. Сначала хотела делать через ADO. Но мне кажется, можно как-то попрще сделать. 
Есть компоненты, которые связывают 2 БД?  smile 
PM   Вверх
Sliva
Дата 10.2.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



 smile 
Какие компоненты мне надо использвать? Подскажите, пожалуйста
PM   Вверх
Данкинг
Дата 10.2.2008, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Куда уж проще, чем ADO?  smile 
Для открытия двух баз нужно два tAdoConnection. Ну и две (как минимум) tAdoTable.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Sliva
Дата 11.2.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Данкинг
Я последовала вашему совету. Все подсоединила, все замечательно. На кнопку поставила 
событие:
Код

DBGrid.DataSet:=DataSet_Access;
ADOTable_Access.Active:=true;

(изначально стояло):
Код

DBGrid.DataSet:=DataSet_Sybase;
ADOTable_Sybase.Active:=true;


А как организовать доступ к извлечению данных из Sybase в Access? 
Я хочу извлекать данные из Sybase и тут же их вставлять в Access, но не знаю как это делать  smile 

PM   Вверх
Данкинг
Дата 11.2.2008, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Конкретно про Sybase ничего сказать не могу, ибо ни разу с ней не работал, но суть в том, что если через ADO подключаешься к какой бы то ни было БД, то остальная работа уже стандартна, т.е.:

Код

ado1.fieldvalues['pole1']:=ado2.fieldvalues['pole2'];



--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Sliva
Дата 11.2.2008, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Данкинг
Надо же как-то цикл организовать? Это в данной ситуации можно сделать вот так:
Код

 ADOQuery.First;
  while not ADOQuery.Eof do
  begin
    .....
     ADOQuery.Next;
  end;


?????

Уточнить  smile 

Код

ado1.fieldvalues['pole1']:=ado2.fieldvalues['pole2'];

В ['pole1'] должно быть имя столбца таблицы Access или поле, которое я сама назвала в ADOTable?

Это сообщение отредактировал(а) Sliva - 11.2.2008, 11:52
PM   Вверх
Данкинг
Дата 11.2.2008, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(Sliva @ 11.2.2008,  11:41)
В ['pole1'] должно быть имя столбца таблицы Access или поле, которое я сама назвала в ADOTable?

А это не одно и то же? smile Название поля - так, как оно называется в исходной таблице, т.е. в данном случае в Access у тебя есть поле, тоже названное pole1.

А проход по датасету я делаю обычно при помощи for, но и так нормально, конечно.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Sliva
Дата 11.2.2008, 12:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Данкинг
Код

ADOQuery.First;
  while not ADOQuery.Eof do
  begin
   ADO_Ac.FieldValues['period_id']:=ADO_Sy.FieldValues['num'];
   ADO_Ac.FieldValues['date_beg']:=ADO_Sy.FieldValues['begdate'];
    ADO_Sy.FieldValues['empl_id']:=ADO_Ac.FieldValues['num'];
     ADOQuery.Next;
  end;

а ошибка такая:
  dataset not edit or insert mod
В цикле надо заполнять insert'ом поля таблицы Access  smile 
а тут присваивание
PM   Вверх
Данкинг
Дата 11.2.2008, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(Sliva @ 11.2.2008,  12:38)
  dataset not edit or insert mod

Ну да, разумеется. Перед добавлением данным делаем:

Код

ado.append;


(именно для добавления новой записи). А для изменения уже существующей пишем:

Код

ado.edit;


(перед этим встав на нужную строку таблицы). В конце же (как после append, так и после edit) для внесения изменений в таблицу пишем:

Код

ado.post;


Только зачем ты в запросе меняешь данные? Может быть, так тоже будет работать, но я всегда меняю в самой таблице (т.е. tAdoTable), а не в запросе.


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Sliva
Дата 11.2.2008, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



СПАСИБО! 
Посмотрите, пожалуйста, что я делаю не так:
Код

DS_Sy.DataSet:=ADOQuery;
ADOQuery.SQL.Text:='SELECT * FROM Dannie where id='+IntToStr(id);
ADOQuery.Open; 
// в query выбираю последний id таблицы Dannie, чтобы вставить по порядку
 max:=Query1Max.Value;

ADO_Sybase.First;

while not ADO_Sybase.EOF
do begin
    ADO_Access.Append;
    ADO_Access.FieldValues['period_id'].AsInteger := max; 
    ADO_Access.FieldValues['begDate'].AsString := ADO_Sybase.FieldValues['Date_Beg'].AsString;
    ADO_Access.FieldValues['endDate'].AsString := '01.01.2000';
    ADO_Access.FieldValues['post'].AsString := ADO_Sybase.FieldValues['NamePodr'].AsString;
    ADO_Access.FieldValues['list1_2'].AsVariant := 'nnn';
    ADO_Access.FieldValues['rate'].AsInteger := max;
    ADO_Access.FieldValues['empl_id'].AsInteger := max;
    ADO_Access.FieldValues['comment'].AsString := 'comment';
    ADO_Access.Post;
    ADO_Sybase.Next;
  end;

 smile  Ошибка такая:
Cannot perfom this operation on closed dataset.
Наверное из-за того, что я открываю Query с DataSet, а работаю с ADO_Sybase и ADO_Access - а они компоненты TADOTable 
А как мне тогда запросы писать в TADOTable - я не знаю. Пробовала только с TQuery

Дело в том, что запрос обязательно мне делать с параметром:
Код

'SELECT * FROM Dannie where id='+IntToStr(id);

Эта строчка  обязательна. 
От Cannot perfom this operation on closed dataset.
я избавилась - поставила ADO_Ac.Activ=true, но теперь другая ошибка:
Код

 ADO_Ac.FieldValues['period_id'].AsInteger := max;

на этой строке выдает ошибку:
Invalid Variant Operation

Это сообщение отредактировал(а) Sliva - 11.2.2008, 15:48
PM   Вверх
Данкинг
Дата 11.2.2008, 19:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



ADO_Access.open есть?

Добавлено @ 19:34
Цитата(Sliva @ 11.2.2008,  15:29)
на этой строке выдает ошибку:
Invalid Variant Operation

Типы совпадают? Пустые строки есть?

А в adotable запросы писать не надо, это компонент для работы с таблицами. А вот если нужно сделать запрос - выборку и т.п., тогда уже нужен adoquery.

Это сообщение отредактировал(а) Данкинг - 11.2.2008, 19:35


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Sliva
Дата 12.2.2008, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Данкинг
с типами я разобралась - написала 
Код

 ADOQueryAccess.FieldValues['period_id'] := max;
    ADOQueryAccess.FieldValues['begDate'] := ADOQuerySybase.FieldValues['Date_Beg'];

т.е. раньше использовала TAdoTable, а исправила на TAdoQuery. 

У меня теперь немного другая проблема  smile 
Я добавляю данные в одну таблицу Access, а она связана с 3-мя другими. Я сделала 4 adoQuery, 4 ado connection для подключения к каждой таблице Access. (Может, нужно везде использовать одно adoConnection? ) 
И потом 
4 раза написала 
Код

Ado1Query.open; // таблица 1
Ado2Query.open; // табл. 2
Ado3Query.open; // табл. 3
Ado4Query.open;  // табл.4

потом пишу
Код

while not ADOQuerySYBASE.EOF  do
  begin
  ...  
end;

делаю Append каждого Ado1Query для Access и пополняю каждую таблицу, которая связана с данной, НО возникает такая ошибка:
Field privilege_id cannot be modified
Т.е. нельзя добавлять первичный ключ. А почему? Хотя таблицы БД пустые! 
PM   Вверх
Sliva
Дата 12.2.2008, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



Я нашла почему так! На поле, на котором вылетает программа, в свойствах стоит ReadOnly=true

 smile 

Сейчас еще разбираюсь. Наверное, вопросы будут еще  smile  

PM   Вверх
Sliva
Дата 12.2.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 185
Регистрация: 4.5.2006

Репутация: нет
Всего: нет



 smile  smile  smile 
Это кошмар какой-то! Снова ошибка! Вот теперь и не знаю что делать совсем. ПОМОГИТЕ РАЗОБРАТЬСЯ, ПОЖАЛУЙСТА!!!!
Код

ADOQuery.SQL.Text:='SELECT * FROM Dannie where id='+IntToStr(podr);

ADOQuerySybase.Open; // БЕРУ ДАННЫЕ ОТСЮДА
ADOQueryAccess.Open; // ОСНОВНАЯ ТАБЛИЦА В ACCESS, кот. мне надо заполнить
{
//выбираю последний id  для вставки след. номера
 query1.SQL.Text:='select Max(period_id) as MaxId from WorkPeriod;';
 Query1.Open;
 maxPeriod:=Query1MaxId.Value;

//выбираю последний id  для вставки след. номера
 query2.SQL.Text:='select Max(privBasis_id) as MaxId from Privilege';
 query2.Open;
 maxPriv:=Query2MaxId.Value;

//выбираю последний id  для вставки след. номера
 query3.SQL.Text:='select Max(position_id)as maxId from List;';
 query3.ExecSQL;
 maxPos:=query3maxId.Value;
//  след. номер
  maxPeriod:=maxPeriod+1;
  maxPriv:=maxPriv+1;
  maxPos:=maxPos+1;
}
 k1:=0;
 k2:=0;
 k3:=0;
try
   ADOQueryAccess.Active:=true;
// доп. таблицы, кот-е связаны с основной по id
   ADO_Access1.Open; 
   ADO_Access2.Open;

   ADOQuerySybase.First;
  while not ADOQuery.EOF  do
    begin
    k1:=k1+1; // поскольку таблицы пустые, то заполняю их с 1номера
    k2:=k2+1;
    k3:=k3+1;
     
  ADOQueryAccess.Append;
      ADO_Access1.Append;
      ADO_Access2.Append;

      ADO_Access1.FieldValues['privBasis_id']:=k2;
      ADO_Access1.FieldValues['name']:=ADOQuerySybase.FieldValues['Os'];
      ADO_Access1.FieldValues['position_id']:=1;
      ADO_Access1.FieldValues['period_id']:=k1;

      ADO_Access2.FieldValues['Position_id']:=k3;
      ADO_Access2.FieldValues['begDate'] := ADOQuerySybase.FieldValues['Date_Beg'];
      ADO_Access2.FieldValues['endDate'] := '01.01.2000';
      ADO_Access2.FieldValues['changeType']:='Type';
      ADO_Access2.FieldValues['checkStatus']:='Status';
      ADO_Access2.FieldValues['profession']:= ADOQuerySybase.FieldValues['NamePodr'];
      ADO_Access2.FieldValues['discription']:='description';
      ADO_Access2.FieldValues['list1_2']:='list12';
      ADO_Access2.FieldValues['docs']:='docs';
      ADO_Access2.FieldValues['fact']:=1;
      ADO_Access2.FieldValues['staff']:=1;
      ADO_Access2.FieldValues['subdiv_id']:=1;
      ADO_Access2.FieldValues['okpdtr']:=ADOQuerySybase.FieldValues['NamePodr'];

      ADOQueryAccess.FieldValues['period_id'] := k1;
      ADOQueryAccess.FieldValues['begDate'] := ADOQuerySybase.FieldValues['Date_Beg'];
      ADOQueryAccess.FieldValues['endDate'] := '01.01.2000';
      ADOQueryAccess.FieldValues['post'] := ADOQuerySybase.FieldValues['NamePodr'];
      ADOQueryAccess.FieldValues['post_staff'] := ADOQuerySybase.FieldValues['NamePodr'];
      ADOQueryAccess.FieldValues['list1_2'] := 'nnn';
      ADOQueryAccess.FieldValues['rate'] := 2;
      ADOQueryAccess.FieldValues['hours'] := 24;
      ADOQueryAccess.FieldValues['empl_id'] := k2;
      ADOQueryAccess.FieldValues['stagCalcBasis'] := 'ggg';
      ADOQueryAccess.FieldValues['comment'] := 'comment';

      ADO_Access1.Post;
      ADO_Access2.Post;
      ADOQueryAccess.Post;
      ADOQuerySybase.Next;
    end;
 except

      ShowMessage('Такая запись уже есть!')

end;

ОШИБКА:
class EOleException with message: Изменения не были успешно внесены из-за повторяющихся значений в индексе, ключевых полях или связяхю Измените данные в полях, содержащих повторяющиеся значения, удалите индекс или переопределите его, чтобы разрешить повторяющиеся значения

Что делать с этим?  smile  smile  smile 
PM   Вверх
Rodman
Дата 12.2.2008, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


Профиль
Группа: Участник
Сообщений: 6144
Регистрация: 7.5.2006
Где: Ukraine ⇛ Kyiv ci ty

Репутация: 22
Всего: 122




M
Rodman
Модератор: Пожалуйста, один топик - один вопрос.

PM MAIL WWW Skype GTalk YIM MSN   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.1174 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.