Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ConstraintException / 20 сообщений из 20, страница 1 из 1
01.09.2004, 13:09
    #32675221
greenapple
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConstraintException
Объясните мне, пожалуйста, чем отличается вот этот код, именно так без 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
01.09.2004, 13:51
    #32675350
Стр
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConstraintException
например,

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

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

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

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

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

Код: 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
02.09.2004, 13:20
    #32677385
greenapple
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConstraintException
fAcceptChanges в последнем фрагменте 1, но на результат это не влияет
...
Рейтинг: 0 / 0
02.09.2004, 13:57
    #32677489
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConstraintException
я уже пробовал, вот еще интересно, вот в этом фрагменте ошибка выходит почему- то только на последней строке

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

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

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

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

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

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

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

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

Да нормальное.
А почему вас не устраивает Merge? проблема с binding position?
...
Рейтинг: 0 / 0
02.09.2004, 20:51
    #32678406
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConstraintException
Да для чистоты эксперимента попробуйте так:
Код: 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
02.09.2004, 23:18
    #32678446
greenapple
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConstraintException
авторчто 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
03.09.2004, 07:57
    #32678532
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConstraintException
Нигде же не написано вообще, что LoadDataRow с fAcceptChanges=True при EnforceConstraints = False не будет делать апдейта.

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

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

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

Код: plaintext
 uid  =  S a
...
Рейтинг: 0 / 0
03.09.2004, 16:39
    #32679787
greenapple
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConstraintException
Небольшая неточность была у меня выше, при 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
08.09.2004, 10:55
    #32684749
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConstraintException
не думаю, что это нормально, в документации об этом не сказано, я нашел в книжке: 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
09.09.2004, 22:18
    #32688558
greenapple
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ConstraintException
Спасибо
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / ConstraintException / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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