Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Acces + C#


Автор: Anddros 12.3.2012, 15:08
Здравствуйте.
Скажите пожалуйства, а как мне отобразить данные из 4-5 связанных таблиц (из БД Access) в одном Datagridview или двух Datagridview , затем чтобы можно их (данные) было  редактировать (в Datagridview) и результаты редактирования обязательно записывались в базу данных Access. лучше поподробнее, совсем недавно юзаю С#.

Автор: LOPUH 13.3.2012, 06:20
Ну,судя по всему, с такой штукой как SQL  вы незнакомы, иначе подобный вопрос вряд ли возник. SQL- язык запросов, при помощи которого вы сможете извлечь необходимые данные из одной или нескольких таблиц, сформировать при этом соответствующее представление данных, отредактировать  имеющиеся данные в таблицах, а также создать либо удалить  сами таблицы.
То есть.если вы хотите писать приложения, работающие с данными, SQL необходим для изучения.

Автор: Anddros 13.3.2012, 11:56
SQL запрос я смогу сформировать, а куда его прописать в windows приложении к Базе данных. ? как настроить datagridview для редактирования?

Автор: kin 13.3.2012, 12:38
Блин, чудны, господи, дети твои!... Anddros, по всей видимости, вы думаете, что для того чтобы долететь до Марса, достаточно знать, где у Шаттла находиться педаль газа... 
А такой мысли, как обратиться к господам google.ru, yandex.ru, rambler.ru и попросить у них материал на тему "Программирование БД на C#" у Вас, часом, никогда не возникала???

Автор: Anddros 13.3.2012, 13:39
Обращался уже.
Но всё равно спасибо за совет.

Автор: fedyunina 13.3.2012, 17:23
вот тут все очень доступно и по порядку smile http://sernam.ru/book_cbd.php

Автор: Anddros 13.3.2012, 18:34
Спасибо, обязательно посмотрю.   smile 

Автор: metis 13.3.2012, 20:09
Загрузить данные в Datagridview можно,на пример, таким образом
Код

            string table = "table";
            string dbase = "database_name.mdb";
            string conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbase;
            OleDbConnection connection = new OleDbConnection(conStr);
            OleDbDataAdapter adapter = new OleDbDataAdapter();
            connection.Open();
            OleDbCommand command = new OleDbCommand("SELECT * FROM " + table, connection);
            command.ExecuteNonQuery();
            connection.Close();
            adapter.SelectCommand = command;
            DataSet dataSet = new DataSet();
            adapter.Fill(dataSet);
            dataGridView1.DataSource = dataSet.Tables[0];
            adapter.Update(dataSet);

А вобще тема уже не раз обсуждаль на форуме, на пример http://forum.vingrad.ru/forum/topic-301322/anchor-entry2158594/0.html

Автор: Anddros 13.3.2012, 23:30
>А вобще тема уже не раз обсуждаль на форуме, на пример тут

Эту тему я внимательно просмотрел ранее. Но тамошний пример мне не подходит. В присоединённом там файле ( Project_Test.rar) , рассматривается одна таблица БД Access (мне нужно 4). к тому же код выдаётся ошибка при попытке редактирования. 

>вот тут все очень доступно и по порядку  http://sernam.ru/book_cbd.php
Работа с базами данных на языке C#. Технология ADO.NET: Учебное пособие / сост. О. Н. Евсеева, А. Б. Шамшев
А здесь рассмаривается отображение двух таблиц в режиме master-detail. Так что только две таблицы.

А если , например, использовать 4 таблицы , то даже не могу представить как осуществить редактирование, чтобы измененные данные передавались в БД.

Автор: metis 14.3.2012, 19:15
Опишите ситуацию более подробно, какие таблицы, по каким полям связаны?
Какую задачу решаете?

Автор: Anddros 14.3.2012, 19:35
Имеются таблицы базы данных Access: Book, Izdatelstva, Zhanri, Prodazhi. 
Book является дочерней таблицей для Zhanri и Izdatelstva. и является родительской для таблицы Prodazhi. 
У табл. Zhanri ключевое поле ID_zhanr , у таблицы Izdatelstva ключевое поле ID_izdat. 
Таблица Book связана с ними по этими полям. 
Таблица Book имеет ключевое поле Id_knigi (яляется родительской для табл Prodazhi) и связано по этому полю с дочерней таблицей Prodazhi.
т.е. связи между родительскими и дочерними : один ко многим.

Далее необходимо использовать класс Datagridview, чтобы можно было  вывести содержимое таблиц и  предусмотрено редактирование этих связанных таблиц и результаты редактирования обязательно записывались в базу данных Access.

Автор: metis 14.3.2012, 20:02
Так, давайте по порядку.  
Для начала нужно загрузить данные в Datagridview, я так понимаю у вас это получилось, т.к.

Цитата(Anddros @ 13.3.2012,  11:56)
SQL запрос я смогу сформировать, а куда его прописать в windows приложении к Базе данных. ? как настроить datagridview для редактирования?

а куда его прописать в windows приложении я уже писал
Покажите, каким образом загружаете данные в Datagridview?


Автор: Anddros 14.3.2012, 20:16
<Покажите, каким образом загружаете данные в Datagridview?

Я смогу загрузить данные в 4 Datagridview. По одной таблице в каждый Datagridview.  Я смогу это сделать с помощью мастера.

Автор: metis 14.3.2012, 20:22
http://msdn.microsoft.com/ru-ru/library/ms233819.aspx

Автор: Anddros 14.3.2012, 20:23
SQL запрос для каждого DatagrigView думаю сделать не составит труда.

Добавлено через 5 минут и 25 секунд
В прилагаемом Вами коде запрос осуществляется к одной таблице. А тогда в моём случае как нужно сделать?

Автор: metis 15.3.2012, 17:30
Можно так попробовать
Код

            string dbase = "dbname";
            string conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbase;
            DataSet dataSet = new DataSet();
            dataSet.Tables.Add("table1");
            dataSet.Tables.Add("table2");
            OleDbConnection connection = new OleDbConnection(conStr);
            OleDbDataAdapter adapter = new OleDbDataAdapter();
            connection.Open();
           
            OleDbCommand command1 = new OleDbCommand("SELECT * FROM   table1", connection);
            command1.ExecuteNonQuery();
            adapter.SelectCommand = command1;
            adapter.Fill(dataSet.Tables[0]);
            dataGridView1.DataSource = dataSet.Tables[0];

            OleDbCommand command2 = new OleDbCommand("SELECT * FROM   table2", connection);
            command2.ExecuteNonQuery();
            connection.Close();
            adapter.SelectCommand = command2;
            adapter.Fill(dataSet.Tables[1]);
            dataGridView2.DataSource = dataSet.Tables[1];

            adapter.Update(dataSet.Tables[0]);
            adapter.Update(dataSet.Tables[1]);
            connection.Close();

Я написал для 2х таблиц, думаю сделать тоже самое для 4х, будет понятно.
Можно заполнять dataGridView в контексте не одного соедения, как я сделал в этом примере, а создавать новое подключение для каждого селекта.


Автор: Anddros 15.3.2012, 19:00
Спасибо. обязательно попробую.

Автор: Anddros 15.3.2012, 19:34
Данные из 2-х таблиц получилось увидеть на форме. Не с первого раза конечно. Пока не поместил пространстов имен using System.Data.OleDb; и не закинул файл БД в папку Bin\Debug  smile  . Думаю , тут необходимо будет сделать отображение master-detail для наглядности. 
А для редактирования тогда как быть? Что можете посоветовать? 

Автор: metis 15.3.2012, 19:56
Цитата(Anddros @ 15.3.2012,  19:34)
... А для редактирования тогда как быть? Что можете посоветовать?

Читать MSDN,по ссылке которую я давал ранее (Практическое руководство. Обновление записей в базе данных). Там описано достаточно просто, подробно и с примерами.  Если что то не получится пишите - поможем-подскажем.

Автор: Anddros 15.3.2012, 23:42
System.Data.SqlClient.SqlConnection sqlConnection1 = 
    new System.Data.SqlClient.SqlConnection("YOUR CONNECTION STRING ");

System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
cmd.CommandType = System.Data.CommandType.Text;
cmd.CommandText = "DELETE Region WHERE RegionID = 5 AND RegionDescription = 'NorthWestern'";
cmd.Connection = sqlConnection1;

sqlConnection1.Open();
cmd.ExecuteNonQuery();
sqlConnection1.Close();



Вот это вобще не понятно. просидел 4 часа и бес толку. 
Вычитал , что 
SqlConnection, SqlCommand, SqlDataAdapter соответствует
OleDbConnection,  OleDbCommand, OleDbDataAdapter. 
Сколько не менял, ничего не получилось. А System.Data.SqlClient это вообще наверное тоже относится к MS SQL Server.
Здесь нужно наверное как то производить подключение к Dataset и Dataadapter.

Прошу прощения за свою неразумность.

Автор: metis 16.3.2012, 18:43
Цитата

SqlConnection, SqlCommand, SqlDataAdapter соответствует
OleDbConnection,  OleDbCommand, OleDbDataAdapter. 

Все верно.  Если хотите выполнить хранимую процедуру (на пример),которая уже существует в БД, к вашему коду нужно добавить SqlDataAdapter

            
Код

            SqlConnection conn = new SqlConnection(connectionString);
            conn.Open();
            SqlCommand cmd = new SqlCommand("StoredProcedure_Name", conn);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataSet dataSet = new DataSet();
            da.Fill(dataSet, tableName);
            conn.Close();


Если вы хотите формировать SQL запрос в клиенте советую почитать про SqlCommandBuilder.

P.S. А при чем тут вобще работа с БД SQL сервера, вы же кажется с БД Acces работаете?

Автор: Anddros 16.3.2012, 19:07
Да . верно , что с Access. Но в примере , который в MSDN, ссылку на который Вы мне скинули , речь идёт о взаимодействии именно с SQL сервером. Вот у меня и возникли трудности по поводу того, как удалять из таблицы строки и как обновлять базу данных.

Добавлено через 2 минуты и 47 секунд
Поэтому я и не смог разобраться на основе того примера со своим случаем .

Добавлено через 7 минут и 16 секунд
А хранимые процедуры , к сожалению, БД Access не поддерживаются вроде. 

Автор: metis 16.3.2012, 19:15
Код

connection1.Open();
OleDbCommand command1 = new OleDbCommand("DELETE Region WHERE RegionID = 5 AND RegionDescription = 'NorthWestern", connection1);
command1.ExecuteNonQuery();



Автор: Anddros 16.3.2012, 19:17
Поэтому, всё же интересует вопрос как реализовать функции редактирования в СУБД Access с помощью C#.

Добавлено через 10 минут и 17 секунд
DELETE Region WHERE RegionID = 5 AND RegionDescription = 'NorthWestern", connection1

А что значит цифра пять? это удаление 5ой строки?

В моём случае значит должно быть 

DELETE Book WHERE ID_knigi  AND Nazv_knigi AND Avtor  AND ID_zhanr  AND ID_izdat AND Cena = Bookshop,  connection1

Автор: metis 16.3.2012, 19:35
Нужно вызвать метод Update  у датаадаптера
Код

dataAdapter.Update((DataTable)dataGridView.DataSource); 

или
Код

dataAdapter.Update(dataSet_Name); 

Автор: Anddros 16.3.2012, 19:40
>А что значит цифра пять? 
Так что она тут значит в этом запросе?

А метод Update это тоже относится к удалению строки или для обновления таблицы? 

Автор: metis 16.3.2012, 19:53
Что значит цифра 5 это вы должны знать, я просто скопировал ваз запрос и вставил его в свой пример.
Цитата

...
Метод TableAdapter.Update(DataTable)
Пытается сохранить все изменения DataTable в базе данных. (Это включает удаление всех строк, удаленных из таблицы, добавление вставленных в таблицу строк и обновление всех строк в таблице, которые были изменены.) 
...

Это все описано в руководстве по обновлению данных в БД, ссылку на которое я уже давал.
Читайте, вникайте, пробуйте...


Автор: Anddros 16.3.2012, 19:59
<Читайте, вникайте, пробуйте...

Надеюсь мне хватит времени ко времени "Ч".

Добавлено через 7 минут и 55 секунд
<Это все описано в руководстве по обновлению данных в БД, ссылку на которое я уже давал.

К сожалению, там описано касаемо MS SQL сервер.

Добавлено через 11 минут и 8 секунд
<DELETE Region WHERE RegionID = 5 

Это из того примера , что в MSDN. что Вы дали в ссылке.

Автор: metis 18.3.2012, 19:15
Касаемо MS SQL сервера, в руководстве описан метод обновления данных с помощью командных объектов, остальные примеры описаны вполне понятно и могут подойти для решения вашей задачи, если вы собираетесь изменять данные путем редактирования информации в datagridview.
Цитата

Сколько не менял, ничего не получилось

Код в "студию", что именно не получается?Какая ошибка?

А еще мне интересно, вы говорите про удаление и редактирование данных, а процедура добавления записи в БД у вас уже написана?

Автор: Anddros 19.3.2012, 17:26
Процедура удаления тоже не написана. Данные из БД вывел в datagridview и вот застрял на удалении. дальше не касался. Добавления  записей конечно тоже нет. Код есть тот , что Вы скинули остальные свои собственные разработки уже удалил, т.к. там бред.


Автор: Anddros 19.3.2012, 18:21
Наверное нужно заново производить подключение к БД  чтобы удалить и отдельно чтобы добавить данные. и по новому подкючать dataadapter и datatable 

Автор: metis 19.3.2012, 18:31
Начинать, по крайней мере я так считаю, нужно все же с добавления данных в БД.
На пример, надо загрузить, обновить, удалить данные из таблицы ФИО, состоящей из 2 полей (столбцов) id числовое поле (автоинкремент) и fio текстовое поле.
Я бы сделал следующим образом:
1. Создал форму и разместил бы на ней несколько элементов управления (текстбокс и кнопка)
2. В текстбокс пишем фио и нажимаем кнопку сохранить
            
Код

            string table = "metable";
            string dbase = "mydb.mdb";
            string conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbase;
            OleDbConnection connection = new OleDbConnection(conStr);
            OleDbDataAdapter adapter = new OleDbDataAdapter();
            try
            {
                connection.Open();
                OleDbCommand command = new OleDbCommand("insert into " + table + "(fio)   values ('" +textBox1.Text + "')", connection);
                command.ExecuteNonQuery();
                connection.Close();
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message.ToString()); }



Для начала попробуйте сделать добавление данных, обновление и удаление выполняется аналогично, тут главное правильно написать SQL  запрос.



Автор: Anddros 19.3.2012, 18:40
А если меня интересует именно DataGridView. т.е я вношу данные в DataGridView они становится видны в гриде ну и естественно в БД.

Добавлено через 1 минуту и 35 секунд
Получается такой же код:
 string table = "metable";
            string dbase = "mydb.mdb";
            string conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbase;
            OleDbConnection connection = new OleDbConnection(conStr);
            OleDbDataAdapter adapter = new OleDbDataAdapter();

Необходим и при добавлении и при удалении данных?

Добавлено через 5 минут и 54 секунды
или текстбокс  соединять с ячейкам DatagridView ?

Автор: metis 19.3.2012, 19:03
А если вы создаете строку в датагридвью, то нужно воспользоваться методом апдейт TableAdapter-а

Автор: Anddros 19.3.2012, 19:15
Вот это да. опять што но новенькое

Добавлено через 8 минут и 59 секунд
TableAdapter.Update(DataSet) 
Это вот это?

Автор: Anddros 19.3.2012, 19:32
или так dataAdapter.Update((DataTable)dataGridView1.DataSource);

Автор: metis 19.3.2012, 19:48
Можете выложить ваш проект?

Автор: Anddros 19.3.2012, 20:02
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.OleDb;


namespace Bookshop
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
       
            string dbase = "Bookshop_old.mdb";
            string conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbase;
            DataSet dataSet = new DataSet();
            dataSet.Tables.Add("Zhanri");
            dataSet.Tables.Add("Book");
            OleDbConnection connection = new OleDbConnection(conStr);
            OleDbDataAdapter adapter = new OleDbDataAdapter();
            connection.Open();
           
            OleDbCommand command1 = new OleDbCommand("SELECT * FROM   Zhanri", connection);
            command1.ExecuteNonQuery();
            adapter.SelectCommand = command1;
            adapter.Fill(dataSet.Tables[0]);
            dataGridView1.DataSource = dataSet.Tables[0];

            OleDbCommand command2 = new OleDbCommand("SELECT * FROM   Book", connection);
            command2.ExecuteNonQuery();
            connection.Close();
            adapter.SelectCommand = command2;
            adapter.Fill(dataSet.Tables[1]);
            dataGridView2.DataSource = dataSet.Tables[1];

            adapter.Update(dataSet.Tables[0]);
            adapter.Update(dataSet.Tables[1]);
            connection.Close();
          
        }

        private void button1_Click(object sender, EventArgs e) // довабление строки в datagridview
        {
            string table = "Zhanri";
            string dbase = "Bookshop_old.mdb";
            string conStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbase;
            OleDbConnection connection = new OleDbConnection(conStr);
            OleDbDataAdapter adapter = new OleDbDataAdapter();
            try
            {
                connection.Open();
                
ну а тут хочу вставить код для добавления в datagrid строк

                ZhanriTableAdapter.Update(BookshopDataSet);
                
command.ExecuteNonQuery();
                connection.Close();
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message.ToString()); }
        }
        }
    }


   Я основываюсь на Вашем коде. 

Автор: metis 20.3.2012, 20:04
Попробуйте такой вариант
Код

        private OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
        private BindingSource bindingSource = new BindingSource();

        private void Form1_Load(object sender, System.EventArgs e)
        {
            dataGridView1.DataSource = bindingSource;
            GetData("select * from mytab");
        }


        //Обновляем записи в БД
        private void updateButton_Click(object sender, System.EventArgs e)
        {
             dataAdapter.Update((DataTable)bindingSource.DataSource);
        }
        //Процедура загрузки данных в dataGridView
        private void GetData(string selectCommand)
        {
            string dbase = "mydb.mdb";
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbase;
            dataAdapter = new OleDbDataAdapter(selectCommand, connectionString);
            OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(dataAdapter);
            DataTable table = new DataTable();
            dataAdapter.Fill(table);
            bindingSource.DataSource = table;
         }

Автор: Anddros 20.3.2012, 20:27
Данные при редактирование обновились в в Базе Данных. а удаление не работает. 
На удаление надо что то другое?

Автор: Anddros 20.3.2012, 20:45
А почему когда я хочу тоже самое сделать для отображения второй таблицы в Datagridview2
то выскакивает ошибка
Error    1    Type 'Bookshop.Form1' already defines a member called 'GetData' with the same parameter types    d:\Bookshop\Bookshop\Form1.cs    54    21    Bookshop

а я всего лишь добавил ниже dataGridView1.DataSource = bindingSource;
            GetData("select * from Zhanri");

Добавлено через 1 минуту и 35 секунд
т.е. добавил dataGridView2.DataSource = bindingSource;
            GetData("select * from Zhanri");

ну и такой же код на обработчик событий по нажатию кнопки Button2

Автор: Anddros 20.3.2012, 22:36
Хотя на удаление тоже работает и на добавление.
Просто там не удалялось  потому что не выделил всю строку. и ошибка выскакивала потому что таблицы же связанные.

А как тогда отобразить другие таблицы в остальных datagridview (datagridview2, datagridview3....)
все тот же вопрос с GetData.

Автор: metis 21.3.2012, 16:07
Проще всего создать для каждой таблицы BindingSource и OleDbDataAdapter и отдельную процедуру получения данных.

Автор: Anddros 21.3.2012, 18:06
А покажи пожалуйста как это сделать , у меня так и не получилось. 
Вроде  понятно, а на самом деле не получается сколько я не пытаюсь. Мне край надо. 
Я занимаюсь совсем недавно C#.

Автор: metis 21.3.2012, 18:40
Ну если совсем по простому, то как то так:

Код

        private OleDbDataAdapter dataAdapter1 = new OleDbDataAdapter();
        private BindingSource bindingSource1 = new BindingSource();

        private OleDbDataAdapter dataAdapter2 = new OleDbDataAdapter();
        private BindingSource bindingSource2 = new BindingSource();
       // я делаю 2 у вас будет 4

Чтобы датагридвью заполнить 
Код

            dataGridView1.DataSource = bindingSource1;
            GetData1("select * from mytab1");
           //Для второй dataGridView
            dataGridView2.DataSource = bindingSource2;
            GetData2("select * from mytab2");

Чтобы изменения сохранить
Код

          dataAdapter1.Update((DataTable)bindingSource1.DataSource);
         //Для второй dataGridView
         dataAdapter2.Update((DataTable)bindingSource2.DataSource);

И на конец процедура получения данных
Код

           //GetDir1
            string dbase = "mydb.mdb";
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbase;
            dataAdapter1 = new OleDbDataAdapter(selectCommand, connectionString);
            OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(dataAdapter1);
            DataTable table = new DataTable();
            dataAdapter1.Fill(table);
            bindingSource1.DataSource = table;
            //GetDir2
            string dbase = "mydb.mdb";
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + dbase;
            dataAdapter2 = new OleDbDataAdapter(selectCommand, connectionString);
            OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(dataAdapter2);
            DataTable table = new DataTable();
            dataAdapter2.Fill(table);
            bindingSource2.DataSource = table;



Думаю принцип понятен. 


Автор: Anddros 21.3.2012, 18:47
Жаль что Вы всё время исчезаете и только лишь ненадолго появляетесь вечером.  smile

Добавлено через 11 минут и 17 секунд
Почему то ругается

Error    1    The type 'Bookshop.Form1' already contains a definition for 'bindingSource1'    d:\Bookshop\Bookshop\Form1.Designer.cs    100    52    Bookshop

Автор: Anddros 21.3.2012, 19:11
Да и на GetData1 и GetData2  ругается

Добавлено через 4 минуты и 44 секунды
Еще вот пишет - The name Getdata1 does not exist in the current  context

Автор: Anddros 21.3.2012, 19:31
Ой . прошу прощения. вроде получилось  smile

Добавлено через 4 минуты и 8 секунд
Теперь для лучшей наглядности, мне кажется, нужно сделать , чтобы при выборе родительской таблице в дочерней таблице появлялись записи касаемо этой строки. т.е. это так называемый master-detail

Добавлено через 14 минут и 19 секунд
Вы случаем не знаете как это можно сделать для двух таблиц. Думаю это последнее что мне нужно.

Автор: Anddros 21.3.2012, 19:49
Это наверное здесь не получится, потому что нету объекта DataSet . Ведь в объекте DataSet должны вроде храниться две таблицы

Автор: metis 21.3.2012, 19:51
Если я правильно понял, то нужно, чтобы н/р при выборе жанра в dataGridView1, в dataGridView2 загружались все книги этого, выбранного жанра?
Если так то нужно просто передать процедуре заполнения другой запрос, который будет осуществлять выборку из нужной таблицы с указанным условием.

Автор: Anddros 21.3.2012, 19:55
<Если я правильно понял, то нужно, чтобы н/р при выборе жанра в dataGridView1, в dataGridView2 загружались все книги этого, выбранного жанра? 

Да . Вы правы. именно так.

Добавлено через 1 минуту и 21 секунду
< .....который будет осуществлять выборку из нужной таблицы с указанным условием.

Вот это Вы сказанули.

Добавлено через 3 минуты и 31 секунду
А  Вы случаем не знаете как это сделать? 
В книге я нашел подобный вариант, но мне там трудно разобраться. нашел вот тутhttp://www.sernam.ru/book_cbd.php?id=43

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

Автор: metis 21.3.2012, 20:06
Ну во первых я не знаю какая у вас БД (какие таблицы по каким полям связаны),
а во вторых SQL запросы это вам в другую ветку форума.


Автор: Anddros 21.3.2012, 20:13
Мдя. вот это да. что же делать, что же делать

Добавлено через 3 минуты и 25 секунд
Связаны то они по ключевому полю ID_zhanr. 
Но тут в таком случае, наверное, и весь код будет выглядеть по другому.

Автор: Anddros 21.3.2012, 22:21
А как по Вашему такой вариант

            DataSet ds = new DataSet();
            ds.Tables.Add("Zhanri");
            ds.Tables.Add("Book");

            ds.Relations.Add("myRelation", ds.Tables["Zhanri"].Columns["ID_zhanr"], ds.Tables["Book"].Columns["ID_knigi"]);
            dataGridView1.DataSource = ds;
            dataGridView2.DataSource = ds;
            dataGridView1.DataMember = "Zhanri";
            dataGridView2.DataMember = "Zhanri.myRelation";


Правда у меня ошибку пишет {"'column' argument cannot be null.\r\nParameter name: column"}

на ds.Tables["Book"] ругается. код нашел на форуме.

Автор: Anddros 22.3.2012, 17:33
metis, а Вы не подскажите как вот в этом коде сделать обновление datagridview1 и datagridview2. Этот код рабочий и вроде то что надо, в родительской таблице (datagridview1) отображаются данные из дочерней таблицы (datagridview2)

Код


        public Form1()
        {
            InitializeComponent();

            string commandText = "SELECT ID_zhanr, Zhanr FROM Zhanri";
            string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + @"C:\Bookshop_old.mdb";
            string commandText2 = "SELECT ID_zhanr, ID_knigi, Nazv_knigi, Avtor, ID_izdat, Cena " + "FROM Book";

            OleDbConnection conn = new OleDbConnection(connectionString);
            OleDbCommand myCommand = new OleDbCommand();
            myCommand.Connection = conn;
            myCommand.CommandText = commandText;

            OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
            dataAdapter.SelectCommand = myCommand;
            conn.Open();
            DataSet ds = new DataSet();
            dataAdapter.TableMappings.Add("Table", "Zhanri");

            dataAdapter.Fill(ds);
            OleDbCommand myCommand2 = new OleDbCommand();
            myCommand2.Connection = conn;
            myCommand2.CommandText = commandText2;
            OleDbDataAdapter dataAdapter2 = new OleDbDataAdapter();
            dataAdapter2.SelectCommand = myCommand2;
            dataAdapter2.TableMappings.Add("Table", "Book");

            dataAdapter2.Fill(ds);
            DataColumn dcTouristsID = ds.Tables["Zhanri"].Columns["ID_zhanr"];
            DataColumn dcInfoTouristsID = ds.Tables["Book"].Columns["ID_zhanr"];
            DataRelation dataRelation = new DataRelation("Дополнительная информация", dcTouristsID, dcInfoTouristsID);
            ds.Relations.Add(dataRelation);
            DataViewManager dsview = ds.DefaultViewManager;
            dataGridView1.DataSource = dsview;
            dataGridView1.DataMember = "Zhanri";
            dataGridView2.DataSource = dsview;
            dataGridView2.DataMember = "Zhanri.Дополнительная информация";
            conn.Close();

        }



Добавлено через 5 минут и 22 секунды
Ну то есть , Вы раньше писали


Чтобы изменения сохранить
Код


dataAdapter1.Update((DataTable)bindingSource1.DataSource);
         //Для второй dataGridView
         dataAdapter2.Update((DataTable)bindingSource2.DataSource);


А здесь тогда как по Вашему?

Автор: metis 22.3.2012, 19:08
Так пробовали:
Код

dataAdapter1.Update((DataTable)ds.Tables["Zhanri"]);


Автор: Anddros 22.3.2012, 19:13
Код


private void button1_Click_1(object sender, EventArgs e)
        {

            dataAdapter1.Update((DataTable)ds.Tables["Zhanri"]);    

        }

 

Не работает. пишет что  ds не существует .

Добавлено через 1 минуту и 11 секунд
Error    1    The name 'dataAdapter1' does not exist in the current context    d:\3\Bookshop_3\Form1.cs    67    13    Bookshop_3

Добавлено через 3 минуты и 36 секунд
Я уже тут долго сижу и ищу как можно обновить.  smile 

Автор: metis 22.3.2012, 19:20
Так вы создавайте дата-адаптер и датасет так же как создавали BindingSource 
        
Код

private BindingSource bindingSource = new BindingSource();


Автор: Anddros 22.3.2012, 19:23
<так вы создавайте дата-адаптер и датасет так же как создавали BindingSource 

А не сможете показать на моем примере?

Добавлено через 33 секунды
Я уже пробывал вчерашний Ваш код.

Добавлено через 1 минуту и 43 секунды
Ведь дата-адаптер и датасет уже созданы, а их еще раз получается нужно создавать.

Добавлено через 2 минуты и 23 секунды
т.е. я пробывал вчерашний код вставлять в этот. никак.

Автор: metis 22.3.2012, 19:32
Цитата

Ведь дата-адаптер и датасет уже созданы, а их еще раз получается нужно создавать.

Нет вы их создайте 1 раз,  а потом просто обращайтесь к ним, как во вчерашнем примере.
Получается в вашем примере нужно просто убрать строку 
Код

 DataSet ds = new DataSet();

и добавить 
Код

private DataSet ds= new DataSet();

попробуйте сделать так.

Автор: Anddros 22.3.2012, 19:36
Теперь ругается на dataAdapter в обработчике кода кнопки

Добавлено через 2 минуты и 35 секунд
The name 'dataAdapter' does not exist in the current context.

Добавлено через 4 минуты и 20 секунд
Как то получается , что dataAdapter не видно в обработчике кода кнопи Button 

Автор: metis 22.3.2012, 19:52
Ну так и dataAdapter  нужно так же создавать как и датасет
Код

 private OleDbDataAdapter dataAdapter = new OleDbDataAdapter();

 И так же нужно убрать создание адаптера в процедуре заполнения

Автор: Anddros 22.3.2012, 19:58
Неа . не хочет обновлять.  и всё тут. ошибка выскакивает.

Добавлено через 1 минуту и 24 секунды
Тут же ещё dataAdapter2 создаётся.

Добавлено через 3 минуты и 48 секунд
А без него. т.е. именно dataAdapter2 программа ругается

Добавлено через 8 минут и 14 секунд
{"Update requires a valid UpdateCommand when passed DataRow collection with modified rows."}

Вот что пишет при обновлении теперь

Добавлено через 10 минут и 17 секунд
Я уже и так сделал

Код

private OleDbDataAdapter dataAdapter2 = new OleDbDataAdapter();
 

Автор: metis 25.3.2012, 18:53
нужно еще http://msdn.microsoft.com/ru-ru/library/system.windows.forms.bindingsource.aspx добавить

Автор: Anddros 27.3.2012, 14:34
Все это я уже делал. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)