powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Update таблицы вручную.
1 сообщений из 1, страница 1 из 1
Update таблицы вручную.
    #34632006
Витал
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Источником данных для грида является таблица предварительно созданная (Dim tbl as New DataTable) и заполненная с помощью датаридера.
Пользователь внес свои изменения. Что-то добавил, что-то удалил, а что-то модифицировал. Щелкнул кнопку "Сохранить". В БД "улетает" штук 5 значений, в основном ID из других таблиц, а в гриде должно отобразиться штук 15 полей (результат объединения нескольких таблиц). Если сформировать объект комманд вида
Код: plaintext
1.
Insert Into T1 (F1, F2, F3, F4) Values (@F1, @F2, @F3, @F4); 
Select T1.F1, T1.F2, T1.F3, T1.F4, T2.F5, T3.F6... From T1, T2, T3... Where ... Id = identity
то в результате получим из БД строку с нужными значениями, в т.ч. и сгенерированным ID (строку получаем можете не сумлеваться).
Пробовал так (CmdIns - сохраненный объект SqlCommand для вставки данных, cnn - SqlConnection, tbl - обновляемая таблица):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Dim tblChange As New DataTable = tbl.GetChanges
        For Each rw As DataRow In tblChange
            Select Case rw.RowState
                Case DataRowState.Added
                       cnn.Open()
                       Dim rd As SqlDataReader = CmdIns.ExecuteReader
                       Dim tb As New DataTable 
                       tb.Load(rd)
                       rd.Close()
                       cnn.Close()
                       rw.ItemsArray = tb.Rows( 0 ).ItemsArray ' это работает, если поле ID не ключевое. 
                                     'В противном случае - сообщение об ошибке ID is ReadOnly
         
                      tbl.Merge(tb)
                      rw.Delete()  ' вот как быть здесь не знаю(?????????) пока. Без Dalete в гриде видим 
                           ' удвоенное количество этих строк. А с Delete  опять ошибка, 
                           ' но уже в связи с изменением в коллекции...
                      rw = tb.Rows( 0 )
                Case DataRowState.Deleted
                Case DataRowState.Modified

            End Select
        Next
Таким образом, задача сводится к тому, чтобы в таблице - источнике данных для грида отобразились все эти значения.
Один путь не срабатывает из-за того, что поле ID этой самой таблицы ReadOnly и rw.ItemsArray = tb.Rows(0).ItemsArray выдает ошибку. А второй путь tbl.Merge(tb) приводит к тому, что записей в копии таблицы на клиенте становится 2 - одна исходная, которая обрабатывалась, заполненная частично, и только нужными числовыми значениями, а вторая - полученная из БД. Во втором случае вопрос стоит куда девать эту первую уже не нужную запись? rw.Delete() останавливает цикл обработки по ошибке... что-то там с Enumerator' ом коллекции. :((
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Update таблицы вручную.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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