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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> помогите определиться с датасетом! 
:(
    Опции темы
bagrintsev
Дата 9.1.2008, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ребята кто знающий помогите пожалуйста новичку в ADO.NET

В акцессе была разработана база учета рабочих мест и техники. 

Две формы: 
в верхней запросом из разных таблиц собирается инфа о рабочих местах (редактируемый запрос: кабинеты+рабочие_места+ФИО+телефон+IP), 
в нижней - какая техника стоит на выделенном рабочем месте (таблица: устройства). 

Перемещаешь курсор по верхней форме - в нижней срабатывает фильтр и показывается только техника текущего рабочего места. 
Все легко редактируется и вообще очень удобно для учета. 

Никак не соображу как сделать то же самое в NET: (имеется в виду верхняя "форма" - датагрид, где должны быть данные из запроса. )

1. то ли заливать в отдельные датасеты все используемые таблицы (кабинеты, ФИО и пр.), потом у клиента эти датасеты как то объединять запросом и вываливать в датагрид, там редактировать, а потом по отдельности обновлять записи для каждой таблицы (возможно ли это? - я имею в виду представление нескольких датасетов в виде другого датасета-запроса), 

2. то ли заливать в отдельный датасет данные из нескольких таблиц (запросом) и редактировать их в датагриде (только как потом это дело обновлять ? Данные же из нескольких таблиц, а хранятся в одном датасете...)

Сломал мозги раздумывая как нужно сделать. Наверняка эта тема уже давно обсосана и расписана, вот только сколько ни ищу никак не могу найти. Ткните в ссылку или подскажите плз

Это сообщение отредактировал(а) bagrintsev - 9.1.2008, 14:02
PM MAIL   Вверх
mr.DUDA
Дата 9.1.2008, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



Создать в проекте типизированный датасет, две таблицы ("верхняя" и "нижняя"), накидать колонок соотв-ющих тому что там выбирается запросом из БД. Добавить связь между таблицами: нижняя зависит от верхней по foreign key. После этого создаём пустую форму, тянем на неё наш типизированный датасет (DataSet с тулбокса), после чего добавляем два DataGridView и настраиваем их DataSource на две таблицы (главную и вложенную в неё). В коде зачитываем данные в датасет. В результате получаем форму с двумя гридами, при перемещении по первому гриду во втором отображаются связанные данные.

З.Ы, пример со скриншотом где-то был на форуме.


--------------------
user posted image
PM MAIL WWW   Вверх
bagrintsev
Дата 9.1.2008, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



mr.DUDA, спасибо за ответ.
так значит думаешь стоит брать данные для верхнего грида запросом в датасет?
а как же обновлять? выбирать измененные строки, начинать дербанить их по полям (какое поле изменено и к какой таблице принадлежит), а потом создавать на этой основе сиквел-запросы? 
мда... трудоемко однако.  
даже и не знаю. в акцессе я об этом даже не задумывался. 

(да, и еще... у меня все кодом делается, динамически. и даже все уже работает - т.е. фильтруется. 
вот только с обновлениями никак не разберусь. )
PM MAIL   Вверх
thomas
Дата 9.1.2008, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



bagrintsev
Привет.
Выложи либо структуру таблиц либо саму базу и скажи на каком языке сделать. (VB или C#) Я вечерком с работы приду сделаю тебе проектик.



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


Новичок



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

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



thomas, огромное тебе спасибо. 

я конечно постараюсь самостоятельно решить проблему, тем более что в опубликованном тобой классе dataAccess увидел похоже свет в конце туннеля - метод dbCmdBuilder.GetUpdateCommand()
насколько я понимаю он строит sql-команды обновлений, главное дать ему таблицу

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

вот код. Форма1, на форме три датагрида (DataGrid1 - 3), третий служебный - я на нем тренируюсь смотреть измененные строки, есть еще менюшка в верху, но она к делу не относится. 

Код



Imports System.Data.OleDb
Imports System.Windows.Forms

Public Class Form1
    Inherits System.Windows.Forms.Form

    Private tblPlaces As DataTable
    Private tblDevices As DataTable
    Dim ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\DATA.mdb"

    Dim SQL_t_plc As String = "SELECT t_plc.id, t_cab.town, t_cab.office, t_cab.floor, t_cab.cabinet, t_cab.info, t_plc.place, t_plc.place_type, t_plc.place_ip, t_plc.place_ip_name, t_plc.place_tel " & _
    "FROM t_cab INNER JOIN t_plc ON t_cab.id = t_plc.id_cab " & _
    "ORDER BY t_plc.id;"
    Dim SQL_t_dev As String = "select * from t_dev"

' объявление - одно подключение, два адаптера, два датасета, два командбилдера
    Dim conn As New OleDbConnection(ConnectionString)
    Dim cmdSelect1 As New OleDbCommand(SQL_t_plc, conn)
    Dim cmdSelect2 As New OleDbCommand(SQL_t_dev, conn)
    Dim adapter1 As New OleDbDataAdapter(cmdSelect1)
    Dim adapter2 As New OleDbDataAdapter(cmdSelect2)
    Dim ds1 As New DataSet
    Dim ds2 As New DataSet
    Dim cb1 As New OleDbCommandBuilder(adapter1)
    Dim cb2 As New OleDbCommandBuilder(adapter2)


' при загрузке заливка таблиц в датасет
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Try
            conn.Open()
            adapter1.Fill(ds1)
            adapter2.Fill(ds2)
            tblPlaces = ds1.Tables(0)
            tblDevices = ds2.Tables(0)

        Catch err As Exception
            MessageBox.Show(err.ToString())
        Finally
            conn.Close()
        End Try

        DataGrid1.DataSource = tblPlaces
        DataGrid2.DataSource = tblDevices

        DataGrid1.CaptionText = "           Места размещения"
        DataGrid2.CaptionText = "           Техника на рабочем месте"

        DataGrid1.ReadOnly = False
        DataGrid2.ReadOnly = False


' регистрация обработчика перемещений в датагриде1
        Dim binding As BindingManagerBase = Me.BindingContext(tblPlaces)
        AddHandler binding.PositionChanged, AddressOf binding_PositionChanged

        binding_PositionChanged(Nothing, Nothing)

    End Sub

' сам обработчик
    Private Sub binding_PositionChanged(ByVal sender As Object, ByVal e As EventArgs)

        Dim filter As String
        Dim selectedRow As DataRow
        Dim index As Integer = Me.BindingContext(tblPlaces).Position
        selectedRow = tblPlaces.Rows(index)
        filter = "id_plc='" & selectedRow("id").ToString() & "'"
        tblDevices.DefaultView.RowFilter = filter

    End Sub


' это вообще к делу не относится
    Private Sub ExitToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExitToolStripMenuItem.Click
        If (DataGrid2.Visible = False) Then
            DataGrid2.Visible = True
        Else : DataGrid2.Visible = False
        End If

    End Sub

    Private Sub СохранитьToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles СохранитьToolStripMenuItem.Click

        Dim myChangedRecords As DataSet
        myChangedRecords = ds2.GetChanges()
        DataGrid3.DataSource = myChangedRecords

    End Sub

'/ это вообще к делу не относится

End Class


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


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


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

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



bagrintsev
Приветствую.
Если я правильно понял, то у тебя в базе как минимум три связанных между собой таблицы:
- первая содержит данные о кабинетах;
- вторая содержит данные о рабочих местах в  кабинетах;
- третья содержит данные о технике на рабочих местах.
Тебе нужен простой интерфейс что бы видеть в каком кабинете какие рабочие места и что на них(рабочих местах) стоит из техники.
Предлагаю самый простой вариант.
Создаешь новый проект. Открылось окно с формой. Идем в меню студии Data вибираем Add New Data Source ... и далее следуем шагам мастера: выбираем базу, создаем соединение, можно сохранить строку соединения в app.config(я обычно не сохраняю), выбираешь три свои таблицы и даешь наименование ДатаСету. Финишь.
Студия создала в твоем проекте ДатаСет с тремя таблицами. В Solution Explorer увидишь нод имя твоего ДатаСет .xsd дважды жмем мышей, откроется окно дизайнера ДатаСет. В нем увидишь три свои таблицы. Если уже есть связи между ними, то ничего не делай. Если нет, то просто на свободном месте жмем правой кнопкой мыши и в контекстном сменю выбираем Add --> Relation ... . В диалоговом окне указываешь родительскую таблицу и ее первичный ключ, потом дочернюю и вторичный ключ(=первичному родительской). Жмем ОК. Повторяем процедуру для следующей пары таблиц. Связи созданы, получили три таблицы, которые связаны между собой: кабинет - рабочее место - техника. Далее открыли дизайнер формы, справа будет окно  DataSources, там видим наш ДатаСет, а в нем три наших таблицы. Так вот жмем плюсик рядом с таблицей кабинет, видим поля этой таблицы и связанную сней таблицу рабочие места. Жмем на ее плюсик и видим ее поля и связанную с ней таблицу техника. Теперь осталось только определиться что и как показывать на форме. Предлагаю следующее. Для таблицы кабинет выбрать представление детали , для этого выделить таблицу мышей и слева нажав на стрелочку вниз в выпадающем списке выбрать Details. Для каждого поля этой таблицы можно выбрать тип контрола в котором ты хочешь видеть соответствующие данные или же если ты не хочешь видеть на форме это поле, то выбираешь просто  [None]. Для двух других таблиц можно оставить представление DataGridView. Теперь внимание: первым делом тащим на форму таблицу кабинеты, просто выделили мышей название и перетащили на форму. Студия сама создаст и отобразит на форме выбранные тобой для полей таблицы контролы + BindingNavigator для этой таблицы. Размещаешь контролы как тебе нравиться на форме. Потом выделяешь таблицу рабочих мест и тянешь ее на форму. Размещаешь созданный студией DataGridView там где надо. Если необходимо убрать лишние колонки(не отображать некоторые поля таблицы), то в правом верхнем углу жмем на стрелочку и в меню выбираем Edit Columns... . В диалоговом окне удаляем лишние поля(можно и добавить, типа вычисляемые поля), задаем свойства оставшимся если надо. И Жмем ОК. Теперь проведем туже процедуру с таблицей техника.
Все интерфейс готов. Студия сгенерила и поместила на форму меобходимые контролы: дата сет, биндинг навигатор, и три пары биндинг соурс + табле адаптер для каждой из таблиц. Теперь открываем вкладку код для твоей формы. Студия сгенерила код события загрузки формы. Там ты видишь что для трех табле адаптеров вызывается метод Fill(). Расположи их в последовательности: кабинет, рабочее место, техника. (а то студия их расположила в алфавитном порядке) Надо чтобы первой заполнялась родительская таблица а потом ее дочерняя.
Поменял, все данные загрузятся как нужно. Теперь надо позаботиться о сохранении данных в БД. Студия сгенерировала код для события нажать на кнопку сохранить в биндинг навигаторе. Но сделала она это только для главной таблицы -  кабинеты. Значит нам надо добавить еще четыре строчки кода(по две на каждую из оставшихся таблиц)
вызвать метод EndEdit() для соответствующего Binding Source и вызвать метод Update() для соответствующего табле адаптера, в качестве параметра передав твой дата сет и соответствующую таблицу в нем. Все.
Жми F5 и запускай приложение.
При старте увидишь детальное отображение данных на кабинеты, навигация по кабинетам через стрелки на навигаторе. Кнопка плюс очисти все контролы и предоставит возможность внести данные на новый кабинет. Далее кнопка сохранить сохранит(добавит) внесенные в контролы данные на новый кабинет в базу данных. Кнопка удалить - удалит текущий рекорд из БД. Какие рабочие места есть в текущем кабинете отобразит первый грид. А что установлено на выделенном в первом гриде рабочем месте отобразит второй грид. Соответственно ты можешь редактировать, добавлять или удалять данные о рабочих местах и технике на них прямо в гридах. Все эти изменения вступят в силу(попадут в базу) при нажатии кнопки сохранить на навигаторе.
Вот собственно и все.  smile 
   


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


Новичок



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

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



Вот это да! Я в шоке! И практически никакого кода! 
Я попробовал сделать все по твоим указаниям - и за 5 минут практически готовый проект. 
И никакого утомительного застирывания! 

Я то привык все в блокнотике делать, каждую строчку кода рожать в потугах мозга и чтении бесконечных мануалов... 
А тут - пара движений мышкой, 10 строчек кода и все готово... 

Единственно что смущает - немного не подходит мне предложенный тобой вариант с разделением каждой таблицы в своем представлении (датагриде или листбоксе). Мне хотелось бы чтобы кабинеты , рабочие места , имена и должности находились в одном единственном датагриде - юзверей то у меня около трех сотен, замучаешься листать кабинеты, потом рабочие места, чтобы выискать нужного юзверя или его айпишник. 
Нет ли у тебя мыслей как сделать то же самое, но в одном объединенном датагриде?



Это сообщение отредактировал(а) bagrintsev - 10.1.2008, 16:21
PM MAIL   Вверх
mr.DUDA
Дата 10.1.2008, 23:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



thomas, монстр!!!  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
bagrintsev
Дата 14.1.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Хотел вот поблагодарить thomasа за искреннее участие и помощь в обучении и просвещении основам NET - добавить единичку в репутацию. А сервер говорит - для этого нужно сделать 100 постов.  smile 
Я так понимаю, что мне нужно задать thomasу еще 97 разных вопросов? Трудная задача. 
Сижу вот, вопросы придумываю... smile 
PM MAIL   Вверх
mr.DUDA
Дата 14.1.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

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



bagrintsev, Томас заслуженно получил 2 плюса, так что не переживай smile


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

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

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

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


 




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


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

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