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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение типизированного DataSet, в БД 
V
    Опции темы
MFSham
Дата 5.11.2007, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

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



Есть типизированный DataSet. В DataSet загружено несколько взаимосвязных таблиц. Нужно обновить(сохранить в БД) одну таблицу. БД - Access.

Насколько я понял CommandBuilder здесь не проходит, т.к. таблица взаимосвязная.
И тут сразу у меня возникает пару вопросов:
1. Если я использую типизированный DataSet, значит ли это, что для сохранения нужно использовать TableAdapter типизированной таблицы?
2. Если да, то каким образом(через какие методы) обновить таблицу в БД?
3. Если можно обойтись и без этого, то используя обычный TableAdapter через метод UpdateCommand можно ли добиться обновления?

Как я не пытаюсь сохранить, никак не получается :(
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
thomas
Дата 5.11.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



MFSham, 
Приветствую.
Цитата

1. Если я использую типизированный DataSet, значит ли это, что для сохранения нужно использовать TableAdapter типизированной таблицы?

 smile 

Подожди немного сейчас кое-что сделаю и скину примерчик.


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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

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



Жду с нетерпением  smile 
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
thomas
Дата 5.11.2007, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



MFSham, 
Вот нашел у себя примерчик на VB давно делал.
Так выглядит ДатаСет в дизайнере, не беда что две таблицы можно и больше прикрутить.
user posted image
А так выглядит форма в дизайнере, там внизу контролы видны.
user posted image
А тут собственно код формы
Код

Public Class Form2

    Private Sub CustomerBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CustomerBindingNavigatorSaveItem.Click
        Me.Validate()
        Me.CustomerBindingSource.EndEdit()
        Me.CustomerTableAdapter.Update(Me.CustomerOrdersDataSet.Customer)
        Me.OrdersBindingSource.EndEdit()
        Me.OrdersTableAdapter.Update(Me.CustomerOrdersDataSet.Orders)

    End Sub

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'TODO: This line of code loads data into the 'CustomerOrdersDataSet.Orders' table. You can move, or remove it, as needed.
        Me.OrdersTableAdapter.Fill(Me.CustomerOrdersDataSet.Orders)
        'TODO: This line of code loads data into the 'CustomerOrdersDataSet.Customer' table. You can move, or remove it, as needed.
        Me.CustomerTableAdapter.Fill(Me.CustomerOrdersDataSet.Customer)

    End Sub
End Class


Добавлено через 14 минут и 56 секунд
Обрати внимание что для каждой таблицы вызывается свой BindingSource с методом EndEdit()
А потом свой TableAdapter с методом Update и соответствующим параметром Me.CustomerOrdersDataSet.Customer (в данном случае указана таблица клиентов)
Да и в событии Form2_Load обрати внимание на последовательность выполнения методов Fill для ДатаСет. Таблицы связанны и порядок выполнения критичен. Сначала дочерние таблицы потом родитель. Если наоборот, то ничего не увидишь в гриде(например)


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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

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



У меня нету BindingSource'ов. 

Вот кусок кода:
Код

private SchoolDataSet DS;   

// fill SchoolDataSet data from DB
        private void FillDataSet(OleDbConnection con) {            
            OleDbDataAdapter dbAdapter;            

           ... 
              
            sqlQuery = "SELECT * FROM TimeTable;";
            myCommand = new OleDbCommand(sqlQuery, con);
            dbAdapter = new OleDbDataAdapter(myCommand);            
            dbAdapter.TableMappings.Add("Table", "TimeTable");
            dbAdapter.Fill(this.DS);            
        } 

        // update TimeTable data  
        // обновляет данные в таблице TimeTable в DataSet
        public void UpdateTimeTable(List<string> subjList, int ClassID, int DayID) {
            int subjID;
            int timeID;

            for (int i = 1; i <= subjList.Count; i++) {
                subjID = this.GetSubjectID(subjList[i - 1]);
                timeID = i;                

                TimeTableTableAdapter tAdapter = new TimeTableTableAdapter();
                //по заданому DayID, ClassID, timeID обновляет subjID
                // UpdateData --> UPDATE `TimeTable` SET `SubjectID` = ? WHERE ((`DayID` = ?) AND (`ClassID` = ?) AND (`TimeID` = ?))
                tAdapter.UpdateData(subjID, DayID, ClassID, timeID);
            } 
        }     

         public void SaveDSToDB(){
             // кусок кода, который сохраняет таблицу TimeTable в БД
         }          


Вот собственно и все. У меня есть схема БД, а все остальное я ручками делаю. Можно, конечно, перед сохранением в БД создавать BindingSource, может чего и получится. Но думаю это не лучший выход.



Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  schema.JPG 43,70 Kb
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
thomas
Дата 6.11.2007, 12:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



MFSham, 
Привет.
Цитата

У меня нету BindingSource'ов. 

Я подумал, после того как ты написал
Цитата

Есть типизированный DataSet.

что ты работаешь в дизайнере. А при таком подходе студия сама генерит код и добавляет контролы на форму.

Ладно проехали.
Что касается твоего кода, то
- что делает первый метод private void FillDataSet(OleDbConnection con) понятно. Ты создаешь таблицу в ДатаСет и заполняешь её выбранными из БД данными.
  единственное что добавил бы, вот здесь dbAdapter.Fill(this.DS) не плохо бы явно указать имя таблицы в ДатаСет. Т.е. пишем dbAdapter.Fill(this.DS, "имя_таблички").
- а вот что делает твой второй метод public void UpdateTimeTable(List<string> subjList, int ClassID, int DayID) , я не совсем "вьехал в тему".
  На входе он получает в качестве параметров лист и два ID. Далее ты обявил две локальные переменные и присваиваешь им значения в цикле. Тоже в принципе понятно.
  А вот это 
Код

TimeTableTableAdapter tAdapter = new TimeTableTableAdapter();
//по заданому DayID, ClassID, timeID обновляет subjID
// UpdateData --> UPDATE `TimeTable` SET `SubjectID` = ? WHERE ((`DayID` = ?) AND (`ClassID` = ?) AND (`TimeID` = ?))
tAdapter.UpdateData(subjID, DayID, ClassID, timeID);

совсем не понятно. Что ты здесь должен сделать с данными в таблице ДатаСет?
Добавить строки или в имеющихся строках поменять значения SubjectID для строк с заданными значениями  DayID, ClassID, TimeID?

Исходя из структуры БД(ДС) в таблице TimeTable хранятся записи о в какой день в какое время какой класс что-то сделал с субьектом.
Ты что хочешь менять субьекты? Но как я понимаю эта таблица содержит историю того что происходило.
Ладно, даже если тебе необходимо менять субьект то делай это методами редактирования записей(строк) в таблице ДатаСет.
Т.е. сначала редактируешь значение row["SubjectID"] = новое значение(для строки с соответствующими значениями DayID, ClassID, TimeID), а потом когда все отредактировал сохраняй эти изменения в БД вызывая соответствующий метод для ДатаАдаптера (DataAdapter.Update(DataSet)).

Посмотри вот эту статью, почитай тут, а так же это и вот это.

Здается мне, что там ты найдешь решение.  smile 

Это сообщение отредактировал(а) thomas - 6.11.2007, 13:01


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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

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



thomas, привет.

Цитата(thomas @  6.11.2007,  12:55 Найти цитируемый пост)
а вот что делает твой второй метод public void UpdateTimeTable(List<string> subjList, int ClassID, int DayID) , я не совсем "вьехал в тему"
Цитата(thomas @  6.11.2007,  12:55 Найти цитируемый пост)
в имеющихся строках поменять значения SubjectID для строк с заданными значениями  DayID, ClassID, TimeID
это правильный ответ. Этот метод просто в DataSet изменяет таблицу TimeTable. Делается это через адаптер этой же таблицы(UpdateData). В коментах сам запрос UpdateData.

А теперь мне таблицу TimeTable надо обновить в БД, после обновления в DataSet'e. Думаю понятно)
Причем я изменяю только одну таблицу в DataSet'e(TimeTable), остальные даже не трогаю, просто при необходимости беру оттуда данные.

Цитата(thomas @  6.11.2007,  12:55 Найти цитируемый пост)
потом когда все отредактировал сохраняй эти изменения в БД вызывая соответствующий метод для ДатаАдаптера (DataAdapter.Update(DataSet)).
Так че-то не проходит(
Цитата(thomas @  6.11.2007,  12:55 Найти цитируемый пост)
Посмотри вот эту статью, почитай тут, а так же это и вот это.
Ссылки классные, почитал. Но че-то у меня, как не пытался аналогично сделать, не вышло( Буду пытаться дальше...

--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
thomas
Дата 7.11.2007, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



MFSham, 
К ДатаСет не возможно выполнить sql-запрос по определению. Это не база данных.
Я вижу, только одно решение:
находить строку в таблице датасет в которой присутствуют заданные значения DayID, ClassID, TimeID и редактировать значение поля SubjectID этой строки.
Код

row["SubjectID"] = новое значение

По другому ни как.
 
Кстати что ДатаАдаптер, что ТаблеАдаптер оба служат для выполнения манипуляцый с данными между базой данных и датасетом. И ничего не делают для манипуляйций с данными ВНУТРИ датасета. Это важно понимать.


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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

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



thomas, 
Цитата(thomas @  7.11.2007,  17:29 Найти цитируемый пост)
К ДатаСет не возможно выполнить sql-запрос по определению. Это не база данных.
К DataSet конечно нельзя, а вот к отдельной таблице можно.

Цитата(thomas @  7.11.2007,  17:29 Найти цитируемый пост)
находить строку в таблице датасет в которой присутствуют заданные значения DayID, ClassID, TimeID и редактировать значение поля SubjectID этой строки.
Да это все прекрасно работает smile Это и выполянет функция UpdateTimeTable.

Цитата(thomas @  7.11.2007,  17:29 Найти цитируемый пост)
Кстати что ДатаАдаптер, что ТаблеАдаптер оба служат для выполнения манипуляцый с данными между базой данных и датасетом. И ничего не делают для манипуляйций с данными ВНУТРИ датасета. Это важно понимать. 
И это прекрасно понятно))

У меня в том то и проблема, что не могу обновить данные в самой БД используя TableAdapter (при типизированном DataSet).

--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
thomas
Дата 8.11.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



MFSham, 
Приветствую.
Цитата

К DataSet конечно нельзя, а вот к отдельной таблице можно.

Не знаю, не знаю. Вчера вечером спецом переспросил нашего препода в школе, он придерживается такого же мнения: "SQL-команды применимы только к базам данных, но не к таблицам в ДатаСет".

Цитата

У меня в том то и проблема, что не могу обновить данные в самой БД используя TableAdapter (при типизированном DataSet).

Т.е. тут ты не знаешь что прописать?
Код

public void SaveDSToDB()
{
       // кусок кода, который сохраняет таблицу TimeTable в БД
}   


Из приведенного тобой выше кода, я углядел, что ДатаСет обьявлен на уровне класса, а ТаблеАдаптер ты обьвил на уровне метода (за пределами метода он не виден)
И обновлять свою БД ты хочешь из отдельного метода. В котором твой ДатаСет будет виден, а вот ТаблеАдаптер нет. А ведь для обновления нужно вызывать метод Update для ТаблеАдаптера. Вот изходя из этого и посмотри, что и как поменять в коде.
Успехов.  smile

Добавлено @ 14:12
Кстати еще раз внимаетльно глянул на твой код, приведенный в третьем посте.
Соединение с БД у тебя задается для dbAdapter = new OleDbDataAdapter(myCommand).
Соответственно этот обьект и нужно использовать для обновления БД.
Но его обьявление нужно вывести на уровень класса и инициацию произваодить либо в событии Load для формы, либо в конструкторе класса(если все действо происходит в классе).
Тогда ты сможешь вызвать метод Fill() обьекта dbAdapter в методе public void SaveDSToDB().



Это сообщение отредактировал(а) thomas - 8.11.2007, 14:15


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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

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



thomas, 
привет.
Цитата(thomas @  8.11.2007,  14:05 Найти цитируемый пост)
Т.е. тут ты не знаешь что прописать?

Да.

Долго так объяснять на пальцах что и почему smile
Вот архив с проектом. В классе DataManager метод FormClosed пытаюсь сохранить изменения в БД. Думаю когда запустишь поймешь что к чему. Может моя ася пригодится чего спросить - 488-921-623.

блин... ограничение на размер файла стоит... я тебе на мыло вышлю

Это сообщение отредактировал(а) MFSham - 8.11.2007, 16:29
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
thomas
Дата 8.11.2007, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



MFSham, 
Привет.
Цитата

Может моя ася пригодится чего спросить - 488-921-623.
К сожалению у меня Аси нет.
А проект посмотрю. Щас мыло проверю.

А что написать, я же тебе вроде обьяснил.
У тебя был создан ДатаАдаптер, вот его голубчика и заюзай в том методе.


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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 28.8.2005
Где: Беларусь, Гродно

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



Я фигею без баяна...

Вот уже 2 дня пытаюсь сделать это сохранение. От нечего делать запустил exe'шник. Дай думаю от туда попрбую сохранить. Попробовал, и о чудо, все сохранилось(!). Запускаю этот же проект из студии - не сохраняет smile

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

------
update.
В настройке БД свойтсво "Copy to output directory" стояло "Copy always". Поставил в "Copy if never" и все заработало. Наконец-то smile
thomas спасибо за попытки помочь ;)

Это сообщение отредактировал(а) MFSham - 9.11.2007, 16:11
--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
thomas
Дата 9.11.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



MFSham, 
Привет.
Рад, что у тебя наконец то получилось.  smile 
Цитата

В настройке БД свойтсво "Copy to output directory" стояло "Copy always".

Вот они, подводные камни typeddataset .  smile 
Кстати когда все делается через код (без датасета в дизайнере) таких граблей не возникает.  smile 
А я вчера весь вечер убил ковыряясь в твоем проекте. Ничего не нашел. Плюнул и пошел смотреть теннис.
И оттянулся по полной. Мария Юрьевна поборола Свету и вышла в полуфинал  smile  smile  smile  smile  smile 
А потом еще и Анна порадовала, после досадной баранки во втором сете, "конкретно" выиграла третий и тоже в полуфинале.  smile  
Короче после этого полночи не спал и сейчас почти никакой. Пока Мадрид не закончиться ничего другое в голову не лезет.

Модераторы SORRY за офтоп. Но душа поёт.  smile   smile 

 
MFSham, 
Успехов в дальнейшем.
А вообще программка на вид простая, но в нутри ты там такое замутил. Что без полбанки и не разберешь.

Добавлено через 2 минуты и 22 секунды
ЗЫ и пометь тему как решённую.


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

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

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

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


 




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


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

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