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

Поиск:

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


Новичок



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

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



Всем привет. 
Задача: 
1) Установить соединение с удаленной базой MySQL;
2) Получить набор данных;
3) Сохранить полученые данные в локальной базе MSAccess.

Сделано и работает:
1) , 2)
а вот с 3 пунктом проблема. Проект на C# 2008. 
В проекте создана xsd схема clientsDataSet, в которой присутствуют все таблицы из локальной mdb. 
Так же в проекте присутствует dataGridView, который ассоциирован с clientsDataSet

Код

MySqlConnection mysqlCon = new MySqlConnection();
MySqlCommand mysqlComm = new MySqlCommand();
DataSet mds = new DataSet();
mds = clientsDataSet.Clone();
mysqlCon.ConnectionString = "Server=server;uid=login;pwd=pass;Database=dbname;";
mysqlCon.Open();
mysqlComm.Connection = mysqlCon;
mysqlComm.CommandType = CommandType.Text;
mysqlComm.CommandText = "SELECT * FROM table";
mysqlDAdapter = new MySqlDataAdapter(mysqlComm);
mds.Clear();
mds.EnforceConstraints = false;
mysqlDAdapter.Fill(mds.Tables["tblPerson"]);
mysqlCon.Close();
      foreach (DataRow dr in mds.Tables["tblPerson"].Select())
            {
                //this.tblPersonTableAdapter.Insert(**********); с этой строчкой работает и данные сохраняются, но очень медлено.
                this.clientsDataSet.tblPerson.ImportRow(dr); // Вот эта строчка загружает данные в clientsDataSet, и в dataGridView данные появляются, но сохранить их в локальную базу mdb не получается
            }
      this.tblPersonTableAdapter.Update(clientsDataSet.tblPerson); // Адаптеры для таблиц созданы автоматически при создании xsd схемы.
       

Поискал на форуме что-то похожее, нашел вот эту тему http://forum.vingrad.ru/forum/topic-165417/unread-1.html Есть предположение, что проблема схожа, но как решить незнаю. 
Возможно есть другой путь решения.

Жду помощи)
PM MAIL   Вверх
guro
Дата 27.4.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Стоило написать на форуме)), как вскоре пришла идея. Магическая сила форума помогла мне  smile 

Добавил в foreach строчку, которая принудительно устанавливает RowState в состояние Added. Коряво, но работает. 
Код

int i = 0;
foreach (DataRow dr in mds.Tables["tblPerson"].Select())
{
     this.clientsDataSet.tblPerson.ImportRow(dr);
     this.clientsDataSet.tblPerson.Rows[i].SetAdded();
     i++;
}

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

Может всётаки кто нибудь знает более красивый способ занесения данных из DataSet в БД?
PM MAIL   Вверх
Idsa
Дата 27.4.2009, 11:42 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

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



 smile 

Цитата(guro @  27.4.2009,  15:20 Найти цитируемый пост)
Может всётаки кто нибудь знает более красивый способ занесения данных из DataSet в БД? 

Не использовать DataSet  smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
1stain
Дата 27.4.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 486
Регистрация: 30.7.2007
Где: Киев - Харьков

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



Код

mysqlDAdapter = new MySqlDataAdapter(mysqlComm);
mysqlDAdapter.AcceptChangesDuringFill = false;

Цитата(guro @  27.4.2009,  11:20 Найти цитируемый пост)
может получиться что в БД уже существуют загружаемые строки.

ну так используй один датасет: прочитал из ацесс, потом туда же прочитал из мускула и записал в ацесс


--------------------
Все знают, что это невозможно. Но вот приходит невежда, которому это неизвестно - он-то и делает открытие. (Albert Einstein)
user posted image
PM MAIL   Вверх
Idsa
Дата 28.4.2009, 06:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

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



Цитата(1stain @  27.4.2009,  17:33 Найти цитируемый пост)
ну так используй один датасет: прочитал из ацесс, потом туда же прочитал из мускула и записал в ацесс 

То есть Вы предлагаете при каждом обновлении полностью считывать в DataSet базу из Access? Хм...

Задача выглядит как кросс-СУБД'шная репликация... Чем вызвана такая потребность? Было бы гораздо проще использовать одну и ту же СУБД и воспользоваться стандартными средставами репликации.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
guro
Дата 28.4.2009, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Idsa @  28.4.2009,  06:35 Найти цитируемый пост)
Было бы гораздо проще использовать одну и ту же СУБД и воспользоваться стандартными средставами репликации.

Согласен, проще. Я бы так и сделал, верней даже не так. А просто использовал бы основную рабочую базу (MySQL) и брал из неё данные в приложение.
Но человек поставивший мне задачу, хочет иметь некую часть (список пользователей и их данные) основной базы (MySQL) у себя, скажем так, на флешке.  smile 

PM MAIL   Вверх
Idsa
Дата 28.4.2009, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

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



guro, хм... а поднять у него MySQL нельзя?

Добавлено через 3 минуты и 45 секунд
Хотя если на флешке...


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
guro
Дата 28.4.2009, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



В связи с недостатком личного контакта с этим человеком, не могу его убедить использовать вебинтерфейс для поставленой задачи. Вот и ищу способ решения.
PM MAIL   Вверх
Idsa
Дата 28.4.2009, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

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



Цитата(guro @  28.4.2009,  14:11 Найти цитируемый пост)
В связи с недостатком личного контакта с этим человеком, не могу его убедить использовать вебинтерфейс для поставленой задачи.

Постарайтесь все-таки найти личный контакт с заказчиком, ибо синхронизация разнородных баз - это огромный костыль. Если возьметесь реализовывать, наверняка возникнут косяки с кодировками, несоответствием типов и т. д. А веб-интерфейс - отличное решение:
1. Доступ есть отовсюду (нужен лишь интернет). В случае же с Access'ом нужен полноценный комп (насколько я знаю, даже под WinMobile нет реализации Access; я уж не говорю про обычные сотовые).
2. Всегда доступны актуальные данные (а не данные, полученные при последней синхронизации)
3. Можно сэкономить на флешке smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Lite
Дата 28.4.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

PM MAIL   Вверх
guro
Дата 29.4.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Обновлю темку.
Есть такой метод LoadDataRow - Находит и обновляет конкретную строку. Если нужная строка не найдена, то с помощью заданных значений создается новая строка.
Код

foreach (DataRow dr in mds.Tables["tblPerson"].Select())
{
     this.clientsDataSet.tblPerson.LoadDataRow(dr.ItemArray, false);
}
this.tblPersonTableAdapter.Update(clientsDataSet.tblPerson);

Вопрос решен. Всем спасибо за участие.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

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

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

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


 




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


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

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