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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Импорт из DataTable в базу 
:(
    Опции темы
Voyager
Дата 24.10.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хотел бы узнать как лучше всего сделать импорт данных из локальной DataTable (или DataSet) в базу.
Структура базы: ID (decimal, pk), NAME (string), другие поля.

Есть файл xml, в который записана DataTable через DataTable.WriteXml. Для импорта читаю из файла DataTable как DataTable.ReadXml, затем нужно эти данные импортировать в базу (т.е. если в базе нет  ID - должна добавляться новая строка, если ID есть - обновляться поля строки с этим ID).

Это сообщение отредактировал(а) Voyager - 24.10.2007, 22:19
PM   Вверх
tol05
Дата 24.10.2007, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



а юзать DataTable.PrimaryKey Property  не получается?
ИМХО нужно после считывания таблицы из БД посмотреть есть ли у нее PrimaryKey. Если нет - добавить (пример с msdn по "DataTable.PrimaryKey Property")


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Voyager
Дата 24.10.2007, 22:21 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А причем тут это? smile Это я делаю. Меня интересует как импорт вкачать лучше в базу данных из файла.
PM   Вверх
tol05
Дата 24.10.2007, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Как это причем? 

При том, что не нужно один вопрос другим подменять. 

:(((

Это сообщение отредактировал(а) tol05 - 25.10.2007, 08:49


--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
thomas
Дата 24.10.2007, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Voyager, 
В общем так, у тебя есть таблица в ДатаСет(как ты ее получил твои проблемы) и ты хочешь на основании этой таблицы обновить таблицу в базе данных.
При  этом есть одна токость: если в базе данных существует запись с данным ID, то строка просто обновляется, если в базе нет строки с таким ID, то в базу записывается новая строка.
Правильно ли я тебя понял?
Если правильно, то юзай Update-команду ДатаАдаптера для твоего ДатаСета. Все.
Будет медленно, но сработает. 
Или в цыкле проходишь все строки таблицы ДатаСета и выполняешь каждый раз проверку на наличие ID в базе: если есть - update, нет - insert.
Но думаю это будет тоже не очень быстро.
Удачи.  smile 


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


Опытный
**


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

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



Цитата(thomas @  24.10.2007,  23:46 Найти цитируемый пост)
Правильно ли я тебя понял?

Правильно.

Цитата(thomas @  24.10.2007,  23:46 Найти цитируемый пост)
Если правильно, то юзай Update-команду ДатаАдаптера для твоего ДатаСета. Все.

Пробовал, ругается на уникальный PK_KEY в таблице в бд (видимо в случае когда такие ID в базе есть).

Но спасибо за ответ, буду еще пробовать.

Это сообщение отредактировал(а) Voyager - 25.10.2007, 12:45
PM   Вверх
thomas
Дата 25.10.2007, 14:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Voyager, 
Цитата

Пробовал, ругается на уникальный PK_KEY в таблице в бд (видимо в случае когда такие ID в базе есть).
Вот это в принципе не понятно. Если запись с таким ID есть в таблице БД и ты из ДС говоришь чтоб в нее внесли изменения, то проблем не должно быть. В этом случае просто должна выполняться update команда.
А вот если такого ID нет, то тут действительно скользкий момент. По идее нужно делать INSERT, но у меня в программе срабатывает и UPDATE. Я создаю в БД пустую таблицу, вызываю её в ДатаСет, там заполняю ее данными, через CommandBuilder генериться команда UPDATE(именно update проверял через брейкпойнты) и все данные из таблицы ДатаСет "закачиваются" в пустую таблицу БД. 

Покажи как выглядит у тебя sql-команда UPDATE. 


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


Шустрый
*


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

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



Всех приветствую! а какая субд? access ?mysql?

Это сообщение отредактировал(а) ArsNov - 25.10.2007, 20:01
PM MAIL ICQ   Вверх
Voyager
Дата 26.10.2007, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(thomas @  25.10.2007,  14:43 Найти цитируемый пост)
Покажи как выглядит у тебя sql-команда UPDATE. 

Сейчас у меня выглядит все так:
Код

DataTable ATable = new DataTable();
ATable.TableName = "MyTable";
DbDataAdapter Fdapter = CreateAdapter("select * from MyTable where ID = -1", true); // для получения схемы
Fdapter.Fill(ATable);

ATable.ReadXml(AFileName); // читаю из файла
ATable.PrimaryKey = new DataColumn[] { ATable.Columns["ID"] };

int cnt = Fdapter.Update(ATable); // здесь при апдейте вываливается ошибка

Текст ошибки:
violation of PRIMARY or UNIQUE KEY constraint "PK_MYTABLE" on table "MyTable"

То если ID есть в базе не может обновить?


ArsNov, да по сути неважно (но FireBird).

Это сообщение отредактировал(а) Voyager - 26.10.2007, 11:43
PM   Вверх
thomas
Дата 26.10.2007, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Voyager, 
Слушай, а твои данные из XML, что не содержат ID?
Я вижу что,  ты добавляешь в таблицу датасета после считывания данных из xml еще колонку с ID.
Если у тебя нет в xml ID, и тебе просто надо эти данные загнать в таблицу БД, и если там ID автонумерация, то выполняй просто INSERT в цикле(сделай foreach для строк в таблице ДС)
То БД сама присвоит ID. 
Если автонумерации в БД нет, то генери ID соответствующего формата, заполняй построчно эту колонку и потом только обновляй.

И еще совет обновление или insert делай в цикле. Так будет надежнее и быстрее. Напиши сам команду на update или insert и выполни ее программно(через dbCmd.ExecuteNonQuery() где dbCmd это обьект команды), а не
Код

int cnt = Fdapter.Update(ATable);
   


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


Опытный
**


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

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



Цитата(thomas @  26.10.2007,  19:24 Найти цитируемый пост)
Если у тебя нет в xml ID

Естественно есть.
Пока сделал импорт (обновление и вставку) через команды UpdateCommand, InsertCommand (т.е. проверяю сначала есть ли такой ID в базе, а потом инсерт или апдейт).

Это сообщение отредактировал(а) Voyager - 27.10.2007, 10:55
PM   Вверх
voodoo_alik
Дата 30.10.2007, 00:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



1. Если таблица в БД имеет такую-же структуру как DataTable, то тебе должен помочь объект SqlCommandBuilder.

2. Если тебе необходимо генерировать новое значение для первичного ключа, то это лучше делать встроенными средствами СУРБД, либо можно реализовать генератор самому.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

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

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

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


 




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


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

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