Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Delphi7 ADO опять ошибка "row cannot..." / 25 сообщений из 39, страница 1 из 2
25.08.2003, 14:15
    #32246250
Gluck99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi7 ADO опять ошибка "row cannot..."
Опять про "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
25.08.2003, 14:37
    #32246297
DID
DID
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi7 ADO опять ошибка "row cannot..."
Странная ситуация, а первичный ключ в таблице есть?
...
Рейтинг: 0 / 0
25.08.2003, 14:41
    #32246312
Gluck99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi7 ADO опять ошибка "row cannot..."
Есть поле "kod" - оно уникальное, индексированное и является счетчиком. Все остальные - просто поля с разными типами.
...
Рейтинг: 0 / 0
25.08.2003, 16:58
    #32246604
Александр Спелицин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi7 ADO опять ошибка "row cannot..."
Поле может быть уникальным, индексированным, являться счетчиком, но в то же время не быть в первичном ключе.
Еще раз: есть ли в таблице первичный ключ?
...
Рейтинг: 0 / 0
25.08.2003, 18:02
    #32246724
Gluck99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi7 ADO опять ошибка "row cannot..."
to Александр Спелицын:

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

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

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

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

Простой ключ

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

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

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

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

Я предполагаю, что первичный ключ все-таки существует, так как в противном случае набор данных скорее всего не был бы редактируемым вообще. Поэтому, я считаю, что проблему надо искать в наличии дефолтных значений у полей.
...
Рейтинг: 0 / 0
26.08.2003, 13:40
    #32247515
Gluck99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi7 ADO опять ошибка "row cannot..."
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
26.08.2003, 13:53
    #32247542
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi7 ADO опять ошибка "row cannot..."
У тебя просто значение вставленного счетчика не возвращается и не присваивается полю после вставки. Поиграйся со свойствами соответствующего поля в таблице (в проекте дельфи, разумеется)
...
Рейтинг: 0 / 0
26.08.2003, 14:02
    #32247565
Gluck99
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi7 ADO опять ошибка "row cannot..."
Блин горелый!
Опечатка в коде.

Код: 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
26.08.2003, 14:20
    #32247597
ziktuw
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Delphi7 ADO опять ошибка "row cannot..."
Именно то, о чем я уже сказал.

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

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

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

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

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

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

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

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

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


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

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

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


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