Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / databindings для таблицы с inner join'ами / 4 сообщений из 4, страница 1 из 1
18.04.2013, 13:14
    #38230769
rubi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
databindings для таблицы с inner join'ами
Доброго времени суток!

Вопрос скорее теоретический!

Есть таблица, например, "книги" и таблица "авторы". Я вывожу в datagridview (через биндинги, адаптер, дататейбл и датасет) таблицу книги, но selectCommand у меня с inner join'ами. Также делаю CommandBuilder, т.к. он работает только с одной таблицей, то для него я делаю другой адаптер, у которого selectCommand = "SELECT * FROM Книги", и по нему строю update и insert для таблицы "книги". Сохраняет без проблем. Но в datagridview после update возвращается строка без фио автора, т.к. ее нет в таблице "книги", она берется из "авторы". Как можно обновить строку в datagridview (точнее, конечно же, в datatable) на основе selectCommand. Пробовал удалить текущую строку после изменения и делать adapter.Fill(dataset, currentindex, 1, "Книги"), пробовал вручную заполнять поля в строке, но некоторые поля readonly и т.д. Может быть есть какие-то "best practices" для таких случаев.
...
Рейтинг: 0 / 0
18.04.2013, 20:43
    #38231656
Alex Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
databindings для таблицы с inner join'ами
rubi,
какой-то сумбур в изложении темы.
Просто похоже на поток сознания...

По пунктам разложите, что хотите достичь, что делаете и как, а там поглядим, может чем поможем.

Если не трудно, также можно указать какую базу данных используете и пример исходников привести - оно всяко быстрее ответ получится найти...
...
Рейтинг: 0 / 0
18.04.2013, 22:40
    #38231752
rubi
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
databindings для таблицы с inner join'ами
Блокнот:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
_dataSet = new DataSet();
_dataSet.Locale = System.Globalization.CultureInfo.InvariantCulture; 


_adapterBooks.SelectCommand = new SqlCommand(@"	SELECT К.*, А.ФИО FROM Книги К 
						INNER JOIN Авторы А ON А.ИД_автора = К.ИД_автора", conn); 
_adapterBooks.Fill(_dataSet, "Книги");
   
_baseAdapterBooks.SelectCommand = new SqlCommand(@"SELECT * FROM Книги", conn);//для commandbuilder'а  

DbCommandBuilder builderBooks = factory.CreateCommandBuilder();
builderBooks.DataAdapter = _baseAdapterBooks;
            
_adapterBooks.InsertCommand = builderBooks.GetInsertCommand();
_adapterBooks.UpdateCommand = builderBooks.GetUpdateCommand();
_adapterBooks.DeleteCommand = builderBooks.GetDeleteCommand();

dgv.DataSource = _dataSet.Tables["Книги"];



В DataGridView вижу строчку

ИД Название Автор
1 Война и мир Толстой


Добавляю строку (не привожу подробности - заполняется строка не в DataGridView, т.к. readOnly, а через textbox'ы и combobox'ы, которые прикручены к datagridview через bindings). При сохранении делаю

Код: c#
1.
2.
3.
_adapterBooks.Update(this._dataSet, "Книги");

_dataSet.AcceptChanges();




и в датагридвью вижу новую строку
ИД Название Автор
1 Война и мир Толстой
2 Доктор Живаго

т.е. автор - пусто, что абсолютно естественно, т.к. _adapterBooks.InsertCommand возвращает данные на базе
_baseAdapterBooks, в котором нет объединения с "Авторы".

Решение (может конечно не лучшее, но все же):

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
CurrencyManager cmgr = (CurrencyManager)this.dgv.BindingContext[this.dgv.DataSource];

_adapterBooks.Update(this._dataSet, "Книги");

 DataRow row = ((DataRowView)cmgr.Current).Row;
                    
                    SqlCommand cmd = new SqlCommand(@"	SELECT К.*, А.ФИО FROM Книги К 
						INNER JOIN Авторы А ON А.ИД_автора = К.ИД_автора
WHERE К.ИД_книги = " + row["ИД_книги"].ToString(), conn);

                    SqlDataReader reader = cmd.ExecuteReader();
                    
                    List<object> lst = new List<object>();

                    while (reader.Read())
                    {                       
                        for (int i = 0; i <= reader.FieldCount - 1; i++)
                        {
                            if (reader.GetValue(i).ToString() != row[reader.GetName(i)].ToString())
                            {
                                if (row.Table.Columns[reader.GetName(i)].ReadOnly)
                                {
                                    row.Table.Columns[reader.GetName(i)].ReadOnly = false;
                                    row[reader.GetName(i)] = reader.GetValue(i);
                                    row.Table.Columns[reader.GetName(i)].ReadOnly = true;
                                }
                                else
                                {
                                    row[reader.GetName(i)] = reader.GetValue(i);
                                } 
                            }
                        }
                        break;
                    }
                    reader.Close();
                  
                    _dataSet.AcceptChanges();



Можно, конечно, обновить весь DataSource для dgv, но гораздо приятнее экономить ресурсы и обновлять одну единственную строчку.

P.S. Прошу прощения за первый невнятный пост. И если будет более интересное решение - тоже буду рад увидеть.
...
Рейтинг: 0 / 0
19.04.2013, 22:16
    #38233543
Alex Kuznetsov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
databindings для таблицы с inner join'ами
rubi,

Я тут небольшой примерчик накидал.
Гляньте, может натолкнёт на мысль...
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / databindings для таблицы с inner join'ами / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]