|
ConstraintException
|
|||
---|---|---|---|
#18+
Объясните мне, пожалуйста, чем отличается вот этот код, именно так без BeginLoadData и EndLoadData Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
от этого Код: plaintext 1.
с точки зрения действия constraints. Почему в первом случае ConstraintException не возникает, а во втором возникает ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2004, 13:09 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
например, в первом случае для newdataset EnforceConstraints=false и все проходит. во втором случае - идет слияние и в конце merge выдается EnforceConstraints=true ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2004, 13:51 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
в первом случае и так все проходит BeginLoadData и EndLoadData, обрамляя LoadDataRow позволяют избежать проверки именно в процессе вставки первый код должен по моему пониманию также выдать ошибку, а этого то как раз и нет ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2004, 15:00 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
что никто не знает? я первый раз с таким столкнулся, не могу понять, я туплю и так и должно быть, или это что-то внутри Merge происходит. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2004, 16:55 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
А если вместо: Код: plaintext 1.
Код: plaintext 1.
Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2004, 08:26 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
то же самое, я уже пробовал, вот еще интересно, вот в этом фрагменте ошибка выходит почему- то только на последней строке Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
а в этом Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
на предпоследней ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2004, 13:17 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
fAcceptChanges в последнем фрагменте 1, но на результат это не влияет ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2004, 13:20 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
я уже пробовал, вот еще интересно, вот в этом фрагменте ошибка выходит почему- то только на последней строке Ну вообще ничего удивительного все логично. Смотреть надо в корень и не нарушать ограничение тогда никаких ошибок не будет, либо можете вообще отключить constraint'ы. Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2004, 13:57 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
а где логика? корни я осматривал, ограничения нигде не нарушаются, уникальность проверил, нули убирал. В таблице кроме первичного ключа ничего нет По теории, чем отличается EndLoadData после LoadDataRow для отдельной строки (особенно если говорить о последней итерации цикла) от EndLoadData для всего набора? Я по теории то заблуждаюсь или нет? Отключить никогда не поздно, сейчас острой необходимости в этом нет, и мне бы хотелось разобраться. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2004, 14:40 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
:-) Если есть ConstraintExeption то значит есть нарушения. Что говорит newdataset.HasErrors ? Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2004, 14:59 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
Да и привидите весь текст ошибки Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2004, 15:02 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
Sa, я нашел!!! запрос был с джойном и без distinct выдавал дубликат. самый мой первый фрагмент делал апдейт в нужном месте и проходил без ошибок. Все встало на свои места, кроме одного факта. Интересное поведение выявилось у LoadDataRow. Если внутри BeginLoadData и EndLoadData fAcceptChanges у LoadDataRow ставить true, то несмотря на то, что DataRowState добавленных ранее строк UnChanged (то есть fAcceptChanges срабатывает) обновления данных по первичному ключу не происходит. Об этом написано вот тут : Т.е. дубликат добавляется, а DataRowState у него становится тоже UnChanged. Таблица с дубликатами при newdataset.Tables("tblPPatient").EndLoadData() естественно дает ошибку. Это нормальное поведение? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2004, 17:05 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
greenapple Интересное поведение выявилось у LoadDataRow. Если внутри BeginLoadData и EndLoadData fAcceptChanges у LoadDataRow ставить true, то несмотря на то, что DataRowState добавленных ранее строк UnChanged (то есть fAcceptChanges срабатывает) обновления данных по первичному ключу не происходит. Об этом написано вот тут: Т.е. дубликат добавляется, а DataRowState у него становится тоже UnChanged. Таблица с дубликатами при newdataset.Tables("tblPPatient").EndLoadData() естественно дает ошибку. Это нормальное поведение? Да нормальное. А почему вас не устраивает Merge? проблема с binding position? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2004, 20:35 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
Да для чистоты эксперимента попробуйте так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2004, 20:51 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
авторчто DataRowState добавленных ранее строк UnChanged newdataset.Tables("tblPPatient") пустая у меня изначально, поэтому первая строка ничего не изменит. Я писал тут про те строки, которые добавляются в цикле. В приниципе, из документации понятно, почему добавленный дубликат получает UnChanged, как и все остальные добавленные строки авторIf the fAcceptChanges parameter is true or not specified, the new data is added and then AcceptChanges is called to accept all changes in the DataTable Проблем нет. Хочется чтобы было понятно, раз уж я начал копать. Нигде же не написано вообще, что LoadDataRow с fAcceptChanges=True при EnforceConstraints = False не будет делать апдейта. Вот тут топик не дошел до этого. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2004, 23:18 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
Нигде же не написано вообще, что LoadDataRow с fAcceptChanges=True при EnforceConstraints = False не будет делать апдейта. Почему не будет? Еще раз покажите свой код, и оригинальный текст сообщения об ошибке Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2004, 07:57 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
Чтобы было понятно Код: plaintext 1.
В вашем же случае надо просто отказаться от BeginLoadData и EndLoadData в независимости от свойства EnforceConstraints Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2004, 08:06 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
Небольшая неточность была у меня выше, при LoadDataRow с fAcceptChanges=True при EnforceConstraints = False апдейт есть :) я смотрел состояние после BeginLoadData - он устанавливается в False и не успел сделать еще проверочку Вот два фрагмента: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
в таблице n+1 строк, один дубликат. Я не думаю, что это нормально, в документации об этом не сказано, я нашел в книжке: When you're loading data rows using BeginLoadData and LoadDataRow, rows that match existing rows cause an update rather than a duplicate row exception. (Essential ADO.NET By Bob Beauchemin) Получается вот что: BeginLoadData отключает constraints, в том числе unique для PK и становится возможным добавление дубликатов, при этом LoadDataRow почему-то не делает обновления, как будто PK вообще отсутсвует, хотя он есть. Зачем PK без unique? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2004, 16:39 |
|
ConstraintException
|
|||
---|---|---|---|
#18+
не думаю, что это нормально, в документации об этом не сказано, я нашел в книжке: When you're loading data rows using BeginLoadData and LoadDataRow, rows that match existing rows cause an update rather than a duplicate row exception. (Essential ADO.NET By Bob Beauchemin) Получается вот что: BeginLoadData отключает constraints, в том числе unique для PK и становится возможным добавление дубликатов, при этом LoadDataRow почему-то не делает обновления, как будто PK вообще отсутсвует, хотя он есть. Зачем PK без unique? Посмотрел Bob Beauchemin , нашел пример см. Listing 4-20. Если заремить некоторые строки, то вы смоделируете свою ситуацию. Listing 4-20 Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Этим я хотел сказать, что наличие строк в DataTable перед LoadDataRow играет роль. А вообще я бы плюнул на использование LoadDataRow(..., true) так как для некоторых задач это не совсем соответствует правильной операции слияния. Либо повторюсь не используйте BeginLoadData Код: plaintext
... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2004, 10:55 |
|
|
start [/forum/topic.php?fid=17&msg=32678542&tid=1354030]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
64ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 176ms |
0 / 0 |