powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi7 ADO опять ошибка "row cannot..."
25 сообщений из 39, страница 1 из 2
Delphi7 ADO опять ошибка "row cannot..."
    #32246250
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять про "row cannot be updated", никак не могу побороть.

Исходные данные просты:
Есть база Access XP (*.mdb), стандартные компоненты для доступа ADO (TADOTable) , провайдер JET 4.0, всё очень локально. Таблица мастер и к ней еще 2 детейл. Программа добавляет данные для нескольких полей (штук 7-8) в мастер таблицу таким образом:

Table.Insert;
TableField1.Value := 'a';
TableField2.Value := 'b';
...
Table.Post;

В Table LockType = ltOptimistic. При попытке вставить записи появляется ошибка. Если установить LockType = ltBatchOptimistic, все проходит без ошибок (что логично), но изменения ессно не постятся. Я делал BatchUpdate - сразу появляется ошибка "row cannot ...". Делал Refresh перед тем как заносить данные - ошибка не возникает, но рефрешить каждый раз таблицу из 10000 записей - это час времени займет. Есть два варианта - попробовать через SQL вставлять записи или как-нить разрешить эту коллизию с таблицами.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32246297
DID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DID
Гость
Странная ситуация, а первичный ключ в таблице есть?
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32246312
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть поле "kod" - оно уникальное, индексированное и является счетчиком. Все остальные - просто поля с разными типами.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32246604
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поле может быть уникальным, индексированным, являться счетчиком, но в то же время не быть в первичном ключе.
Еще раз: есть ли в таблице первичный ключ?
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32246724
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Александр Спелицын:

Что-то я не понял, по-моему из того, что я написал выше, четко следует, что первичный ключ имеет место быть, вот выдержка из Хелпа Аксеса:

"В Microsoft Access допускается определение первичных ключей трех типов.

Ключевые поля счетчика

Поле счетчика можно задать таким образом, чтобы добавлении каждой записи в таблицу в это поле автоматически вносился порядковый номер. Указание такого поля в качестве ключевого является наиболее простым способом создания первичного ключа. Если до сохранения созданной таблицы ключевые поля не были определены, Microsoft Access предлагает создать ключевое поле автоматически. При нажатии кнопки «Да» будет создано ключевое поле счетчика.

Простой ключ

Составной ключ "

У меня - первый вариант.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32246839
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если предположить, что первичный ключ все же есть (а на этот счет нет конкретного подтверждения до сих пор), то остается дело в дефолтных полях. Снеси дефолтные значения в полях и должно заработать.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32246962
Mik Prokoshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сначала - отключить detail и попробовать без них, потом попытаться оставить без изменений все поля, где есть default... Локализуйте проблему.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32247189
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Dankov:

Ok, что вы называете первичным ключом в таблице Аксес? Давайте разберемся в терминологии.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32247339
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Данная терминология не нуждается в прояснении. Первичный ключ - это то, что явно создано как "первичный ключ", а не что-то другое.

Hint: Первичный ключ может быть создан на поле с счетчиком, но равно может и не быть создан.

Я предполагаю, что первичный ключ все-таки существует, так как в противном случае набор данных скорее всего не был бы редактируемым вообще. Поэтому, я считаю, что проблему надо искать в наличии дефолтных значений у полей.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32247515
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Первичный ключ разумеется есть.
2) Значений по умолчанию в таблице нет (убрал). Ошибка осталась.
3) Таблица без детайлов. Ошибка есть.

Теперь самое главное. Я ввел, так сказать, в заблуждение аудиторию первым постом. Прошу прощения. На самом деле код выглядит по-другому и ошибка возникает в другом месте.

Итого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Table.Insert; 
TableField1.Value := 'a'; 
TableField2.Value := 'b'; 
... 
Table.Post;
{  Тут выполняются кое-какие действия (арифметические и ввод некоторых данных пользователем) }

Table.Insert;   // Теперь заносим доп. информацию (в ту же запись)
TableField10.Value :=  123 ;
TableField11.Value := True;
Table.Post;   // И вот тут ошибка (или при инсерте, не помню, но не важно)


Т.е. первая пара Insert/Post проходит. А на второй - ошибка. Курсор при этом не перемещается (не должен по крайней мере).
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32247542
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя просто значение вставленного счетчика не возвращается и не присваивается полю после вставки. Поиграйся со свойствами соответствующего поля в таблице (в проекте дельфи, разумеется)
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32247565
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блин горелый!
Опечатка в коде.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Table.Insert; 
TableField1.Value := 'a'; 
TableField2.Value := 'b'; 
... 
Table.Post;
{  Тут выполняются кое-какие действия (арифметические и ввод некоторых данных пользователем) }

Table.[color=red]Edit[/color];   // Теперь заносим доп. информацию (в ту же запись)
TableField10.Value :=  123 ;
TableField11.Value := True;
Table.Post;   // И вот тут ошибка (или при инсерте, не помню, но не важно)


Т.е. сначала Insert/Post, затем Edit/Post. Именно Edit, ведь данные вставляются в ту же запись.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32247597
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно то, о чем я уже сказал.

ADO формирует команду UPDATE и в WHERE ставит условие "ID=NULL" так как на предыдущем шаге не получено значение счетчика после вставки.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32247637
Dionisii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А у меня в коде вроде нормально все, а ошибка вылетает эта, правда редко,
раз в 2 дня где-то ....
У кого какие мысли?

Всем удачи!!!
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32247693
Mik Prokoshin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверь, после первого поста есть новое значение первичного ключа ?
Если ошибка редкая, можно сделать это сообщение просто как MessageBox при Field[0].Value.IsNull для диагностики проблемы.
Проверь, не стоит ли где серверный курсор. (хотя, такая ошибка скорее для SQL провайдера характерна).
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32247919
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Dankov:

Вот тут поподробнее.
"...на предыдущем шаге не получено значение счетчика после вставки." Почему не получено? Поле код (то что примари кей) устанавливается в (N + 1) нормально после вставки... После первого Post - запись нормально сохраняется - все значения на местах и счетчик в порядке. Или я не понял мысль..?
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32247989
Pohipodium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если базу юзает только один пользователь, то можно после вставки делать
Table.Last и вы попадаете на вставленную запись.
В ином случае в качестве ключевого поля лучше не использовать поле-счетчик, а (как вариант) сделать табличку, где будет храниться текущий код счетчика, при вставке подхватывать его, увеличивать значение в таблице счетчика на 1 (для след. юзера) и вставлять в свое ключевое поле.
Таким образом ID будет известен.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32248096
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Pohipodium:

Курсор никуда не передвигается с момента первого Insert/Post, посему не надо вызывать Last.
Я не понимаю, зачем тогда вобще счетчик, если нужно вручную его устанавливать? И при чем оно тут? Значение счетчика присваивается автоматически, без моих усилий. Я это поле вообще не трогаю.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32248147
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оно присваивается в базе эксцесс. А клиентское приложение об этом не знает. И там NULL после вставки образуется. Чтобы клиентское приложение это значение получало после вставки, надо попытаться как минимум выставить свойство AutoGenerateValue в arAutoInc.

Ленишься. Я же уже давно сказал, что нужно поковырять свойства поля.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32248153
Pohipodium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
to Gluck99

все не так оптимистично как ты думаешь
а ты попробовал вставить перед Table.Edit строчку Table.Last?
счетчик для репликации хорошо использовать например.
а вообще все вопросы такого рода можешь сразу Билу который Гейтс задавать
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32248167
Pohipodium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
насколько я помню, то даже в модуле access'a нельзя было после вставки записи получить значение автоинкрементного ID, без конкретного перехода на запись.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32248190
Gluck99
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Dankov:

Ну почему же NULL? Например в гриде после первого Post вовсе не NULL, а то, что и должно быть.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32248202
Pohipodium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а ты попробуй сделать в коде после Post

CodeID:=Table.FieldByName('ID').asInteger;

получишь 0
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32248203
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда не знаю.
...
Рейтинг: 0 / 0
Delphi7 ADO опять ошибка "row cannot..."
    #32248214
Dmitry_1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При использовании DAO для доступа к таблицам Access применялся такой способ (выдержка на васике):


with DAORecordset
.Addnew 'подготовка к вводу новых записей
!Поле1=224
!Поле2="цыцфп"
.........
lngA=!ID 'считывание значения счетчика из ключевого поля
!Update 'обновление набора записей - сохранение внесенных изменений

End with
далее по сохраненному значению счетчика в наборе искалась добавленная запись

чует мое исстрадавшееся сердце, что в ADO похожая фигня должна быть. Знатоки, отзовитесь - мне это тоже завтра-послезавтра надо будет - просто пока не добрался
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi7 ADO опять ошибка "row cannot..."
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]