| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .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 |
| вот тут все очень доступно и по порядку |
| Автор: Anddros 13.3.2012, 18:34 |
| Спасибо, обязательно посмотрю. |
| Автор: metis 13.3.2012, 20:09 | ||
Загрузить данные в Datagridview можно,на пример, таким образом
А вобще тема уже не раз обсуждаль на форуме, на пример 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, я так понимаю у вас это получилось, т.к.
а куда его прописать в 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 | ||
Можно так попробовать
Я написал для 2х таблиц, думаю сделать тоже самое для 4х, будет понятно. Можно заполнять dataGridView в контексте не одного соедения, как я сделал в этом примере, а создавать новое подключение для каждого селекта. |
| Автор: Anddros 15.3.2012, 19:00 |
| Спасибо. обязательно попробую. |
| Автор: Anddros 15.3.2012, 19:34 |
| Данные из 2-х таблиц получилось увидеть на форме. Не с первого раза конечно. Пока не поместил пространстов имен using System.Data.OleDb; и не закинул файл БД в папку Bin\Debug А для редактирования тогда как быть? Что можете посоветовать? |
| Автор: metis 15.3.2012, 19:56 | ||
Читать 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 | ||||
Все верно. Если хотите выполнить хранимую процедуру (на пример),которая уже существует в БД, к вашему коду нужно добавить SqlDataAdapter
Если вы хотите формировать 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 | ||
|
| Автор: 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 у датаадаптера
или
|
| Автор: Anddros 16.3.2012, 19:40 |
| >А что значит цифра пять? Так что она тут значит в этом запросе? А метод Update это тоже относится к удалению строки или для обновления таблицы? |
| Автор: metis 16.3.2012, 19:53 | ||
Что значит цифра 5 это вы должны знать, я просто скопировал ваз запрос и вставил его в свой пример.
Это все описано в руководстве по обновлению данных в БД, ссылку на которое я уже давал. Читайте, вникайте, пробуйте... |
| Автор: 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. В текстбокс пишем фио и нажимаем кнопку сохранить
Для начала попробуйте сделать добавление данных, обновление и удаление выполняется аналогично, тут главное правильно написать 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 | ||
Попробуйте такой вариант
|
| Автор: 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 | ||||||||
Ну если совсем по простому, то как то так:
Чтобы датагридвью заполнить
Чтобы изменения сохранить
И на конец процедура получения данных
Думаю принцип понятен. |
| Автор: Anddros 21.3.2012, 18:47 |
| Жаль что Вы всё время исчезаете и только лишь ненадолго появляетесь вечером. Добавлено через 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 |
| Ой . прошу прощения. вроде получилось Добавлено через 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 секунд |
| Автор: 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)
Добавлено через 5 минут и 22 секунды Ну то есть , Вы раньше писали Чтобы изменения сохранить
А здесь тогда как по Вашему? |
| Автор: metis 22.3.2012, 19:08 | ||
Так пробовали:
|
| Автор: Anddros 22.3.2012, 19:13 | ||
Не работает. пишет что 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 секунд Я уже тут долго сижу и ищу как можно обновить. |
| Автор: metis 22.3.2012, 19:20 | ||
Так вы создавайте дата-адаптер и датасет так же как создавали BindingSource
|
| Автор: Anddros 22.3.2012, 19:23 |
| <так вы создавайте дата-адаптер и датасет так же как создавали BindingSource А не сможете показать на моем примере? Добавлено через 33 секунды Я уже пробывал вчерашний Ваш код. Добавлено через 1 минуту и 43 секунды Ведь дата-адаптер и датасет уже созданы, а их еще раз получается нужно создавать. Добавлено через 2 минуты и 23 секунды т.е. я пробывал вчерашний код вставлять в этот. никак. |
| Автор: metis 22.3.2012, 19:32 | ||||||
Нет вы их создайте 1 раз, а потом просто обращайтесь к ним, как во вчерашнем примере. Получается в вашем примере нужно просто убрать строку
и добавить
попробуйте сделать так. |
| Автор: 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 нужно так же создавать как и датасет
И так же нужно убрать создание адаптера в процедуре заполнения |
| Автор: 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 секунд Я уже и так сделал
|
| Автор: metis 25.3.2012, 18:53 |
| нужно еще http://msdn.microsoft.com/ru-ru/library/system.windows.forms.bindingsource.aspx добавить |
| Автор: Anddros 27.3.2012, 14:34 |
| Все это я уже делал. |