none
sql + view RRS feed

  • Вопрос

  • Добрый вечер. Делаю проект c#, WPF.

    Есть БД sql expess с двумя таблицами. Так вот, необходимо следующее. Нужно отобразить всю первую таблицу. Хочу отображать в DataGridView. Вопрос: Как лучше отправить туда данные? Через lynq to sql., или через tableadapter? Как проще? И хотелось бы увидеть код :)

    2 вопрос: После того, как отобразиться таблица, надо при нажатии на ячейку, считать: какому столбцу принадлежит ячейка, и какое значение у первого столбца таблицы. Это нужно, чтобы открыть новое окно, где отобразятся данные таблицы базы №2, в зависимости от выбранной ячейки, т.е. только одна строчка, найденная по тем данным. Так вот, это лучше реализовать так же через lynq to sql., или через tableadapter? или напрямую создать запрос к БД (он вроде будет не сложным),

    Заранее спасибо

    21 марта 2012 г. 14:27

Ответы

  • Здравсвтуйте.

    Самаое простым будет воспользоваться мастером для привязки данных в DataGrid. Он сформирует необходимые TableAdapter-ы для заполнения DataSet, к которому будет привязан ваш DataGrid. Если объем данных не велик - то это вполне нормальное решение, выгрузить все необходимые данные и сразу их отобразить.

    По поводу второго вопроса вам нужно отношение master-detail - посмотреть о то, как оно реализовывается можно посмотреть, например здесь - WPF DataGrid Practical Examples

    Надеюсь, что помог вам.


    Для связи [mail]

    22 марта 2012 г. 12:16
  • Странно, у меня данный код работает без ошибок, изменения сохраняются в БД (попробуйте изменить привязку данных):

        public partial class MainWindow : Window
        {
            Table1TableAdapter tableAdapter = new Table1TableAdapter();
            DataSet1 ds1 = new DataSet1();
    
            public MainWindow()
            {
                InitializeComponent();
    
                tableAdapter.Fill(ds1.Table1);
                dataGrid1.ItemsSource = ds1.Table1;
    
                ds1.Table1.RowChanged += new System.Data.DataRowChangeEventHandler(Table1_RowChanged);
                ds1.Table1.RowDeleted += new System.Data.DataRowChangeEventHandler(Table1_RowChanged);
            }
    
            void Table1_RowChanged(object sender, System.Data.DataRowChangeEventArgs e)
            {
                tableAdapter.Update(ds1);
            }
        }


    Для связи [mail]

    23 марта 2012 г. 6:16
  • Да действительно возникает ошибка.

    У меня было подключение к Sql Server Express - в этом случае ошибки нет. Также если в вашем проекте создать кнопку и на нее повесить сохранение изменений в БД, то ошибки также не будет.

    Возможно это баг как раз обновления Access базы данных в событии RowChanged у DataTable. Если возможно - создайте баг на Microsoft Connect.

    Можно попробовать вместо Access БД использовать локальную базу данных sdf, там подобной ошибки не возникает.


    Для связи [mail]

    23 марта 2012 г. 11:25
  • Такое поведение из-за того, что у вас наверняка сама база добавлена в проект, в Solution Explorer выберите файл базы данных, перейдите в ее свойства и там будет Copy to Output Directory, установите его в значение Copy if Newer или Do not copy.

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


    Для связи [mail]

    26 марта 2012 г. 17:48
  • Создал БД sql compact. Ошибка эта исчезла. В ДатаГрид значения добавляются. Но если потом посмотреть содержимое таблицы базы, то там этих значений попросту нет
    24 марта 2012 г. 5:16

Все ответы

  • Здравсвтуйте.

    Самаое простым будет воспользоваться мастером для привязки данных в DataGrid. Он сформирует необходимые TableAdapter-ы для заполнения DataSet, к которому будет привязан ваш DataGrid. Если объем данных не велик - то это вполне нормальное решение, выгрузить все необходимые данные и сразу их отобразить.

    По поводу второго вопроса вам нужно отношение master-detail - посмотреть о то, как оно реализовывается можно посмотреть, например здесь - WPF DataGrid Practical Examples

    Надеюсь, что помог вам.


    Для связи [mail]

    22 марта 2012 г. 12:16
  • Спасибо, думаю это то, что нужно. Надеюсь, дальше справлюсь сам)
    22 марта 2012 г. 15:33
  • public partial class MainWindow : Window
        {
            LocalbaseDataSet dataset = new LocalbaseDataSet();
            LocalbaseDataSetTableAdapters.lessonsTableAdapter adapter = new LocalbaseDataSetTableAdapters.lessonsTableAdapter();
            public MainWindow()
            {
                InitializeComponent();
                    adapter.Fill(dataset.lessons);
                    this.DataContext = dataset.lessons.DefaultView;  
                dataset.lessons.lessonsRowChanged +=new LocalbaseDataSet.lessonsRowChangeEventHandler(lessonsRowModifield);
                dataset.lessons.lessonsRowDeleted += new LocalbaseDataSet.lessonsRowChangeEventHandler(lessonsRowModifield);
            }
            void lessonsRowModifield(object sender, LocalbaseDataSet.lessonsRowChangeEvent e)
                {
                    try
                    {
                        adapter.Update(dataset.lessons);
                    }
                    catch (Exception ex) { tb.Text =(ex.Message); }
                }
        }

    После добавления строки в Датагриде( прямо в таблице) появляется такое исключение. Как его можно убрать? Заранее спасибо

    "Существует назначенный этой команде Command открытый DataReader, который требуется предварительно закрыть."

    23 марта 2012 г. 4:34
  • Странно, у меня данный код работает без ошибок, изменения сохраняются в БД (попробуйте изменить привязку данных):

        public partial class MainWindow : Window
        {
            Table1TableAdapter tableAdapter = new Table1TableAdapter();
            DataSet1 ds1 = new DataSet1();
    
            public MainWindow()
            {
                InitializeComponent();
    
                tableAdapter.Fill(ds1.Table1);
                dataGrid1.ItemsSource = ds1.Table1;
    
                ds1.Table1.RowChanged += new System.Data.DataRowChangeEventHandler(Table1_RowChanged);
                ds1.Table1.RowDeleted += new System.Data.DataRowChangeEventHandler(Table1_RowChanged);
            }
    
            void Table1_RowChanged(object sender, System.Data.DataRowChangeEventArgs e)
            {
                tableAdapter.Update(ds1);
            }
        }


    Для связи [mail]

    23 марта 2012 г. 6:16
  • Все равно тоже самое. А привязка такая

    <Window x:Class="Home_Work.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525" SizeToContent="Width">
        <StackPanel>
            <DataGrid Name="dg" ItemsSource="{Binding}"/>
            <TextBox Name="tb"></TextBox>
        </StackPanel>
    </Window>

    23 марта 2012 г. 6:31
  • Если что, вот проект. 

    http://dl.dropbox.com/u/40467762/Home%20Work.rar

    Вроде все точно так же как у вас(

    23 марта 2012 г. 10:24
  • Да действительно возникает ошибка.

    У меня было подключение к Sql Server Express - в этом случае ошибки нет. Также если в вашем проекте создать кнопку и на нее повесить сохранение изменений в БД, то ошибки также не будет.

    Возможно это баг как раз обновления Access базы данных в событии RowChanged у DataTable. Если возможно - создайте баг на Microsoft Connect.

    Можно попробовать вместо Access БД использовать локальную базу данных sdf, там подобной ошибки не возникает.


    Для связи [mail]

    23 марта 2012 г. 11:25
  • Да действительно возникает ошибка.

    У меня было подключение к Sql Server Express - в этом случае ошибки нет. Также если в вашем проекте создать кнопку и на нее повесить сохранение изменений в БД, то ошибки также не будет.

    Возможно это баг как раз обновления Access базы данных в событии RowChanged у DataTable. Если возможно - создайте баг на Microsoft Connect.

    Можно попробовать вместо Access БД использовать локальную базу данных sdf, там подобной ошибки не возникает.


    Для связи [mail]

    А я вроде создавал базу sql express.  И в свойствах базы написано тип "Microsoft SQL Server". А можете выложить свой пример, я его для себя исправлю. Может просто что-то не корректно создалось у меня.
    23 марта 2012 г. 11:33
  • Создал БД sql compact. Ошибка эта исчезла. В ДатаГрид значения добавляются. Но если потом посмотреть содержимое таблицы базы, то там этих значений попросту нет
    24 марта 2012 г. 5:16
  • Все. Решил проблему. Просто при запуске из студии, данные в БД не сохраняются. А если запустить из выходного каталога exe файл, то тогда данные заносятся в БД. Мне кажется, это не много не правильно, но разработчикам виднее
    24 марта 2012 г. 7:54
  • Такое поведение из-за того, что у вас наверняка сама база добавлена в проект, в Solution Explorer выберите файл базы данных, перейдите в ее свойства и там будет Copy to Output Directory, установите его в значение Copy if Newer или Do not copy.

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


    Для связи [mail]

    26 марта 2012 г. 17:48
  • Да. Так и есть. Спасибо)
    27 марта 2012 г. 2:15