Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запись из ДатаСет в БД, Ошибка переноса записи из ДатаСет в БД 
V
    Опции темы
bobos
Дата 28.11.2007, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.6.2006

Репутация: нет
Всего: нет



Доброго всем времени суток!
Кто-нибудь может подсказать как сделать правильно - а то никак не могу забороть красиво!  smile 
Работаю в VB.NET
Имеется БД в АКССЕСС. Заливаю ДатаСет из БД.
Произвожу запись новой строки. Переношу изменения коммандбилдером в БД.
Делаю AcceptChanges для ДатаСет.
До этого момента все визуально в порядке.
Если удалить запись из ДатаСет и опять перенести билдером изменения в БД, выскакивает ошибка
"Нарушение параллелизма! Изменение затронуло 0 записей!"
Если заново залить ДатаСет, то все проиходит нормално и ошибка не выскакивает!  smile 
В чем загвоздка-то? Мож в голове моей тугой? smile 
PM MAIL   Вверх
thomas
Дата 28.11.2007, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



bobos, 
 Приветствую.
А как работаем: в дизайнере ДС создаем или через код?
И для полноты картины, желательно код в студию.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
bobos
Дата 28.11.2007, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.6.2006

Репутация: нет
Всего: нет



Стыдно признаться, но я не умею делать в дизайнере- только через код!...
А как код приводить? Весь что ли?
Там навернуто, будь здоров...smile
Причем есть класс родитель и два класса дети. 
Один из них заканчивается на этом. А вот у второго есть еще две ветви производных.
Одна из которых имеет еще имеет производные.
Так вот первая, которая обрывается сразу - пишется в базу и удаляется на ура!
А вот со второй (длинной) сплошные проблемы.
Смотрел в базе - все идеально записывается. Из Акссесса напрямую все удаляется без вопросов.
После перезаливки ДатаСет все тоже идет гладко. Такое ощущение, что лажа происходит где-то в датаадаптерах.... Но все сделано одинаково для всех ветвей(скопировано с некоторыми изменениями)
И одно работает, а второе нет! smile 

пример обновления через билдер

Код


Public Function UpdateDannieZapis(ByVal oDS As DataSet) As Boolean
        UpdateDannieZapis = False

        Dim cbООО As OleDb.OleDbCommandBuilder = New OleDb.OleDbCommandBuilder(oDAООО)
        
             Try

            oDADООО.Update(oDS, "myTable")

            UpdateDannieZapis = True

        Catch oEx As Exception

            MessageBox.Show(oEx.Message)
            UpdateDannieZapis = False

        End Try
        Return UpdateDannieZapis
    End Function


PM MAIL   Вверх
bobos
Дата 28.11.2007, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.6.2006

Репутация: нет
Всего: нет



Здесь набросок ДатаСет


Код


Sub New()

      
        Dim sSQL1 As String
        sSQL1  = " SELECT Opisan1.*"
        sSQL1   + =" FROM Opisan1"

        Dim sSQL2 As String
        sSQL2 = "  SELECT Opisan2.*"
        sSQL2 += " FROM Opisan2"

        Dim sSQL22 As String
        sSQL22 = "  SELECT Opisan22.*"
        sSQL22 += " FROM Opisan22"


        
        Try

            Dim oPodkl As New Podkluchenie

            Dim myConn As OleDb.OleDbConnection = oPodkl.Connection
            oDAOpis1 = New OleDb.OleDbDataAdapter(sSQL1, myConn)
            oDAOpis2 = New OleDb.OleDbDataAdapter(sSQL2, myConn)
        oDAOpis22 = New OleDb.OleDbDataAdapter(sSQL22, myConn)

                      

            Dim myTable As DataTable = oDS.Tables("Opis1")
            myTable.PrimaryKey = New DataColumn() {myTable.Columns(0)}
            myTable = oDS.Tables("Opis2")
            myTable.PrimaryKey = New DataColumn() {myTable.Columns(0)}
            myTable = oDS.Tables("Opis22")
          
           
            mTableOpis1 = oDS.Tables("Opis1")
            mTableOpis2 = oDS.Tables("Opis2")
            mTableOpis22 = oDS.Tables("Opis22")
            

            moDS = oDS

            oPodkl.CloseConnection()

        Catch oEx As Exception
            MessageBox.Show(oEx.Message)

        End Try
    End Sub


PM MAIL   Вверх
thomas
Дата 29.11.2007, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



bobos, 
Приветствую.
Две рекомендации:
-  после вызова  метода update для датаадаптера неплохо сделать DataSet.AcceptChanges()
Код

Try
            oDADООО.Update(oDS, "myTable")
            oDS.AcceptChanges()
            UpdateDannieZapis = True
Catch oEx As Exception
            MessageBox.Show(oEx.Message)
            UpdateDannieZapis = False
End Try


- если ваши таблицы в БД имеют первичные ключи(а они должны их иметь, по идее), то зачем вы создаете в датасете в таблицах дополнительные поля как первичные ключи? 
т.е. вместо вот  этого
Код

Dim myTable As DataTable = oDS.Tables("Opis1")
            myTable.PrimaryKey = New DataColumn() {myTable.Columns(0)}
            myTable = oDS.Tables("Opis2")
            myTable.PrimaryKey = New DataColumn() {myTable.Columns(0)}
            myTable = oDS.Tables("Opis22")

просто заполните ДатаСет тремя таблицами при помощи своих трех датаадаптеров.
Код

Dim oDS As DataSet = new DataSet() ' если до этого не обьявляли и не создавали обьект 
oDAOpis1.Fill(oDS, "Opis1")
oDAOpis2.Fill(oDS,"Opis2")
oDAOpis22.Fill(oDS,"Opis22")

и в вашем Датасете окажется три таблицы идентичные по своей структуре таблицам из БД. Естественно заполненные данными.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
bobos
Дата 29.11.2007, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.6.2006

Репутация: нет
Всего: нет



Цитата

-  после вызова  метода update для датаадаптера неплохо сделать DataSet.AcceptChanges()


я именно так и делаю ("Делаю AcceptChanges для ДатаСет")

Цитата

- если ваши таблицы в БД имеют первичные ключи(а они должны их иметь, по идее), то зачем вы создаете в датасете в таблицах дополнительные поля как первичные ключи? 



ключи создаются для работы со строками... без них не отбираются строки методом Find
может быть, я не совсем прав... но все было изучено самостоятельно методом тыка  smile 
так что уж как есть, не обессудьте smile 
PM MAIL   Вверх
bobos
Дата 29.11.2007, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.6.2006

Репутация: нет
Всего: нет



Вопрос решился просто:
Изменения делаются в каком-то родительском классе!
Таблица в БД одна для всего дерева родителей и потомков!
Если есть классы потомки (возможно несколько вложений), в котрых присутстствуют логические поля
(соотвтетствеено в БД есть поля boolean),
то эти поля при записи класса в ДатаСет надо всегда заполнять (false)
 smile  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.