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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение данных в БД (свой Update) и поле ID. VS 2005 
:(
    Опции темы
Papirus
Дата 1.7.2007, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Собственно говоря, проблема со вставкой данных (Insert). Есть необходимость самому прописать обновление данных, т.к. то, что отображается в гриде - результат объединения нескольких таблиц + некоторые проверки непосредственно в селекте... и т.д. Короче, я посчитал, что проще по примеру VS2003, а возможно и VS2005 в пакет инструкций добавлять Select (SelectCommand.CommandText), в котором ID = identity. Сохранение производится стандартно: 
Код

Dim tblChange As New DataTable = tbl.GetChanges
        For Each rw As DataRow In tblChange
            Select Case rw.RowState
                Case DataRowState.Added
                Case DataRowState.Deleted
                Case DataRowState.Modified

            End Select
        Next


Сохранение производится нормально. Однако, пока не удается полученную из БД строку подставить вместо обрабатываемой. 
Пробовал так (CmdIns - сохраненный объект SqlCommand для вставки данных, cnn - SqlConnection, tbl - обновляемая таблица):
Код

Dim tblChange As New DataTable = tbl.GetChanges
        For Each rw As DataRow In tblChange
            Select Case rw.RowState
                Case DataRowState.Added
                       cnn.Open()
                       Dim rd As SqlDataReader = CmdIns.ExecuteReader
                       Dim tb As New DataTable 
                       tb.Load(rd)
                       rd.Close()
                       cnn.Close()
                       rw.ItemsArray = tb.Rows(0).ItemsArray ' это работает, если поле ID не автоинкремент. В противном случае - сообщение об ошибке ID is ReadOnly
         
                      tbl.Merge(tb)
                      rw.Delete()  ' вот как быть здесь не знаю(?????????) пока. Без Dalete в гриде видим удвоенное количество этих строк. А с Delete  опять ошибка, но уже в связи с изменением в коллекции... :dash1 
                      rw = tb.Rows(0)
                Case DataRowState.Deleted
                Case DataRowState.Modified

            End Select
        Next


А значение ID обязательно надо иметь для последущей работе клиента с данными... smile

Добавлено через 5 минут и 26 секунд
Может после заполнения таблицы удалять Primary Key?
PM MAIL ICQ   Вверх
thomas
Дата 2.7.2007, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Papirus, 
Честно говория ничего не понял. 
Цитата

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

Куда нужно подставить строку из БД?
Если
Цитата

то, что отображается в гриде - результат объединения нескольких таблиц + некоторые проверки непосредственно в селекте... и т.д.


Так очисти DataGrigView  и заполни снова, но уже после обновления БД.


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


Опытный
**


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

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



Цитата(thomas @  2.7.2007,  10:29 Найти цитируемый пост)
Честно говория ничего не понял. 

Значит такой корявый у меня язык. Постараюсь исправиться.
Цитата(thomas @  2.7.2007,  10:29 Найти цитируемый пост)
Куда нужно подставить строку из БД?

Источником данных для грида является таблица предварительно созданная (Dim tbl as New DataTable) и заполненная с помощью датаридера. 
Пользователь внес свои изменения. Что-то добавил, что-то удалил, а что-то модифицировал. Щелкнул кнопку "Сохранить". Процедуру сохранения данных смотри в 1-м посте. В БД "улетает" штук 5 значений, в основном ID из других таблиц, а в гриде должно отобразиться штук 15. Если  сформировать объект комманд вида 
Код

Insert Into T1 (F1, F2, F3, F4) Values (@F1, @F2, @F3, @F4); Select T1.F1, T1.F2, T1.F3, T1.F4, T2.F5, T3.F6... From T1, T2, T3... Where ... Id = identity

В результате получим из БД строку с нужными значениями, в т.ч. и сгенерированным ID (строку получаем можете не сумлеваться). Таким образом, задача сводится к тому, чтобы в таблице - источнике данных для грида отобразились все эти значения. Один путь, как я уже говорил, не срабатывает из-за того, что поле ID этой самой таблицы ReadOnly и rw.ItemsArray = tb.Rows(0).ItemsArray выдает ошибку. А второй путь tbl.Merge(tb) приводит к тому, что записей в копии таблицы на клиенте становится 2 - одна исходная, которая обрабатывалась, заполненная частично, и только нужными числовыми значениями, а вторая - полученная из БД. Во втором случае вопрос стоит куда девать эту первую уже не нужную запись? rw.Delete() останавливает цикл обработки по ошибке... что-то там с Enumerator' ом коллекции.
Цитата(thomas @  2.7.2007,  10:29 Найти цитируемый пост)
Так очисти DataGrigView  и заполни снова, но уже после обновления БД.

Т.е. очистить таблицу и заполнить заново? И так при каждом сохранении? smile 
PM MAIL ICQ   Вверх
thomas
Дата 2.7.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Papirus, 
SQL- команда INSERT INTO добавляет строку в таблицу БД.
А вот команда SELECT позволяет получить данные из БД.
Это я к 
Цитата

В результате получим из БД строку с нужными значениями



Цитата

Т.е. очистить таблицу и заполнить заново? И так при каждом сохранении?


 Таблица то в памяти, в чем проблема чтобы ее очистить и заполнить снова, только нужными значениями(не надо всю базу тащить в память). Тебя я так понимаю нужна  то всего одна строка. 


И потом зачем DataReader, а не  DataAdapter?

Напиши SELECT команду к БД, выполни ее заполни таблицу в ДатаСет и отобрази ее в гриде.
Юзер внес какие-то изменения( я так понимаю новые данные раз надо добавлять строку в БД), ты сохранил это в БД. (в твоем случае INSERT команда).
Далее тебе нужно видеть что же там получилось?(так как БД генерит ID) Для этого нужно обновить таблицу в ДатаСет, а для этого по новой выполнить SELECT команду к БД. Перед этим очистить таблицу в ДатаСет.
Все. ADO.NET  smile 


Это сообщение отредактировал(а) thomas - 2.7.2007, 12:06


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


Опытный
**


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

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



Цитата(thomas @  2.7.2007,  12:04 Найти цитируемый пост)
Для этого нужно обновить таблицу в ДатаСет, а для этого по новой выполнить SELECT команду к БД. Перед этим очистить таблицу в ДатаСет.

Этого-то как раз и хочется избежать. Заполнять каждый раз при сохранении одной-двух-трех записей всю таблицу (пока 7-8 тысяч строк), имхо не производительно, да и после сохранения каждой записи мне нужен ID для обновления связанных таблиц.
При этом датасетов у меня нет и каскады затевать тоже как-то "влом".
PM MAIL ICQ   Вверх
thomas
Дата 3.7.2007, 10:49 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Papirus, 
У меня только один вопрос
Цитата

таблицу (пока 7-8 тысяч строк)

А нужны ли все они юзверю, а? Сколько строк он может увидеть на экране? Я думаю что, стандарт сейчас 1024х768, а не как у меня 1200х1600 (20" и повернут на 90). Так что много он не увидит, да и я тоже.

Плюс не забывай ID присваивается базой, а значит ты можешь его получить только повторно обратившись к базе с запросом на выборку. 
Хотя тут есть один трюк, если используется автонумерация, то
Код

string sql = "SELECT MAX(FieldID) FROM TableName";

выполни метод ExecuteScalar() и получишь свой ID.

Цитата

При этом датасетов у меня нет 

Очень интересно ...   smile 


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


Опытный
**


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

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



Цитата(thomas @  3.7.2007,  10:49 Найти цитируемый пост)
А нужны ли все они юзверю, а? 

Это справочник товаров и их составных частей. Пользователь должен видеть их все. Он так хочет. Списком. Хотя и предусмотрена группировка и отображение в виде дерева с подгрузкой списка по типам.
Цитата(thomas @  3.7.2007,  10:49 Найти цитируемый пост)
Плюс не забывай ID присваивается базой,

Это-то как раз и была суть моего вопроса (см. мой пост от 02.07.2007 11:27). Если, как я писал выше, CommandText включает инструкцию Select 
Код

Insert Into MyTable (Field1, Field2) Values(@Field1, @Field2); Select ID, Field1, Field2 From MyTable Where ID = Scope_Identity()

то после выполнения InsertCommand.ExecuteReader получаем назад нужную строку со всеми потрохами... В том числе и со сгенерированным базой ID. И потом этот ID мне нужен не просто в виде переменной, а как значение соответствующего свойства DataRow, чтобы пользователь мог продолжить добавление/удаление/редактирование комплектующих (т.е. данных в подчиненных таблицах) и самой этой записи...
Цитата(thomas @  3.7.2007,  10:49 Найти цитируемый пост)
При этом датасетов у меня нет Очень интересно ...    

"Это же БУБЛЬ-ГУМ!!!!" (с)  smile  Это ж VS2005 - здесь источником данных м.б. отдельная DataTable, не связанная с датасетом. И при этом не надо тянуть xml-структуру датасета, что бывает иногда тормознуто.

ПыСы. Проблемку я вроде решил. Если кому интересно могу сообщить как.

PM MAIL ICQ   Вверх
thomas
Дата 4.7.2007, 08:27 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Papirus, 
Вы меня конечно извините, но
Цитата

Это ж VS2005 - здесь источником данных м.б. отдельная DataTable, не связанная с датасетом.

Это БСК.

Цитата

    *  Класс DataSet содержит коллекцию таблиц данных Tables, а также коллекцию Relations объектов DataRelation.
    * Класс DataTable содержит коллекцию строк таблицы Rows, коллекцию столбцов данных Columns, а также коллекции связей данных ChildRelations и ParentRelations.
    * Класс DataRow содержит свойство RowState, значение которого указывает, были ли изменены строки с того момента, как таблица была впервые загружена из базы данных, а если были, то каким образом. Возможные значения свойства RowState включают в себя Deleted, Modified, New и Unchanged.

Читаем здесь.

Цитата

Объект DataTableCollection

Объект DataSet ADO.NET содержит ноль или более таблиц, представленных объектами DataTable. Все объекты DataTable объекта DataSet содержатся в коллекции DataTableCollection.

Объект DataTable определен в пространстве имен System.Data; эти объекты служат для представления таблицы, находящейся в памяти данных. В объекте содержится коллекция столбцов, представленных объектами DataColumnCollection и ограничений, представленных объектами ConstraintCollection, формирующими схему таблицы. Данные объекта DataTable расположены в коллекции столбцов DataRowCollection. В объекте DataRow хранится не только его текущее состояние, но и исходные данные, позволяющие отслеживать изменения данных.

Читаем здесь.

Архетиктура ADO.NET.

DataSet class.

DataTable class.

Цитата

И при этом не надо тянуть xml-структуру датасета, что бывает иногда тормознуто.

Интересно, откуда Вы тянете структуру ДатаСет, из Базы Данных?   smile  Ню-ню.  smile 

ЗЫ "Бред Сивой Кобылы" = любимая призказка моего преподавателя по специальности в моем первом высшем учебном заведении.

ЗЫ ЗЫ 
Цитата

Проблемку я вроде решил. 
 Я рад за Вас.  smile 

Это сообщение отредактировал(а) thomas - 4.7.2007, 08:29


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


Эксперт
****


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

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



Цитата(thomas @  4.7.2007,  08:27 Найти цитируемый пост)
Это БСК.

Ничего не БСК. Источником данных действительно может быть DataTable. Причем в случае использования одной таблицы даже рекомендуется использовать именно DataTable, а не DataSet.



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


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


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

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



Idsa, 
А где находиться эта DataTable, которая является источником данных? 


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


Эксперт
****


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

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



Цитата(thomas @  4.7.2007,  16:04 Найти цитируемый пост)
А где находиться эта DataTable, которая является источником данных? 

В оперативной памяти smile

Смотрим в MSDN справку по свойству DataGridView.DataSource:
Цитата

The DataGridView class supports the standard Windows Forms data-binding model. This means the data source can be of any type that implements one of the following interfaces:
1) The IList interface, including one-dimensional arrays.
2) The IListSource interface, such as the DataTable and DataSet classes.
3) The IBindingList interface, such as the BindingList class.
4) The IBindingListView interface, such as the BindingSource class.


thomas, обрати внимание на пункт 2.


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


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


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

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



Idsa, 
то что таблица в памяти это не вопрос.
Я имею ввиду, то что DataTable после ее создания помещается в DataSet. 

А в приведенной цитате пункт 2 я понимаю так
ДГВ поддерживает следующие интерфейсы: IListSource интерфейс такой как (such as) DataTable и DataSet классы.

И так понятно что ДГВ связан с определенной таблицей в ДатаСет.

Из всего что я на данный момент прочитал в msdn и в книгах по ADO.NET. а так же чего нам рассказывал препод в вышке

Существуют: 
Источник данных(БД, файл Excel, xml, текстовый файл) + различные типы провайдеров данных + датаадартеры + датасет
А в датасет может быть одна или много таблиц или 0 таблиц. 

Архитектура ADO.NET

Это сообщение отредактировал(а) thomas - 4.7.2007, 16:56


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


Эксперт
****


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

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



thomas, вот ты пишешь:
Цитата(thomas @  4.7.2007,  16:53 Найти цитируемый пост)
И так понятно что ДГВ связан с определенной таблицей в ДатаСет.

Действительно, DataSet не что иное, как обертка над DataTable. Но если нам не нужны навороты DataSet, почему бы не сэкономить память и не повысить производительность, использовав непосредственно DataTable?!

Далее ты пишешь:
Цитата(thomas @  4.7.2007,  16:53 Найти цитируемый пост)
Источник данных(БД, файл Excel, xml, текстовый файл) + различные типы провайдеров данных + датаадартеры + датасет

Вместо последнего пункта может быть не только DataSet, но любой компонент, удовлетворяющий условиям, которые я приводил выше.

Если мне так и не удалось тебя убедить, создай Windows-приложение, создай объект DataTable, затем выполни dataAdapter.Fill(dataTable) и прикрути к DataGridView: DataGridView.DataSource = dataTable.




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


Опытный
**


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

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



Цитата(Idsa @  4.7.2007,  17:54 Найти цитируемый пост)
создай объект DataTable, затем выполни dataAdapter.Fill(dataTable) и прикрути к DataGridView: DataGridView.DataSource = dataTable.

Можно и без датаадаптера.  smile 

Код

MyDataTable.Load(MyDataReader)
MyDataGridView.DataSource = MyDataTable


Цитата(thomas @  4.7.2007,  16:53 Найти цитируемый пост)
Я имею ввиду, то что DataTable после ее создания помещается в DataSet. 

В VS2003 без этого действительно никак, а в 2005 - запросто.
Рекомендую к прочтению: С.Малик "Microsoft ADO.NET 2.0 для профессионалов"
Цитата(thomas @  4.7.2007,  16:53 Найти цитируемый пост)
а так же чего нам рассказывал препод в вышке

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

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

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

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


 




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


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

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