powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Работа с DataSet
17 сообщений из 17, страница 1 из 1
Работа с DataSet
    #32511784
DataSet набран вручную. Тип данных в ds.Table(0) соответствует типу в Базе данных (таблица q1). Есть ли способ выгрузить данные из DataSet в базу данных (одну или несколько таблиц).

Спасибо.
...
Рейтинг: 0 / 0
Работа с DataSet
    #32511925
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Один из способов: "Пробежаться" по интересующимся записям и передать их в БД
...
Рейтинг: 0 / 0
Работа с DataSet
    #32511951
Может есть способ скинуть весь датасет?

Если "пробегаться" по всем записям, то при передачи записи в БД для каждой отдельно нужно генерить commandString или можно обойти столь неприятное занятие?
...
Рейтинг: 0 / 0
Работа с DataSet
    #32512027
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Может есть способ скинуть весь датасет?
>Если "пробегаться" по всем записям, то при передачи записи в БД для каждой отдельно нужно генерить commandString или можно обойти столь неприятное занятие?

Вместо commandString вы наверное имели ввиду CommandText. Ну CommandText может быть один и тот же, а вот параметры естественно для каждой строки надо будет менять.

DataSet можно скинуть через метод Update класса DataAdapter но тут тоже придется экземпляр этого класса докручивать, как именно? - вы примерно можете посмотреть сгенерировав DataAdapter для вашей таблицы мастером в VS.Net.

Не зная:
Для чего вы создаете DataSet с нуля, если есть идентичная таблица (или несколько таблиц) в БД?
С какой БД, вы работаете?
Используете ли хранимые процедуры ?
Структура данных? Названия полей и таблиц?
И т.д.

Трудно посоветовать что либо еще кроме как "вручную".

Я лично предпочитаю работать вручную (ну это лишь потому что в основном я не использую DataAdapter для внесения изменений в БД)
Плюс способа "вручную" состоит в том что вы полностью контролируете процесс и вносите изменения так как вам необходимо, при этом структуры могут совсем не совпадать.
...
Рейтинг: 0 / 0
Работа с DataSet
    #32512176
Работаю с БД Access.
При попытке сделать всё как в хэлпе описано получаю результат "ничего" . вроде всё правильно. К полученному датасету (custDS) добавляется myDataSet (здесь всё нормально проверяю в датаГриде), а вот когда пытаюсь обновить myAdapter.Update(custDS), то получаю результат = 0. Не знаю как с этим бороться. Вот код.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
        Dim myConnection As New OleDbConnection(connectionString)
        Dim myAdapter As New OleDbDataAdapter()
        myAdapter.SelectCommand = New OleDbCommand(commandString, myConnection)
        Dim myCommandBuilder As OleDbCommandBuilder = New OleDbCommandBuilder(myAdapter)
        Dim custDS As DataSet = New DataSet()

        myConnection.Open()

        myAdapter.Fill(custDS)

        ' Обновление происходит'
        custDS.Merge(myDataSet)

        ' а количество добавленных записей = 0'
        Dim count As Integer = myAdapter.Update(custDS)

        myConnection.Close()
...
Рейтинг: 0 / 0
Работа с DataSet
    #32512177
Кстати myDataSet набираю из копии таблицы куда хочу загрузить обновленный DataSet.
...
Рейтинг: 0 / 0
Работа с DataSet
    #32512493
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала перед Update проверьте
custDS.HasChanges

Затем привидите значение commandString. И посмотреть какие commandы сгенерировал OleDbCommandBuilder.

Не лишним будет и структура таблицы
...
Рейтинг: 0 / 0
Работа с DataSet
    #32513996
при проверке custDS.HasChanges = False Хотя в гриде custDS обновляется.
commandString="SELECT * FROM q1" берем одну запись. В myDataSet commandString="SELECT * FROM q WHERE dateReg=10/05/04" выбирает две записи. В гриде получается три. Странно почему custDS.HasChanges = False. Как посмотреть какие commandы сгенерировал OleDbCommandBuilder не знаю.
...
Рейтинг: 0 / 0
Работа с DataSet
    #32514127
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Возможное решение:

Пусть daMyDataSet - экземпляр класса DataAdapter наполняющий myDataSet данными, тогда перед вызовом метода Fill добавьте:
Код: plaintext
1.
2.
daMyDataSet.AcceptChangesDuringFill = False 'Добавьте эту строку
daMyDataSet.Fill(myDataSet)
...
Рейтинг: 0 / 0
Работа с DataSet
    #32514774
После пременения AcceptChangesDuringFill = False происходит загрузка в таблицу q1 новых строк. Только одно но происходит загрузка строк из тойже таблицы q1. Как будто мы используем не custDS.Merge(myDataSet) а custDS.Merge(custDS). Вот такая вот странность.
...
Рейтинг: 0 / 0
Работа с DataSet
    #32514803
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По подробнее проблему опишите, строки что ли дублируются?

Что возвращает HasChanges для обоих DataSet до Merge. Что возвращает
custDS.HasChanges после Merge.

Привидите код заполнения myDataSet.

Привидите структуру таблиц.
...
Рейтинг: 0 / 0
Работа с DataSet
    #32515348
C AcceptChangesDuringFill все понятно. Ведь данное свойство отвечает принимать ли за изменения заполнение экзэмпляра класса DataSet. Соответственно при загрузке записей ун считает, что происходит обновление и при сохранении в БД просто происходит удваивание записей. По моему так.

Проблема в том, что после Merge custDS.HasChanges = False
Код заполнения myDataSet
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    Public Shared Function GetDataSet(ByVal commandString As String) As DataSet
        Dim myConnection As OleDbConnection = New OleDbConnection(connectionString)
        Dim myCommand As New OleDbCommand(commandString, myConnection)
        Dim myAdapter As New OleDbDataAdapter(myCommand)
        Dim generatedDataSet As New DataSet()

        Try
            myAdapter.Fill(generatedDataSet)
        Catch err As Exception
            Dim q As String = err.Message
        Finally
            If (Not myConnection Is Nothing) Then
                myConnection.Close()
            End If
        End Try
        Return generatedDataSet
    End Function
myDataSet = GetDataSet("SELECT * FROM q") после этого myDataSet.HasChanges = True после myAdapter.Fill(custDS) custDS HasChanges тоже True после custDS.Merge(myDataSet) custDS.HasChanges = False

Структура таблицы: q
fieldID - счетчик
fieldText - текстовое поле

Структура таблицы: q1
fieldID - счетчик
fieldText - текстовое поле

О! Пока писал данное сообщение решил попробовать подругому
теперь custDS.Merge(myDataSet) custDS.HasChanges = False
Но если смотреть DataGrid заполняемый из custDS то изменения видно.
В общем сейчас перешлю исходник.
...
Рейтинг: 0 / 0
Работа с DataSet
    #32515616
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>C AcceptChangesDuringFill все понятно.

Да но вы не туда пытались вставить AcceptChangesDuringFill. Его надо использовать (custDS.Merge(myDataSet)) не применительно к адаптеру заполняющий custDS а применительно к адаптеру заполняющему myDataSet - так как именно myDataSet является источником тех данных которые необходимо добавить.

То есть вставлять надо было вот в эту процедуру.
VB.NET
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    Public Shared Function GetDataSet(ByVal commandString As String) As DataSet
        Dim myConnection As OleDbConnection = New OleDbConnection(connectionString)
        Dim myCommand As New OleDbCommand(commandString, myConnection)
        Dim myAdapter As New OleDbDataAdapter(myCommand)
        Dim generatedDataSet As New DataSet()
        Try
                myAdapter.AcceptChangesDuringFill = False ' Добавить сюда
                myAdapter.Fill(generatedDataSet)
        Catch err As Exception
            Dim q As String = err.Message
        Finally
            If (Not myConnection Is Nothing) Then
                myConnection.Close()
            End If
        End Try
        Return generatedDataSet
    End Function

Теперь все загружаемые данные myDataset(generatedDataSet) будут через Merge попадать в custDS и через Update добавляться уже в БД.
...
Рейтинг: 0 / 0
Работа с DataSet
    #32515633
Блин СУПЕР!
.NET хорошая штука только разобраться нужно.
Я уже даже во сне проблему решал. Огромное СПАСИБО!!! Есть ещё одна просьба объяснить как работает AcceptChangesDuringFill. Премного Благодарен ещё раз.
...
Рейтинг: 0 / 0
Работа с DataSet
    #32515637
В смысле AcceptChanges During Fill текущий датасет, правильно. Каким образом AcceptChangesDuringFill = False влияет на добавление myDataSet в custDS?
...
Рейтинг: 0 / 0
Работа с DataSet
    #32515838
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кратко:

AcceptChangesDuringFill - вольно перевести можно как "ПринятьИзмененияВТеченииПроцессаЗаполнения"

По умолчанию у DataAdapterа AcceptChangesDuringFill = True. В этом случае при заполнении DataSet'а устанавливается("ПринимаютсяИзменения") их RowState в Unchanged (обычный AcceptChanges() для отдельной строки) . При merge RowState=Unchanged сохраняется по этому и был эффект записи слились в один DataSet а в БД не попали. Update игнорирует строки Unchanged.

Когда AcceptChangesDuringFill = False то при заполнении DataSet у строк RowState не сбрасывается -> RowState=Added при Merge RowState=Added сохраняется, и метод Update экземпляра класса DataAdapter такие строки отрабатывает.
...
Рейтинг: 0 / 0
Работа с DataSet
    #32517025
Большое спасибо!
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Работа с DataSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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