powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ConstraintException
20 сообщений из 20, страница 1 из 1
ConstraintException
    #32675221
Фотография greenapple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объясните мне, пожалуйста, чем отличается вот этот код, именно так без BeginLoadData и EndLoadData

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Dim patientDataTable As DataTable = (New DALext.PatientHelper).Select(StartDate, EndDate, SurnameSearchString, ProbeNumberSearchString)

For Each r As DataRow In patientDataTable.Rows
Try
newdataset.Tables("tblPPatient").LoadDataRow(r.ItemArray, True)
Catch ex As Exception
Debug.WriteLine(ex.Message)
End Try
Next

от этого

Код: plaintext
1.
newdataset.Merge(New DALext.PatientHelper).Select(StartDate, EndDate, SurnameSearchString, ProbeNumberSearchString))

с точки зрения действия constraints. Почему в первом случае ConstraintException не возникает, а во втором возникает
...
Рейтинг: 0 / 0
ConstraintException
    #32675350
Стр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
например,

в первом случае для newdataset EnforceConstraints=false и все проходит.

во втором случае - идет слияние и в конце merge выдается EnforceConstraints=true
...
Рейтинг: 0 / 0
ConstraintException
    #32675560
Фотография greenapple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в первом случае и так все проходит

BeginLoadData и EndLoadData, обрамляя LoadDataRow позволяют избежать проверки именно в процессе вставки

первый код должен по моему пониманию также выдать ошибку, а этого то как раз и нет
...
Рейтинг: 0 / 0
ConstraintException
    #32675932
Фотография greenapple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что никто не знает? я первый раз с таким столкнулся, не могу понять, я туплю и так и должно быть, или это что-то внутри Merge происходит.
...
Рейтинг: 0 / 0
ConstraintException
    #32676581
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если вместо:
Код: plaintext
1.
newdataset.Tables("tblPPatient").LoadDataRow(r.ItemArray, True)
сделать так:
Код: plaintext
1.
newdataset.Tables("tblPPatient").LoadDataRow(r.ItemArray, False)

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
ConstraintException
    #32677369
Фотография greenapple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то же самое,
я уже пробовал, вот еще интересно, вот в этом фрагменте ошибка выходит почему- то только на последней строке

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
            For Each r As DataRow In patientDataTable.Rows
                Try
                    newdataset.Tables("tblPPatient").BeginLoadData()
                    newdataset.Tables("tblPPatient").LoadDataRow(r.ItemArray, False)
                    newdataset.Tables("tblPPatient").EndLoadData()
                Catch ex As Exception
                    Debug.WriteLine(ex.Message)
                End Try
            Next

            newdataset.EnforceConstraints = True

а в этом

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
            newdataset.Tables("tblPPatient").BeginLoadData()

            For Each r As DataRow In patientDataTable.Rows
                Try
                    newdataset.Tables("tblPPatient").LoadDataRow(r.ItemArray, True)
                Catch ex As Exception
                    Debug.WriteLine(ex.Message)
                End Try
            Next

            newdataset.Tables("tblPPatient").EndLoadData()

            newdataset.EnforceConstraints = True

на предпоследней
...
Рейтинг: 0 / 0
ConstraintException
    #32677385
Фотография greenapple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fAcceptChanges в последнем фрагменте 1, но на результат это не влияет
...
Рейтинг: 0 / 0
ConstraintException
    #32677489
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я уже пробовал, вот еще интересно, вот в этом фрагменте ошибка выходит почему- то только на последней строке

Ну вообще ничего удивительного все логично.

Смотреть надо в корень и не нарушать ограничение тогда никаких ошибок не будет, либо можете вообще отключить constraint'ы.
Код: plaintext
1.
newdataset.EnforceConstraints = False
...
Рейтинг: 0 / 0
ConstraintException
    #32677627
Фотография greenapple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а где логика?
корни я осматривал, ограничения нигде не нарушаются, уникальность проверил, нули убирал. В таблице кроме первичного ключа ничего нет
По теории, чем отличается EndLoadData после LoadDataRow для отдельной строки (особенно если говорить о последней итерации цикла) от EndLoadData для всего набора?
Я по теории то заблуждаюсь или нет? Отключить никогда не поздно, сейчас острой необходимости в этом нет, и мне бы хотелось разобраться.
...
Рейтинг: 0 / 0
ConstraintException
    #32677691
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:-)
Если есть ConstraintExeption то значит есть нарушения.
Что говорит newdataset.HasErrors ?

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
ConstraintException
    #32677707
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да и привидите весь текст ошибки

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
ConstraintException
    #32678070
Фотография greenapple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sa, я нашел!!!

запрос был с джойном и без distinct выдавал дубликат. самый мой первый фрагмент делал апдейт в нужном месте и проходил без ошибок. Все встало на свои места, кроме одного факта.

Интересное поведение выявилось у LoadDataRow. Если внутри BeginLoadData и EndLoadData fAcceptChanges у LoadDataRow ставить true, то несмотря на то, что DataRowState добавленных ранее строк UnChanged (то есть fAcceptChanges срабатывает) обновления данных по первичному ключу не происходит. Об этом написано вот тут : Т.е. дубликат добавляется, а DataRowState у него становится тоже UnChanged. Таблица с дубликатами при newdataset.Tables("tblPPatient").EndLoadData() естественно дает ошибку.

Это нормальное поведение?
...
Рейтинг: 0 / 0
ConstraintException
    #32678398
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
greenapple
Интересное поведение выявилось у LoadDataRow. Если внутри BeginLoadData и EndLoadData fAcceptChanges у LoadDataRow ставить true, то несмотря на то, что DataRowState добавленных ранее строк UnChanged (то есть fAcceptChanges срабатывает) обновления данных по первичному ключу не происходит. Об этом написано вот тут: Т.е. дубликат добавляется, а DataRowState у него становится тоже UnChanged. Таблица с дубликатами при newdataset.Tables("tblPPatient").EndLoadData() естественно дает ошибку.

Это нормальное поведение?

Да нормальное.
А почему вас не устраивает Merge? проблема с binding position?
...
Рейтинг: 0 / 0
ConstraintException
    #32678406
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да для чистоты эксперимента попробуйте так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
newdataset.AcceptChanges()  'add this line 
newdataset.Tables("tblPPatient").BeginLoadData()
For Each r As DataRow In patientDataTable.Rows
    Try
        newdataset.Tables("tblPPatient").LoadDataRow(r.ItemArray, True)
    Catch ex As Exception
        Debug.WriteLine(ex.Message)
    End Try
Next
newdataset.Tables("tblPPatient").EndLoadData()

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
ConstraintException
    #32678446
Фотография greenapple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторчто 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 не будет делать апдейта. Вот тут топик не дошел до этого.
...
Рейтинг: 0 / 0
ConstraintException
    #32678532
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нигде же не написано вообще, что LoadDataRow с fAcceptChanges=True при EnforceConstraints = False не будет делать апдейта.

Почему не будет? Еще раз покажите свой код, и оригинальный текст сообщения об ошибке

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
ConstraintException
    #32678542
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы было понятно
Код: plaintext
1.
EncforceConstraints = False
По простому: отключает check на constraint при добавлении данных

В вашем же случае надо просто отказаться от BeginLoadData и EndLoadData в независимости от свойства EnforceConstraints

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
ConstraintException
    #32679787
Фотография greenapple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Небольшая неточность была у меня выше, при LoadDataRow с fAcceptChanges=True при EnforceConstraints = False апдейт есть :) я смотрел состояние после BeginLoadData - он устанавливается в False и не успел сделать еще проверочку
Вот два фрагмента:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
            newdataset.EnforceConstraints = False

            For Each r As DataRow In patientDataTable.Rows
                Try
                    Dim dr As DataRow = newdataset.Tables("tblPPatient").LoadDataRow(r.ItemArray, True)
                Catch ex As Exception
                    Debug.WriteLine(ex.Message)
                End Try
            Next

            newdataset.EnforceConstraints = True
в таблице n строк, дубликатов нет

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
            newdataset.Tables("tblPPatient").BeginLoadData()

              For Each r As DataRow In patientDataTable.Rows
                Try
                    Dim dr As DataRow = newdataset.Tables("tblPPatient").LoadDataRow(r.ItemArray, True)
                Catch ex As Exception
                    Debug.WriteLine(ex.Message)
                End Try
            Next

            newdataset.Tables("tblPPatient").EndLoadData()

в таблице 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?
...
Рейтинг: 0 / 0
ConstraintException
    #32684749
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не думаю, что это нормально, в документации об этом не сказано, я нашел в книжке: 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 t = new DataTable("atable");
t.Columns.Add("id", typeof(int));
t.Columns.Add("name", typeof(string));

DataColumn[] c = new DataColumn[1];
c[0] = t.Columns["id"];
t.PrimaryKey = c;

 // add rows and commit 
 //t.Rows.Add(new Object[2] {1, "one"}); rem this line by Sa 
 //t.Rows.Add(new Object[2] {2, "two"}); rem this line by Sa 
 //t.Rows.Add(new Object[2] {3, "three"}); rem this line by Sa 
 //t.Rows.Add(new Object[2] {4, "four"}); rem this line by Sa 
 //t.AcceptChanges(); rem this line by Sa 
t.BeginLoadData();
....
t.EndLoadData();

Этим я хотел сказать, что наличие строк в DataTable перед LoadDataRow играет роль. А вообще я бы плюнул на использование LoadDataRow(..., true) так как для некоторых задач это не совсем соответствует правильной операции слияния.
Либо повторюсь не используйте BeginLoadData

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
ConstraintException
    #32688558
Фотография greenapple
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ConstraintException
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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