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

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

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

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

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

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

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

Я лично предпочитаю работать вручную (ну это лишь потому что в основном я не использую DataAdapter для внесения изменений в БД)
Плюс способа "вручную" состоит в том что вы полностью контролируете процесс и вносите изменения так как вам необходимо, при этом структуры могут совсем не совпадать.
...
Рейтинг: 0 / 0
10.05.2004, 17:21
    #32512176
Работа с DataSet
Работаю с БД 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
10.05.2004, 17:23
    #32512177
Работа с DataSet
Кстати myDataSet набираю из копии таблицы куда хочу загрузить обновленный DataSet.
...
Рейтинг: 0 / 0
11.05.2004, 07:24
    #32512493
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с DataSet
Для начала перед Update проверьте
custDS.HasChanges

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

Не лишним будет и структура таблицы
...
Рейтинг: 0 / 0
11.05.2004, 21:36
    #32513996
Работа с DataSet
при проверке 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
12.05.2004, 07:39
    #32514127
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с DataSet
Возможное решение:

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

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

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

Привидите структуру таблиц.
...
Рейтинг: 0 / 0
12.05.2004, 19:25
    #32515348
Работа с DataSet
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
13.05.2004, 08:20
    #32515616
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с DataSet
>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
13.05.2004, 08:47
    #32515633
Работа с DataSet
Блин СУПЕР!
.NET хорошая штука только разобраться нужно.
Я уже даже во сне проблему решал. Огромное СПАСИБО!!! Есть ещё одна просьба объяснить как работает AcceptChangesDuringFill. Премного Благодарен ещё раз.
...
Рейтинг: 0 / 0
13.05.2004, 08:50
    #32515637
Работа с DataSet
В смысле AcceptChanges During Fill текущий датасет, правильно. Каким образом AcceptChangesDuringFill = False влияет на добавление myDataSet в custDS?
...
Рейтинг: 0 / 0
13.05.2004, 10:51
    #32515838
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Работа с DataSet
Кратко:

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
13.05.2004, 19:11
    #32517025
Работа с DataSet
Большое спасибо!
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Работа с DataSet / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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