Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Access, ADO и EOleException 
V
    Опции темы
SkyHawk
  Дата 6.9.2007, 04:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Не понимаю, почему ошибка...

Код

const KolvoCvetov=24;  // максимально возможное количество цветов в таблице цветов
AnsiString Cveta[KolvoCvetov][2];

.
.
.

void __fastcall TForm1::WriteColor()  // функция записи цветов в таблицу базы данных
{
  ADOColor->Open();
  ADOColor->First();
  for(short a=0;a<KolvoCvetov;a++)
  {
    ADOColor->Edit();
    ADOColor->FieldByName("Заявка")->AsString=Cveta[a][0];
    ADOColor->FieldByName("Цвет")->AsString=Cveta[a][1];
    ADOColor->Next();
  }
  ADOColor->Close();



При четвертом выполнении цикла в момент выполнения функции ADOColor->Next() вылетает EOleException "Недостаточные или неполные сведения о ключевом поле. Обновление влияет на слишком большое число строк." Отслеживал пошагово - значения ячеек массива Cveta[a][0] и Cveta[a][1] нормальные - обычный строковый текст длиной не более 10 символов. БД Access, таблица одна 2 столбца*23 записи. В ADOColor выводится по простейшему запросу "select * from tablica". Ключевых и индексных полей в таблице нет. Пишу на Builder 6.

Вроде все идеально. А ошибка все равно вылазит.
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
Rodman
Дата 6.9.2007, 08:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


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

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



В ADOColor вскгда "select * from tablica"???

если в таблицу добавляешь данные то надо юзать INSERT... или я что то упустил?
PM MAIL WWW Skype GTalk YIM MSN   Вверх
SkyHawk
Дата 6.9.2007, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



"select..." в ADOColor всегда. Тем ADOColor и замечателен, что не надо выполнять добавление записей через insert - записи добавляются нормально (у меня несколько других таблиц успешно добавляют записи без запроса insert). А кроме того, я выполняю не вставку, а редактирование таблицы.

Это сообщение отредактировал(а) SkyHawk - 6.9.2007, 08:45
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
Rodman
Дата 6.9.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


CIO
****


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

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



Цитата(SkyHawk @  6.9.2007,  08:44 Найти цитируемый пост)
Тем ADOColor и замечателен, что не надо выполнять добавление записей через insert - записи добавляются нормально 

Вау... не знал...

слушай, я вот глянул что твое "обновление" надо POST'ом завершать или я путаюсь? ну типа
Код

void __fastcall TForm1::WriteColor()  // функция записи цветов в таблицу базы данных
{
  ADOColor->Open();
  ADOColor->First();
  for(short a=0;a<KolvoCvetov;a++)
  {
    ADOColor->Edit();
    ADOColor->FieldByName("Заявка")->AsString=Cveta[a][0];
    ADOColor->FieldByName("Цвет")->AsString=Cveta[a][1];
    ADOColor->Post();
    ADOColor->Next();
  }
  ADOColor->Close();

PM MAIL WWW Skype GTalk YIM MSN   Вверх
Tsume
Дата 6.9.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Я вот только одного не пойму... причем тут color... Т.е. почему цикл идет по массиву, а Next по DataSet

Я правильно понимаю задачу:
Есть задаваемая таблица цветов. Пишем ее в базу, при этом затираем предыдущие значения.

Тут уместно наверное сказать, что размеры могут и не совпадать у Array и DataSet. Особенно если цветов, скажем 2, а в таблице записей 1000. 

Ну так вот... уж коли речь так пошла о том что сложно и неправильно делать так:
Код

ADOQuery1->SQL->Text = "DELETE FROM TABLITSA";
ADOQuery1->ExecSQL();
for(short a=0;a<KolvoCvetov;a++)
{
   //char(34) - это ". Можно иначе)))
   ADOQuery1->SQL->Text = "INSERT INTO TABLITSA ('Заявка','Цвет') VALUES ("+char(34)+Cveta[a][0]+char(34)+","+char(34)+Cveta[a][1]+char(34)+")";
   ADOQuery1->ExecSQL();
}
 

то напишем алгоритм.
1. Чистим таблицу
2. вставляем нужное количество записей

Код

void __fastcall TForm1::WriteColor()  // функция записи цветов в таблицу базы данных
{
  ADOColor->Open();
  ADOColor->First();
  while (!ADOColor->Eof)
  {
    ADOColor->Delete();
    ADOColor->Next();
  }
  ADOColor->Close();
  for(short a=0;a<KolvoCvetov;a++)
  {
    ADOColor->Append();
    ADOColor->FieldByName("Заявка")->AsString=Cveta[a][0];
    ADOColor->FieldByName("Цвет")->AsString=Cveta[a][1];
    ADOColor->Post();
  }


так вроде. Кодил тут - так что проверьте насчет где Close правильно ставить.

А что касается редактирования... То может стоит еще смотреть, а есть там такое значение или нет?


Это сообщение отредактировал(а) Tsume - 6.9.2007, 17:04
PM MAIL   Вверх
SkyHawk
  Дата 7.9.2007, 06:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



УРА!!! РАЗОБРАЛСЯ!!!
Оказывается, в таблице было две записи с абсолютно одинаковыми записями, которые процессор баз данных не мог различить (судя по всему, Access обращается к записям по уникальным значениям, хотя индексов нет). Помозговал, и добавил еще одно поле-счетчик (у которого все значения естественно будут уникальными ). И все заработало!

Всем большое спасибо за участие.
--------------------
Быть может все, что может быть, И даже то, что быть не может.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

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

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

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




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


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

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