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

Вниз

SQL ADO connection и Access. Проблема вставки данных   Найти похожие ветки 

 
dalamar   (2004-01-08 04:10) [0]

Помогите пожалуйста решить задачу. Имеется подключение по ADO к Access DB. Также имеется ADOCommand в котором выполняется запрос:
INSERT INTO TableA
SELECT * FROM TableB
В TableA имеется индекс на поле code не допускающий дубликатов. При выполнении этого запроса в Access
Возникает prompt с сообщением о том что некоторые записи не уникальны и предлагает отменить операцию, или продолжить при условии, что неуникальные запи буду удалены.
Мне собсно и нужен такой результат - чтобы дублирующиеся записи были удалены из таблицы.
Теперь опишу проблему в Delphi. Дело в том что при выполнении этого запроса в ADOCommand Delphi ругается следующим образом:

"EOleException with message "Изменения не были успешно внесены из-за повторяющихся значений в индексе, ключевых полях или связях...""

Так вот вопрос. Как можно в Delphi игнорировать сообщения от Access или на крайний случай подавлять их?


 
DCoder   (2004-01-08 11:12) [1]

INSERT INTO TableA (<список полей>)
SELECT distinct <список полей> FROM TableB


 
sniknik   (2004-01-08 11:36) [2]

см
> DCoder © (08.01.04 11:12) [1]
угу, почти правильно (почти потому как будет давать уникальный по всему списку, а в нем могут быть повторения одного поля
code prompt
1111, "Test"
1111, "Job"
....
уникально не так ли, а коде повторяется
)
причем если записи в таблице уже есть то выполняй еще и запрос на удаление записей с code сушествующими во вставляемой таблице.


 
DCoder   (2004-01-08 12:06) [3]

Согласен, тогда пусть построчно вставляет, а не одним запросом
и обрабатывает исключения
try
втавить
except
отругаться в лог
end
при этом будет в результирующей таблице только первые строки
с одинаковым значением в поле code


 
sniknik   (2004-01-08 13:01) [4]

почему запросом тоже можно, только не одним а двумя удаление&вставка только немного поправить нужно. как править зависит от структуры вставляемой таблици, есть ли к примеру там действительно уникальное поле и какие данные считать правильнее первые последние из середины повторяющихся.
вот
а исключения отработать боюсь не получится, чтото мне подсказывает что в аксессе не так просто а реализован свой механизм с подобным же удалением вставкой. (хотя, хз. попробуй)


 
BlackTiger   (2004-01-08 18:40) [5]


INSERT INTO MyTable1 (MyField1a, MyField2a)
SELECT DISTINCT MyField1b, MyField2b
FROM MyTable2
WHERE MyTable2.MyField1b NOT IN (SELECT MyField1a FROM MyTable2)


Вроде так


 
BlackTiger   (2004-01-08 18:41) [6]

Упс! Ошибочка


INSERT INTO MyTable1 (MyField1a, MyField2a)
SELECT DISTINCT MyField1b, MyField2b
FROM MyTable2
WHERE MyTable2.MyField1b NOT IN (SELECT MyField1a FROM MyTable1)


Вроде так


 
BlackTiger   (2004-01-08 18:42) [7]

Да что ж такое! Опять ошибка.


INSERT INTO MyTable1 (MyField1a, MyField2a)
SELECT DISTINCT MyField1b, MyField2b
FROM MyTable2
WHERE MyTable2.MyField1a NOT IN (SELECT MyField1a FROM MyTable2)


Вроде так


 
sniknik   (2004-01-08 19:07) [8]

сдается мне что условие
[7]
WHERE MyTable2.MyField1a NOT IN (SELECT MyField1a FROM MyTable2)
никогда не выполнится, по русски "значение поля таблици не входит в выборку значений этого поля этой же таблицы" это как?
[6]
а если проверять на вхождение в записываемую таблицу то как с перезаписью быть старых на новые и + если значения в первой нет а во второй их 2? тотже глюк будет.


 
BlackTiger   (2004-01-09 14:07) [9]

2sniknik: :)

кАрочИ, правильно будет так (4й раз, блин...)

INSERT INTO MyTable1 (MyField1a, MyField2a)
SELECT DISTINCT MyField1b, MyField2b
FROM MyTable2
WHERE MyTable2.MyField1a NOT IN (SELECT MyField1a FROM MyTable1)


 
sniknik   (2004-01-09 14:58) [10]

да нет и так не правильно
первое
проверяеш одни поля вставляеш другие а если вставляемое значение уже есть?
второе
удаления у тебя нет, и одним запросом не сделаеш, а нужна перезапись а не запись только того чего в ней нет.
третье см. > sniknik © (08.01.04 11:36) [2] значение при дистинкте, это у тебя тоже неотслеживается.

p.s. зачем паришся? пока нет ответа на > sniknik © (08.01.04 13:01) [4] это бессмысленно. потому как предполагается 2 в корне отличающихся варианта. обсуждать оба на всякий случай при полном отсутствии интереса от автора ломает.


 
BlackTiger   (2004-01-09 16:04) [11]

2 sniknik: :) зануда ты... :)

теперь должно быть правильно (для Аксесса):

INSERT INTO MyTable1 (F1, F2)
SELECT F1, F2
FROM MyTable2
WHERE MyTable2.F1 NOT IN (SELECT F1 FROM MyTable1)


А удаление немного покурит всторонке.

2 АВТОР:
В TableA имеется индекс на поле code не допускающий дубликатов. При выполнении этого запроса в Access
Возникает prompt с сообщением о том что некоторые записи не уникальны и предлагает отменить операцию, или продолжить при условии, что неуникальные запи буду удалены.


Начнем с того, что ЭТО действительно ТОЛЬКО для самого Аксесса! К тому же записи будут НЕ УДАЛЕНЫ, а ПРОИГНОРОРОВАНЫ! А в догонку - Аксесс не использует запросы в этом случае, а обрабатывает каждую запись через Jet/ADO.

Аналог для Дельфи:

//...
ADOTable1.First();
while not ADOTable1.EOF do
begin
try
ADOTable2.Insert();
ADOTAble2.FieldValues[0] := ADOTable1.FieldValues[0];
ADOTAble2.FieldValues[1] := ADOTable1.FieldValues[1];
ADOTable2.Post();
except
end;
ADOTable1.Next();
end;
//...

Вот это аналог того, что делает Аксесс


 
sniknik   (2004-01-09 16:18) [12]

> 2 sniknik: :) зануда ты... :)
> теперь должно быть правильно (для Аксесса):
...
а вот и нет!!! ;о)))) (меня уже обуревает дикая радость ;о), без всякого повода. с ума схожу?)

допустим в MyTable1 F1 поле с уникальным индексом, допустим таблица пустая совсем.
в MyTable2 значения
f1, f2
1, 2
1, 3
1, 4
....
что будет? 1 в первой таблице нет (допустили что она пустая).
и какое значение f2 правильное?
(не кажется что мы начали повторятся?)


 
BlackTiger   (2004-01-10 17:29) [13]

Да, не работает. И я даже знаю почему. И не будет работать, пока кто-нить не изменит логику обработки вложенных запросов. Аксесс, кстати пытается (при вышеописанных условиях!) вставить все 3 записи. А вот, если на момент записка запроса, запись (MyTable1.F1=1) уже есть, то... ИДЕЯ!!!

INSERT INTO MyTable1(F1, F2)
SELECT MyTable2.F1, First(MyTable2.F2) AS FirstOfF2
FROM MyTable2
WHERE MyTable2.F1 NOT IN (SELECT F1 FROM MyTable1)
GROUP BY MyTable2.F1


 
sniknik   (2004-01-10 18:49) [14]

логику никто менять не будет она правильная, и куча запросов уже под нее написано.

наконецто правильный запрос (похоже, проверять не буду), осталось ответить на уже поднимавшийся вопрос, какое значение считать правильным для записи первое (как у тебя) а может последнее (last)? или максимальное/минимальное?
и вопрос решон, даже вопреки желаниям автора. ;о)) (не отвечает значит уже ничего не хочет)


 
dalamar   (2004-01-11 04:13) [15]

Спасибо большое всем мастерам, которые проявили интерес к данной проблеме!
Прошу простить меня за долгое молчание, вызванное отсутствием коннекта, а вовсе не из-за отсутствия интереса к проблеме.
Ваша дискуссия мне будет очень полезна.
Правда, за время с момента публикации сообщения, я уже решил данную проблему, написанием программы в Access, которая делает именно то что я хотел, и которая игнорирует сообщения аксеса на тему дубликатов. Но тем не менее, это было скорее быстрое, и может быть не очень эффективное решение, но зато задача с дубликатами решена, а это главное (...дороги которые мы выбираем...).
Вашт же предложения очень мне помогут, пори решении подобной задачи уже в другой среде.
Еще раз большое всем спасибо!



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

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

Наверх





Память: 0.49 MB
Время: 0.04 c
1-16495
Lt
2004-01-26 10:52
2004.02.06
Вставка рисунка в Word


14-16659
mike.dld
2004-01-19 02:13
2004.02.06
GIF


4-16806
dcii
2003-11-29 20:38
2004.02.06
Спящий режим


8-16523
Женя
2003-10-01 05:47
2004.02.06
Изображение с веб.камеры.


1-16449
Андреев
2004-01-27 20:02
2004.02.06
добавить событие





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский