Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.10.17;
Скачать: [xml.tar.bz2];

Вниз

EOLEException   Найти похожие ветки 

 
Василич   (2002-09-19 19:16) [0]

Здравствуйте ! Подскажите, пожалуйста, вследствие чего появляется ошибка "EOLEException. Не удается найти строку для обновления. Некоторые значения могли быть изменены со времени ее последнего чтения". Ошибка выдается после метода Post или Requery. Везде искал, не могу найти даже описания ошибки.


 
Василич   (2002-09-20 10:29) [1]

Ребята, ну неужто никто не знает ?


 
Johnmen   (2002-09-20 10:40) [2]

Так поищи в этой конфе...
Данный вопрос задается с завидной регулярностью...:))))


 
Василич   (2002-09-20 11:35) [3]

Подобный вопрос отсутствует. Самое интересное, что трассировка запроса с помощью SQL Profiler ничего не дает !


 
Юрий Жуков   (2002-09-20 13:09) [4]

Я так понимаю ты на ADO пишеь?
Тогда тебе идти на королевство Дельфи.
Читать здесь:

http://www.delphikingdom.com/helloworld/ado01.htm
http://www.delphikingdom.com/helloworld/ado02.htm
http://www.delphikingdom.com/helloworld/ado03.htm

Тригера в таблицах есть?


 
Василич   (2002-09-20 15:25) [5]

Recordset.Properties["Update Resync"].Value := adResyncNone;;
Recordset.Properties["Update Criteria"].Value := adCriteriaAllCols;

Все равно не работает !!!


 
Юрий Жуков   (2002-09-20 16:00) [6]

А тригера в таблицах есть? А автоинкрементные поля?
А первичный ключ? А подумай сам чего ты еще утаил?

И лучше используй так:
Recordset.Properties["Update Criteria"].Value := adCriteriaKey

А еще лучше пропиши
Recordset.Properties["Resync Command"].Value := " бла - бла..."


 
Василич   (2002-09-20 16:04) [7]

Триггеров нет, автоинкрементное поле есть. Таблица представляет из себя кучу полей типа ID, связана с другими, дочерними таблицами. Редактирование делается простым присваиванием FieldByName("FieldName").AsString :="бла-бла"

Recordset.Properties["Update Resync"].Value := adResyncAutoIncrement + adResyncInserts;;
Recordset.Properties["Update Criteria"].Value := adCriteriaAllCols;
if not InTransaction then
BeginTrans;
Edit;
FieldByName("Field1").AsString := ComboBox1.Text;
...........................
Post;
CommitTrans;
Requery();

и после Post вылетает эта ошибка.


 
Юрий Жуков   (2002-09-20 16:40) [8]

Ну я тебе почти правильно сказал:
Recordset.Properties["Update Criteria"].Value := adCriteriaKey
Обовлять запись будет по первичным ключам
Если это не поможет, то ставь
Recordset.Properties["Resync Command"].Value := " бла - бла..."

Ну если это не поможет то разве что можно на запрос посмотреь..



 
Василич   (2002-09-20 16:47) [9]

И что мне писать в это "bla-bla" ?


 
Василич   (2002-09-20 18:06) [10]

Это все, к сожалению, не помогает.


 
Юрий Жуков   (2002-09-20 19:15) [11]

Хм, ссылку я вроде бы давал, но вдидать ты не очень внимательно прочитал:

http://www.delphikingdom.com/helloworld/ado03.htm
Цитата:
в этом свойстве задается команда, с помощью которой должна быть обновлена текущая строка, основываясь на значении колонок из таблицы, имя которой заданно свойством "Unique Table"

Ну а апдейты к D6 стоят? Что еще посоветовать не знаю, может сам еще чего скажешь?


 
Василич   (2002-09-23 09:45) [12]

DataModule1.ADODataset1.Properties["Update Resync"].Value := adResyncInserts + adResyncUpdates;
DataModule1.ADODataset1.Properties["Update Criteria"].Value := adCriteriaKey;
DataModule1.ADODataset1.Properties["Unique Table"].Value := "Computers";
DataModule1.ADODataset1.Properties["Resync Command"].Value := ResyncCommand;


ResyncCommand := "SELECT C.ComputerID AS "


 
Василич   (2002-09-23 10:40) [13]

Я немного понял. Для того, чтобы Update отрабатывался нормально, ВСЕ поля в таблице должны быть заполнены (не равны NULL). Может, следует каким-то образом изменить запрос ?


 
Василич   (2002-09-23 11:15) [14]

А это результат трассировки запроса. Никаких ошибок, никаких предупреждений...

exec sp_executesql N"UPDATE "Mspi"."dbo"."Computers" SET "ComputerID"=@P1,"Address"=@P2,"Cabinet"=@P3 WHERE "KeyField"=@P4", N"@P1 bigint,@P2 nvarchar(10),@P3 int,@P4 int", 545445, N"Ленина, 57", 21, 12
go
exec sp_executesql N"UPDATE "Mspi"."dbo"."Xeroxes" SET "Xerox"=@P1 WHERE "XeroxID" IS NULL", N"@P1 varchar(1)", ""
go
exec sp_executesql N"UPDATE "Mspi"."dbo"."Scanners" SET "Scanner"=@P1 WHERE "ScannerID"=@P2", N"@P1 varchar(4),@P2 int", "UMAX", 6
go
exec sp_executesql N"UPDATE "Mspi"."dbo"."Printers" SET "Printer"=@P1 WHERE "PrinterID"=@P2", N"@P1 varchar(29),@P2 int", "Hewlett-Packard LaserJet 1100", 4
go
exec sp_executesql N"UPDATE "Mspi"."dbo"."Monitors" SET "Monitor"=@P1 WHERE "MonitorID"=@P2", N"@P1 varchar(19),@P2 int", "SAMSUNG Samtron 75E", 3
go
exec sp_executesql N"UPDATE "Mspi"."dbo"."EtherCards" SET "EtherCard"=@P1 WHERE "EtherCardID"=@P2", N"@P1 varchar(16),@P2 int", "Surecom 100 Mbit", 2
go
exec sp_executesql N"UPDATE "Mspi"."dbo"."SoundBlasters" SET "SoundBlaster"=@P1 WHERE "SoundBlasterID" IS NULL", N"@P1 varchar(1)", ""
go
exec sp_executesql N"UPDATE "Mspi"."dbo"."CDROMs" SET "CDROM"=@P1 WHERE "CDROMID"=@P2", N"@P1 varchar(8),@P2 int", "ASUS 50x", 2
go
exec sp_executesql N"UPDATE "Mspi"."dbo"."HDDs" SET "HDD"=@P1 WHERE "HDDID"=@P2", N"@P1 varchar(14),@P2 int", "IBM DTLA 30 Gb", 2
go
exec sp_executesql N"UPDATE "Mspi"."dbo"."VideoCards" SET "VideoCard"=@P1 WHERE "VideoCardID"=@P2", N"@P1 varchar(22),@P2 int", "GeForce 4 Ti4600 64 Mb", 2
go
exec sp_executesql N"UPDATE "Mspi"."dbo"."RAMs" SET "RAM"=@P1 WHERE "RAMID"=@P2", N"@P1 smallint,@P2 int", 32, 5
go
exec sp_executesql N"UPDATE "Mspi"."dbo"."Motherboards" SET "Motherboard"=@P1 WHERE "MotherboardID"=@P2", N"@P1 varchar(4),@P2 int", "Abit", 2
go
exec sp_executesql N"UPDATE "Mspi"."dbo"."Processors" SET "Processor"=@P1 WHERE "ProcessorID"=@P2", N"@P1 varchar(35),@P2 int", "Intel Celeron 333 Mhz", 16
go
exec sp_executesql N"UPDATE "Mspi"."dbo"."Faculties" SET "Faculty"=@P1 WHERE "FacultyID"=@P2", N"@P1 nvarchar(29),@P2 int", N"Кафедра, 18
go
SELECT N"Testing Connection..."
go
EXECUTE msdb.dbo.sp_sqlagent_get_perf_counters
go


Блин, что делать-то ?


 
MOA   (2002-09-23 13:05) [15]

1.А вот это:

exec sp_executesql N"UPDATE "Mspi"."dbo"."Xeroxes" SET "Xerox"=@P1 WHERE "XeroxID" IS NULL", N"@P1 varchar(1)", ""

нормально ("XeroxID" IS NULL)?
2. У Вас действительно при апдейте детайл-таблицы должны обновляться ВСЕ мастер-таблицы? Так и задумано?


 
Юрий Жуков   (2002-09-23 13:22) [16]

Ну по крайней мере видно, что вот здесь точно будет ошибка:

exec sp_executesql N"UPDATE "Mspi"."dbo"."Xeroxes" SET "Xerox"=@P1 WHERE "XeroxID" IS NULL", N"@P1 varchar(1)", ""

Да ты прав, в этом результирующем запросе все поля должны быть заполнены, что-бы АДО мог пострить по ним SQL для Update для всех подчиненных таблиц (ты ведь нигде не указал UniqueTable). Насколько я знаю нельзя указать несколько уникальных таблиц для ADODATASET.

Думаю тебе следует исользовать Uniquetable:="Faculties";
А редактирование всех остальных датасетов оформить в виде справочников


 
Василич   (2002-09-23 14:53) [17]

Редактирование остальных датасетов и так оформлено в виде справочников. Я же на самом деле редактирую не справочник (т.е. не таблицу Xeroxes), а сводную, в которой находится XeroxID.

>MOA
По идее, мастер-таблицы обновляться не должны. Пытался снять у таблицы опцию Enforce relationship for INSERTS and UPDATES, толку никакого.
Как бы там ни было, мне все-таки требуется, чтобы в некоторые поля можно было воткнуть NULL (не во всех кабинетах есть ксероксы, образно говоря). Не подскажете ли Вы, как избавиться от принудительного обновления мастер-таблиц и уничтожить в корне эту проклятую ошибку ?


 
MOA   (2002-09-23 15:22) [18]

>уничтожить в корне эту проклятую ошибку
Я бы сделал так:
1.Запрос:
"SELECT C.ComputerID AS "


 
Юрий Жуков   (2002-09-23 15:42) [19]

очень странно...
так ты говоришь поставил свойство
Properties["Unique Table"].Value := "Computers"?

Но судя по логу профайлера ADO все равно пытается апдейтить все таблицы.



 
Василич   (2002-09-26 14:05) [20]

Ничего у меня не получается. Для интереса создал уникальный индекс во всех родительских таблицах, последовал всем советам MOA, и ничего не работает !!! Судя по вылетающей в этот раз ошибке ("Cannot insert duplicate key") SQL Server действительно пытается засунуть записи в родительские таблицы, хотя ясно указаны все динамические свойства типа Resync Command и Unique Table. Подскажите, как избавиться от этой нездоровой тенденции SQL-сервера апдейтить таблицы, которые совершенно не нужно апдейтить !


 
Юрий Жуков   (2002-09-26 14:32) [21]

Эт тебе не SQL сервер надо укрощать, а ADO.
И бороть нужно свойство "Unique table".

Попробуй компонент TBetterAdoDataSet ( http://web.orbitel.bg/vassil/), там можно его disign-time задать.


 
MOA   (2002-09-26 15:10) [22]

Может, так:?
1. Если не хочется отказываться от VIEW - добавить отдельные DataSet-ы на вставку - обновление - удаление и перехватывать соответсвующие события, не давая "основному" датасету вставлять-удалять-обновлять
Или
2. В "Основном" датасете обращаться к детайл-таблице, оформив поля из мастер-таблиц как Lookup поля. Понадобится дополнительно столько датасетов, сколько мастер-таблиц - но обновления-удаления-вставки будут работать как ожидается + бонус - автоматом появится возможность юзеру выбирать нужные значения из Lookup-ов.
Любая таблица должна иметь PRIMARY KEY. И мастер - тоже. И это - ключ для ссылки из детайл.
А дублирующиеся ключи - это точно не ключи в детайл-таблице?
Удачи!


 
MOA   (2002-09-26 15:25) [23]

И еще.
1.У Вас пользователи вводят НАЗВАНИЯ? Из, возможно, формируемого программой списка? - Если так, то так не надо бы...
2.У Вас стоит у VIEW опция VIEW_METADATA?
Удачи!


 
MOA   (2002-09-26 16:04) [24]

Sorry, забыл, что у Вас не VIEW, a SELECT.
НО все же - попробуйте в SELECT выбирать только ссылки на мастер-таблицы (ID), а не названия.
Удачи!


 
Василич   (2002-09-26 16:08) [25]

Похоже, этот кошмар никогда не кончится. Сделал все по вашим советам: lookup-поля, куча датасетов, по одному на каждую таблицу, даже не датасеты, а BetterADODataSets, черт бы их побрал. Насмотрелся на кучу новых ошибок, как например, сверхинформативное сообщение "Не удается вставить или обновить столбцы из нескольких таблиц", или, "При вызове ITransaction::Commit или ITransaction::Abort объект не отвечает на запросы". Короче, пора переквалифицироваться в дворники, всем спасибо за оказанную помощь.


 
MOA   (2002-09-26 16:13) [26]

Покажите, пожалуйста, Ваш новый "основной" запрос.


 
Василич   (2002-09-26 16:16) [27]

>MOA

Не совсем понятно, что в данном контексте означает "Названия" , вот запрос для сводной таблицы:
SELECT TOP 100 PERCENT C.ComputerID AS [Серийный номер компьютера], F.Faculty AS [Факультет/Отдел], P.Processor AS Процессор,
M.Motherboard AS [Материнская плата],
R.RAM AS [Оперативная память], V.VideoCard AS Видеоадаптер,
H.HDD AS [Жесткий диск], D.CDROM AS [Привод компакт-дисков],
S.SoundBlaster AS [Звуковая карта],
E.EtherCard AS [Сетевая карта], O.Monitor AS Монитор,
N.Printer AS Принтер, A.Scanner AS Сканер, X.Xerox AS Ксерокс,
B.Address AS Адрес, Cabinet AS Кабинет
FROM dbo.Computers C LEFT OUTER JOIN
dbo.Faculties F ON F.FacultyID = C.FacultyID LEFT OUTER JOIN
dbo.Processors P ON P.ProcessorID = C.ProcessorID LEFT OUTER JOIN
dbo.Motherboards M ON M.MotherboardID = C.MotherBoardID LEFT OUTER JOIN
dbo.RAMs R ON R.RAMID = C.RAMID LEFT OUTER JOIN
dbo.VideoCards V ON V.VideoCardID=C.VideoCardID LEFT OUTER JOIN
dbo.HDDs H ON H.HDDID = C.HDDID LEFT OUTER JOIN
dbo.CDROMs D ON D.CDROMID = C.CDROMID LEFT OUTER JOIN
dbo.SoundBlasters S ON S.SoundBlasterID = C.SoundBlasterID LEFT OUTER JOIN
dbo.EtherCards E ON E.EtherCardID = C.EtherCardID LEFT OUTER JOIN
dbo.Monitors O ON O.MonitorID = C.MonitorID LEFT OUTER JOIN
dbo.Printers N ON N.PrinterID = C.PrinterID LEFT OUTER JOIN
dbo.Scanners A ON A.ScannerID = C.ScannerID LEFT OUTER JOIN
dbo.Xeroxes X ON X.XeroxID=C.XeroxID LEFT OUTER JOIN
dbo.Addresses B ON B.AddressID = C.AddressID
ORDER BY F.Faculty


Сначала это был VIEW, потом я от него отказался и впихнул этот чудовищный запрос прямо в CommandText. Пытаюсь вставлять/редактировать его обычными методами типа Append/Edit/Post, и вылетают вышеназванные ошибки. От названий полей в данном случае отказаться не могу, а то получится не нормальный пользовательский интерфейс, а черт знает что.


 
MOA   (2002-09-26 16:35) [28]

1. Русские названия полей = приключения. Воспользуйтесь Display label в свойстве поля.
2. Попробуйте такой запрос:
SELECT TOP 100 PERCENT C.ComputerID, C.FacultyID, C.ProcessorID,
C.MotherboardID, C.RAMID, C.VideoCardID, C.HDDID, C.CDROMID, C.SoundBlasterID, C.EtherCardID, C.MonitorID, C.PrinterID, C.ScannerID, C.XeroxID, C.AddressID, C.Cabinet
FROM dbo.Computers CORDER BY F.Faculty

Русские названия полей сделайте через Display label. Добавьте в получившийся датасет дополнительно Lookup поля для Faculity, Processor и т.д., поля с ID, соответственно, скройте от юзера (Display=False).
Всё должно поехать. Именно это я и имел в виду.
Удачи!


 
MOA   (2002-09-26 16:36) [29]

Русские названия, конечно же, Вам понадобятся только для созданных Вами Lookup полей. Наверное, не нужно юзеру знать русское название поля ProcessorID, например.
Удачи!



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.10.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.008 c
1-56030
Wetnose
2002-10-08 08:05
2002.10.17
CreateOleObject в Design-time


14-56344
Anatoly Podgoretsky
2002-09-21 01:51
2002.10.17
Memory SDK


14-56279
LStranger
2002-09-21 21:47
2002.10.17
Новая доктрина США: ударить первыми


14-56337
AndreyS
2002-09-24 20:23
2002.10.17
библиотечка спец мат функций?


1-56126
Лана Розанова
2002-10-09 11:36
2002.10.17
Вызов из странички





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский