| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Базы данных под .NET > Сохранение данных в БД (свой Update) и поле ID. |
| Автор: Papirus 1.7.2007, 22:06 | ||||
Собственно говоря, проблема со вставкой данных (Insert). Есть необходимость самому прописать обновление данных, т.к. то, что отображается в гриде - результат объединения нескольких таблиц + некоторые проверки непосредственно в селекте... и т.д. Короче, я посчитал, что проще по примеру VS2003, а возможно и VS2005 в пакет инструкций добавлять Select (SelectCommand.CommandText), в котором ID = identity. Сохранение производится стандартно:
Сохранение производится нормально. Однако, пока не удается полученную из БД строку подставить вместо обрабатываемой. Пробовал так (CmdIns - сохраненный объект SqlCommand для вставки данных, cnn - SqlConnection, tbl - обновляемая таблица):
А значение ID обязательно надо иметь для последущей работе клиента с данными... Добавлено через 5 минут и 26 секунд Может после заполнения таблицы удалять Primary Key? |
| Автор: thomas 2.7.2007, 10:29 | ||||
| Papirus, Честно говория ничего не понял.
Куда нужно подставить строку из БД? Если
Так очисти DataGrigView и заполни снова, но уже после обновления БД. |
| Автор: thomas 2.7.2007, 12:04 | ||||
| Papirus, SQL- команда INSERT INTO добавляет строку в таблицу БД. А вот команда SELECT позволяет получить данные из БД. Это я к
Таблица то в памяти, в чем проблема чтобы ее очистить и заполнить снова, только нужными значениями(не надо всю базу тащить в память). Тебя я так понимаю нужна то всего одна строка. И потом зачем DataReader, а не DataAdapter? Напиши SELECT команду к БД, выполни ее заполни таблицу в ДатаСет и отобрази ее в гриде. Юзер внес какие-то изменения( я так понимаю новые данные раз надо добавлять строку в БД), ты сохранил это в БД. (в твоем случае INSERT команда). Далее тебе нужно видеть что же там получилось?(так как БД генерит ID) Для этого нужно обновить таблицу в ДатаСет, а для этого по новой выполнить SELECT команду к БД. Перед этим очистить таблицу в ДатаСет. Все. ADO.NET |
| Автор: Papirus 2.7.2007, 12:24 | ||
Этого-то как раз и хочется избежать. Заполнять каждый раз при сохранении одной-двух-трех записей всю таблицу (пока 7-8 тысяч строк), имхо не производительно, да и после сохранения каждой записи мне нужен ID для обновления связанных таблиц. При этом датасетов у меня нет и каскады затевать тоже как-то "влом". |
| Автор: thomas 3.7.2007, 10:49 | ||||||
| Papirus, У меня только один вопрос
А нужны ли все они юзверю, а? Сколько строк он может увидеть на экране? Я думаю что, стандарт сейчас 1024х768, а не как у меня 1200х1600 (20" и повернут на 90). Так что много он не увидит, да и я тоже. Плюс не забывай ID присваивается базой, а значит ты можешь его получить только повторно обратившись к базе с запросом на выборку. Хотя тут есть один трюк, если используется автонумерация, то
выполни метод ExecuteScalar() и получишь свой ID.
Очень интересно ... |
| Автор: Papirus 3.7.2007, 16:25 | ||
Это справочник товаров и их составных частей. Пользователь должен видеть их все. Он так хочет. Списком. Хотя и предусмотрена группировка и отображение в виде дерева с подгрузкой списка по типам. Это-то как раз и была суть моего вопроса (см. мой пост от 02.07.2007 11:27). Если, как я писал выше, CommandText включает инструкцию Select
то после выполнения InsertCommand.ExecuteReader получаем назад нужную строку со всеми потрохами... В том числе и со сгенерированным базой ID. И потом этот ID мне нужен не просто в виде переменной, а как значение соответствующего свойства DataRow, чтобы пользователь мог продолжить добавление/удаление/редактирование комплектующих (т.е. данных в подчиненных таблицах) и самой этой записи... "Это же БУБЛЬ-ГУМ!!!!" (с) ПыСы. Проблемку я вроде решил. Если кому интересно могу сообщить как. |
| Автор: thomas 4.7.2007, 08:27 | ||||||||||
| Papirus, Вы меня конечно извините, но
Это БСК.
Читаем http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/vbcon/html/vbcondatasets.asp
Читаем http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/cpguide/html/cpcontheadonetdataset.asp http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/cpguidenf/html/cpconadonetarchitecture.asp http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/cpref/html/frlrfSystemDataDataSetClassTopic.asp http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/cpref/html/frlrfsystemdatadatatableclasstopic.asp
Интересно, откуда Вы тянете структуру ДатаСет, из Базы Данных? ЗЫ "Бред Сивой Кобылы" = любимая призказка моего преподавателя по специальности в моем первом высшем учебном заведении. ЗЫ ЗЫ
|
| Автор: Idsa 4.7.2007, 14:08 |
Ничего не БСК. Источником данных действительно может быть DataTable. Причем в случае использования одной таблицы даже рекомендуется использовать именно DataTable, а не DataSet. |
| Автор: thomas 4.7.2007, 16:04 |
| Idsa, А где находиться эта DataTable, которая является источником данных? |
| Автор: Idsa 4.7.2007, 16:29 | ||||
В оперативной памяти Смотрим в MSDN справку по свойству DataGridView.DataSource:
thomas, обрати внимание на пункт 2. |
| Автор: thomas 4.7.2007, 16:53 |
| Idsa, то что таблица в памяти это не вопрос. Я имею ввиду, то что DataTable после ее создания помещается в DataSet. А в приведенной цитате пункт 2 я понимаю так ДГВ поддерживает следующие интерфейсы: IListSource интерфейс такой как (such as) DataTable и DataSet классы. И так понятно что ДГВ связан с определенной таблицей в ДатаСет. Из всего что я на данный момент прочитал в msdn и в книгах по ADO.NET. а так же чего нам рассказывал препод в вышке Существуют: Источник данных(БД, файл Excel, xml, текстовый файл) + различные типы провайдеров данных + датаадартеры + датасет А в датасет может быть одна или много таблиц или 0 таблиц. http://msdn.microsoft.com/library/rus/default.asp?url=/library/rus/cpguidenf/html/cpconadonetarchitecture.asp |
| Автор: Idsa 4.7.2007, 17:54 | ||
| thomas, вот ты пишешь: Действительно, DataSet не что иное, как обертка над DataTable. Но если нам не нужны навороты DataSet, почему бы не сэкономить память и не повысить производительность, использовав непосредственно DataTable?! Далее ты пишешь:
Вместо последнего пункта может быть не только DataSet, но любой компонент, удовлетворяющий условиям, которые я приводил выше. Если мне так и не удалось тебя убедить, создай Windows-приложение, создай объект DataTable, затем выполни dataAdapter.Fill(dataTable) и прикрути к DataGridView: DataGridView.DataSource = dataTable. |
| Автор: Papirus 5.7.2007, 07:44 | ||||||
Можно и без датаадаптера.
В VS2003 без этого действительно никак, а в 2005 - запросто. Рекомендую к прочтению: С.Малик "Microsoft ADO.NET 2.0 для профессионалов" "Забудьте чему Вас учили в школе, как кошмарный сон!!!" (с) |