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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться с DataAdapter-ом 
:(
    Опции темы
Enuviel
Дата 6.11.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Извиняюсь, возможно, за столь тривиальный вопрос, но с ADO.NET  сталкиваюсь впервые...каша в голове...
Заполняю DataSet пустой базой данных(беру с сервера). Далее программно заливаю в этот датасет данные из xml(Не используя ReadXML. для добавления строк юзаю table.LoadDataRow(row.ItemArray, true);).
ДатаСет изменяется, а вот как передать это все в базу данных никак не могу понять:((
dataAdapter.Update(dataSet1)-  не чего не делает..хотя это наверное и понятно никаких делит, инсерт апдейт комманд я ему не задавала, так и не смогла понять как это лучше сделать.
так как таблицы связаны...CommandBuilder  не подходит  я так понимаю.

Попутный вопрос. У меня есть 10- таблиц в базе данных. Я их все засовываю в датасет, и дальше работаю уже с ним. Вопрос:датаадаптер должен быть один?или для каждой таблице свой, так как  мне придется вставлять,изменять, удалять данные из каждой таблицы?

PM MAIL   Вверх
thomas
Дата 6.11.2007, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Enuviel, 
Приветствую на форуме.  smile 
Цитата

ДатаСет изменяется, а вот как передать это все в базу данных никак не могу понять:((

Код в студию.
И некоторые пояснения про структуру таблиц и как получили в ДатаСет таблицы из БД.
Цитата

Попутный вопрос. У меня есть 10- таблиц в базе данных. Я их все засовываю в датасет, и дальше работаю уже с ним. Вопрос:датаадаптер должен быть один?или для каждой таблице свой, так как  мне придется вставлять,изменять, удалять данные из каждой таблицы?

В принципе можно использовать и один ДатаАдаптер. И все операции с таблицами провидить через обьект команд.
А можно и для каждой таблицы создать свой ДатаАдаптер и работать через них. 

ЗЫ а на каком языке пишем? 



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


Новичок



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

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



Пишу на С#.

Датасет заполняю тупо всем что есть в базе данных(так как еще нужен будет экспорт и необходимо отображать все взаимосвязанные изменения без подключения к базе). Далее планирую данные выбирать из датасета запросами и потом уже их выводить на ДатаГридВьюв.
Получаю данные с сервака так
Код

            using (IDbConnection connectData = DbTools.initConnection(0, cs))
            {
                IDbCommand textCommand = connectData.CreateCommand();
                textCommand.CommandText = "Select * FROM PARAMS;" + "Select * FROM APARAMS;" + "Select * FROM DPARAMS;" + "Select * FROM VPARAMS;" + "Select * FROM GROUPS;" + "Select * FROM DEVICES;" + "Select * FROM SCALES;" + "Select * FROM SCRIPT_ENGINES;"
                     + "Select * FROM USERS;" + "Select * FROM DSCALES";
                dataAdapter = DbTools.initDataAdapter(0, textCommand);
                dataAdapter.Fill(dataSet1);
            }

 далее есть определенная структура хмл откуда получаю данные и заливаю в датасет....ниже код
Код

     public static void parseInXml(DataSet dataSet1, String adrXML)
        {
            dataSet1.Clear();
            XmlDocument doc = new XmlDocument();
            doc.Load(adrXML);
            XmlElement root = doc.DocumentElement;

            foreach (XmlNode childNode in root.ChildNodes)
            {
                foreach (DataTable table in dataSet1.Tables)
                {
                    if (((XmlElement)childNode).GetAttribute("NAME").Equals(table.TableName))
                    {
                        foreach (XmlNode childNode1 in childNode.ChildNodes)
                        {

                            DataRow row=table.NewRow(); 
                            foreach (XmlNode childNode2 in childNode1.ChildNodes)
                            {
                               
                                if (((XmlElement)childNode2).GetAttribute("TYPE").Equals(""))
                                {
                                    String s = ((XmlElement)childNode2).GetAttribute("VALUE");
                                    int k=int.Parse(s);
                                    row[((XmlElement)childNode2).GetAttribute("NAME")] = k;

                                }
                                else if (((XmlElement)childNode2).GetAttribute("TYPE").Equals("string"))
                                {
                                    row[((XmlElement)childNode2).GetAttribute("NAME")] =((XmlElement)childNode2).InnerText;
                                }
                                else if (((XmlElement)childNode2).GetAttribute("TYPE").Equals("float"))
                                {
                                     row[((XmlElement)childNode2).GetAttribute("NAME")] = double.Parse(((XmlElement)childNode2).GetAttribute("VALUE"));

                                }
                          
                     
                            }
                            table.LoadDataRow(row.ItemArray, false);
                        }
                        break;

                    }
                }
            }

раньше здесь  table.LoadDataRow(row.ItemArray, false); было труе...изменила на фалзе..что  бы  RowState  был правильный(Added)
Теперь я как я понимаю надо прописать insertCommand?
.

Добавлено через 4 минуты и 57 секунд
к выше сказанному..на данный момент используется SQLClient...
PM MAIL   Вверх
thomas
Дата 6.11.2007, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Enuviel, 
Вот с таким 
Код

using (IDbConnection connectData = DbTools.initConnection(0, cs))
            {
                IDbCommand textCommand = connectData.CreateCommand();
                textCommand.CommandText = "Select * FROM PARAMS;" + "Select * FROM APARAMS;" + "Select * FROM DPARAMS;" + "Select * FROM VPARAMS;" + "Select * FROM GROUPS;" + "Select * FROM DEVICES;" + "Select * FROM SCALES;" + "Select * FROM SCRIPT_ENGINES;"
                     + "Select * FROM USERS;" + "Select * FROM DSCALES";
                dataAdapter = DbTools.initDataAdapter(0, textCommand);
                dataAdapter.Fill(dataSet1);
            }

еще не сталкивался.
Я бы делал это с одним ДатаАдаптером но для каждой таблицы отдельно. Примерно так
Код

# region declaration  
        private OleDbConnection con = new OleDbConnection();
        private OleDbCommand cmd = new OleDbCommand(); 
        private OleDbDataAdapter da = new OleDbDataAdapter();       
        private DataSet ds = new DataSet();
        #endregion
con.ConnectionString ="пишем свою строку соединения";
cmd.Connection = con;
da = new OleDbDataAdapter(cmd);
con.Open(); // в принципе не обязательно, но я так делаю для нагладности
cmd.CommandText = "select * from categories"; //SELECT команда для первойц таблицы
da.Fill(ds, "kategori");                      //выполнили первую команду и указываем ЯВНО имя таблицы в ДатаСете, куда пойдут эти данные
cmd.CommandText = "select * from employees"; //SELECT команда для второй таблицы
da.Fill(ds, "bedienden");                    //выполнили вторую команду
con.Close(); // ЯВНО закроем соединение


А можно для каждой таблицы делать свой ДатаАдаптер и через него создавать таблицу в ДатаСет и заполнять данными.
Потом его же использовать для delete, insert и update базы данных на сервере.

И тут полезно воспользоваться  
Код

cmdBuild = new SqlCommandBuilder(da);
da.InsertCommand = cmdBuild.GetInsertCommand();
da.Update(ds.Tables["имя конкретной таблицы в ДатаСет"]);
 

И не плохо бы вам полазить по этому сайту.




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


Новичок



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

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



Вот то самое с чем не сталкивались..просто реализация  для любой базы, скажем так что бы не работать с ОлеДБ..т е при MSSQL SqlClient Oracle OracleClient  а при все остальном соответственно OleDb.
 Расскажите а есть разница между тем что бы сразу добавить все одним огромным селектом в датасет и по отдельности?
в моем случае я могу потом ренейм сделать всех таблиц и все.

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


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


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

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



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

А приложение будет работать со всеми
 Не совсем понятно. Хотите сказать, что из одной программы будете работать с разными типами баз данных? Сегодня с MS SQL, завтра Oracl, а там не плохо и по "мускулу" пошарить.
DbTools у вас свой отдельный класс?
Цитата

есть разница между тем что бы сразу добавить все одним огромным селектом в датасет и по отдельности?

Честно не знаю. Один большой select что-то новое, для меня.
На мой взгляд, если по отдельности, то каждая таблица получит своё имя в ДатаСет, а не только индекс по умолчанию.
Далее в коде программы обращения к таблицам дата сет будут выглядеть нагляднее и понятнее. 
При большом селекте таблицы получают только индекс. И какой индекс подразумевает какую таблицу вы понятия не имеете.
Цитата

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

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

Вот такие мысли.  smile

Добавлено через 4 минуты и 17 секунд
Как отправную точку в чтении документации могу посоветовать эту.


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


Новичок



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

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



Цитата

 Не совсем понятно. Хотите сказать, что из одной программы будете работать с разными типами баз данных? Сегодня с MS SQL, завтра Oracl, а там не плохо и по "мускулу" пошарить.

Именно это и хочу сказатьsmile)))

Цитата

DbTools у вас свой отдельный класс?

 
Да это  отдельный класс, который создает в зависимости от прешедших значений(выбрана для работы МССКУЛь, Оракле)  нужного провайдера..

Цитата

Честно не знаю. Один большой select что-то новое, для меня.

 Большой селект..называется пакетным запросом SQL, но как выяснилось клиент .NET  Oracle  с ним работать не умеет. Пришлось уйти к  10 датаАдаптарам.

Цитата

На мой взгляд, если по отдельности, то каждая таблица получит своё имя в ДатаСет, а не только индекс по умолчанию.

 делаешь что то типа 
Код

  dataAdapter.TableMappings.Add("Table", "PARAMS");
  dataAdapter.TableMappings.Add("Table1", "APARAMS");
  dataAdapter.TableMappings.Add("Table2", "DPARAMS");

перед датаАдаптер.Филл и получаешь  то что нужно!


Цитата

Если ваше приложение должно рабоать с разными типами баз данных, то для каждого типа вы как минимум должны задать провайдера данных и для него создать обьект ДатаАдаптер и уже для него CommandBuilder.


Ага, уже нашла что есть для всех провайдеровsmile
Но у меня не все таблицы для него подходят, так что ручками тоже придется пописать!

В общем thomas все равно спасибо!
А читать лучше книжки, а потом уже только МСДН!

PM MAIL   Вверх
thomas
Дата 8.11.2007, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Enuviel, 
Приветствую.
Тут я имел в виду несколько другое
Цитата

делаешь что то типа 
    
  dataAdapter.TableMappings.Add("Table", "PARAMS");
  dataAdapter.TableMappings.Add("Table1", "APARAMS");
  dataAdapter.TableMappings.Add("Table2", "DPARAMS");

перед датаАдаптер.Филл и получаешь  то что нужно!

Имя таблицы я указываю как параметр метода Fill ДатаАдаптера.
См. мой второй пост в этой теме.
Код

cmd.CommandText = "select * from categories"; //SELECT команда для первойц таблицы
da.Fill(ds, "kategori"); //создаем и заполняем таблицу в ДатаСет с ОПРЕДЕЛЕННЫМ именем.


Цитата

Именно это и хочу сказать

А поподробнее можно рассказать о задачах и области применения приложения, создаваемого вами.

С наилучшими пожеланиями.  smile 



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


Новичок



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

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



 С  адаптерами разобралась...Вроде как работает. 

Цитата

А поподробнее можно рассказать о задачах и области применения приложения, создаваемого вами.

Есть конретная структура базы данных.
Приложение будет уметь создавать базу, импортить, экспортить, ну и основное действия(удаление,изменение, вставка строк,фильтры).
Оно нужно только для удобства работы с базами ну и получения хмлек.


Попутный вопрос. 
Вот имеется в наличии ДАтасет полная копия БД со всеми релайшенами. Все бы хорошо..но теперь мне надо на датаГрид выводить три таблицы которые являются запросами по всему датасету(к дататейблу вроде как можно делать запрос).

Зачем я беру полную копию:необходимо что бы без подключения к базе происходили изменения во всех связанных таблицах, а так как запрос не затрагивает поля с внешними ключами...решила брать весь, и как то надо  теперь тянуть данные оттуда на датагрид. Что бы при изменение все изменялось в автономном режиме. А при нажатии кнопки апдейт..вносить изменения на сервер.

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

Может кто делал что то подобное?

PM MAIL   Вверх
thomas
Дата 8.11.2007, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Enuviel, 
Несколько замечаний к тому что вы написали.
Цитата

Вот имеется в наличии ДАтасет полная копия БД со всеми релайшенами.

Значит ли это, что вы создали программно связи таблиц в ДатаСет?
Цитата

к дататейблу вроде как можно делать запрос

вроде как не предусмотрено вообще.  smile Sql-команды используются ТОЛЬКО при обращении к БД. Там (в БД) они и выполняются. В ДатаСет можно использовать обьекты View и BindingSource для фильтрации нужных данных.
Цитата

мне надо на датаГрид выводить три таблицы которые являются запросами по всему датасету
В данном случае нужно сделать еще одну таблицу в ДатаСет на ОСНОВАНИИ запроса к таблицам БД и уже эту таблицу ДатаСет передавать DataGridView для отображения.
Код

myDataGridView.DataSource = myDataSet;
myDataGridView.DataMember = "имя нужной таблицы";


Теперь далее.
Если вы хотите в контролах отображать данные из связанных таблиц (данные из одной таблицы в текст боксах, а связанные с ними данные из другой таблицы в датагриде) и при перемещении по записям в одной должны происходить изменения отображения в другой, то для этого нужно использовать обьект(ы) BindingSource(BindingNavigator). Он позволяет вносить изменения в обе таблицы. 

А идея с двумя ДС не правильна.

Добавлено через 7 минут и 42 секунды
Цитата

с ADO.NET  сталкиваюсь впервые.

Советую в книгах, а потом в msdn еще раз прочитать про ДатаСет и его содержимое. Что, как и с чем взаимодействует.

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


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


Новичок



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

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



Цитата

Значит ли это, что вы создали программно связи таблиц в ДатаСет?


Да.

Цитата

вроде как не предусмотрено вообще.  smile Sql-команды используются ТОЛЬКО при обращении к БД. Там (в БД) они и выполняются. 


Я имела ввиду что то типа этого dataset.tables[0].select();

Цитата

В данном случае нужно сделать еще одну таблицу в ДатаСет на ОСНОВАНИИ запроса к таблицам БД и уже эту таблицу ДатаСет передавать DataGridView для отображения.


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


Цитата

Теперь далее.
Если вы хотите в контролах отображать данные из связанных таблиц (данные из одной таблицы в текст боксах, а связанные с ними данные из другой таблицы в датагриде) и при перемещении по записям в одной должны происходить изменения отображения в другой, то для этого нужно использовать обьект BindingSource. Он позволяет вносить изменения в обе таблицы. 


...просто есть главное мди окно, у него 10 дочерних с таблицами...Вот в первом произошло изменение хочу что бы открыли связанную с ним таблицу и там тоже было изменение...вот..
а про биндингСоурс еще не дочитала..

Цитата

А идея с двумя ДС не правильна.


Мэй би..мэй би..я же не гуроsmile и не генийsmile мне просто надо сделатьsmile
хотя эта идея наверное имеет смысл.

Добавлено через 1 минуту и 4 секунды
Цитата

Советую в книгах, а потом в msdn еще раз прочитать про ДатаСет и его содержимое. Что, как и с чем взаимодействует.

 уже просто обчиталасяsmile
PM MAIL   Вверх
thomas
Дата 8.11.2007, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Enuviel, 
Цитата

уже просто обчиталася  smile 

Я вот тоже сижу читаю, хотя своих дел по горло.  smile 
А все  smile 
Цитата

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

Сейчас придумаем.



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

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

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

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


 




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


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

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