powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Скопировать Row в DataSet
22 сообщений из 22, страница 1 из 1
Скопировать Row в DataSet
    #32526534
hmsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какими методами или способами лучше воспользоваться чтобы скопировать строку из таблицы dataset
и изменив значения некоторых полей этой строки добавить эту копию строки в ту же таблицу бд
?
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32527184
hmsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну так лучше воспользоваться своей ХП, которая будет копировать строку по id взятому из dataset и переданному в ХП,
или же есть метод скопировать строку в datatable, а потом весь датасет обновить в бд?
?
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32527303
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>ну так лучше воспользоваться своей ХП, которая будет копировать строку по id взятому из dataset и переданному в ХП,
или же есть метод скопировать строку в datatable, а потом весь датасет обновить в бд?

плохой вариант.


>какими методами или способами лучше воспользоваться чтобы скопировать строку из таблицы dataset и изменив значения некоторых полей этой строки добавить эту копию строки в ту же таблицу бд?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
' dtTable1  - ссылка на необходимую таблицу'
Dim drwSource as DataRow 
drwSource = ' ссылка на необходимую строку, как она берется вы не уточнили. '
Dim drwNew  as DataRow = dtTable1.Rows.NewRow() ' Новая строка-копия'
drwNew.BeginEdit()
' Можно столбцы прогнать в цикле, а можно и вручную если очень хочется'
drwNew( 0 ) = drwSource( 0 )
drwNew( 1 ) = drwSource( 1 )
...
....
drwNew("Id") =  Id ' новый Id для этой строки , пусть поле называется Id '
drwNew.EndEdit()
' Добавим строку в таблицу
dtTable1.Rows.Add(drwNew)
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32529622
hmsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
делаю так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
        MsgBox(dsNewSD.Tables("spVeks").Rows.Count)
        Dim drwSource As Infragistics.Win.UltraWinGrid.UltraGridRow
        Dim drwSC As Infragistics.Win.UltraWinGrid.RowsCollection = Me.ugVeks.Rows
        For i =  0  To drwSC.Count -  1 
            drwSource = Me.ugVeks.Rows(i) ' ссылка на необходимую строку, как она берется вы не уточнили. '
            Dim drwNew As DataRow = dsNewSD.Tables("spVeks").NewRow   ' Новая строка-копия'
            drwNew.BeginEdit()
  
            drwNew = CType(drwSource.ListObject, DataRowView).Row

            drwNew("№") =  1000   ' новый Id для этой строки             
            drwNew.EndEdit()
            ' Добавим строку в таблицу
            dsNewSD.Tables("spVeks").Rows.Add(drwNew)
        Next i
        MsgBox(dsNewSD.Tables("spVeks").Rows.Count)

на строку dsNewSD.Tables("spVeks").Rows.Add(drwNew)
ругается - эта строка уже существует в указанной таблице
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32529896
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
     MsgBox(dsNewSD.Tables("spVeks").Rows.Count)
        Dim drwSource As Infragistics.Win.UltraWinGrid.UltraGridRow
        Dim drwSC As Infragistics.Win.UltraWinGrid.RowsCollection = Me.ugVeks.Rows
        For i =  0  To drwSC.Count -  1 
            drwSource = Me.ugVeks.Rows(i)
            Dim drwNew As DataRow = dsNewSD.Tables("spVeks").NewRow   ' Новая строка-копия
            drwNew.BeginEdit()
  
'            drwNew = CType(drwSource.ListObject, DataRowView).Row ' Вот эта строка лишняя, мы же уже создали строку при помощи NewRow, теперь просто необходимо последовательно скопировать все значения из строки drwSource в новую созданую drwNew.'
            drwSource = CType(drwSource.ListObject, DataRowView).Row 
' Делаю вручную чтобы было понятнее, также можно сделать в цикле '
             drwNew( 0 ) = drwSource( 0 )
             drwNew( 1 ) = drwSource( 1 )
            drwNew( 2 ) = drwSource( 2 )
            drwNew( 3 ) = drwSource( 3 )
            drwNew( 4 ) = drwSource( 4 )
' и т.д это зависит от того сколько у вас столбцов в таблице можно и через название полей, например так:
'
'            drwNew("Поле1") = drwSource("Поле1")
'             drwNew("Поле2") = drwSource("Поле2")
'
            drwNew("№") = 1000  ' новый Id для этой строки             
            drwNew.EndEdit()
            ' Добавим строку в таблицу
            dsNewSD.Tables("spVeks").Rows.Add(drwNew)
        Next i
        MsgBox(dsNewSD.Tables("spVeks").Rows.Count)
Единственое я надеюсь что Infragistics.Win.UltraWinGrid.UltraGridRow работает аналогично DataRow, если что придется из UltraGridRow делать просто DataRow, такая возможность должна быть.
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32530252
hmsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не получается из UltraGridRow сделать DataRow
drwSource = CType(drwSource.ListObject, DataRowView).Row
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32530264
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наоборот все получается :-), просто тогда вверху надо это:
Код: plaintext
1.
Dim drwSource As Infragistics.Win.UltraWinGrid.UltraGridRow
Поменять на это
Код: plaintext
1.
Dim drwSource As DataRow
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32530365
hmsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда ругается на:
drwSource = Me.ugVeks.Rows(i)
так попробовал:
drwSource = CType(Me.ugVeks.Rows(i), DataRowView).Row
пишет cannot convert ...
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32530406
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А мы же можем вообще от UltraGrid уйти. Для чего он нам?
Ведь источником UltraGrid является какой то DataSet (DataTable and etc) . Надо сразу же брать необходимые строки из этого набора данных и все.

То есть вы хотите скопировать все строки содержащиеся в определенном UltraGrid?
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32530416
hmsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да нужно все строки из грида скопировать, я не знаю как это сделать без грида
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32530446
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну тут можно и через DataView, а также через DataSet.
Если известен DataSet и таблица содержащая необходимые записи то очень хорошо.

Как называется DataSet. И ведь нам надо давать ID всегда новые - Вопрос: какие? Или они формироваться должны автоматически?
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32530449
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да кстати если надо скопировать все строки из определенной таблицы то тогда вообще лучше воспользоваться методом Copy()
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32530933
hmsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а нельзя маленький примерчик как в datatable скопировать все строки и id новый нужен в новых строках
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32530962
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант без различных автоинкрементных полей.
Идентификатор получаем сами.

Дано: dtSource - экземпляр класса DataTable
Требуется: получить копию таблицы dtSource. Полученная копия - dtTarget.

Тогда:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dim dtTartget as DataTable
dtTarget = dtSource.Copy()
' Теперь нам надо поменять ID, я просто "пробегаюсь" по всем записям и  присваю новый ID. (Например пусть поле с ID называется IDColumn) '
Dim row as DataRow
Dim newId as Integer =  0 
Dim delta as Integer = - 1 
For each row in dtTarget.Rows
  newId = newId + delta
  row("IdColumn") = newId  ' Тогда у записей в ID значения будут - 1 , - 2 , - 3 , - 4 , - 5  и т.д
Next
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32531028
hmsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мне нужно скопировать их в ту же таблицу ...
а в вашем примере же получаем новую таблицу
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32531479
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ни что нам не мешает объединить эту таблицу с DataSet
DataSet.Merge(dtTarget) ' где DataSet первичный DataSet

Только надо помнить о том что:
Создается полная копия таблицы со всеми удаленными , модифицированными и добавленными записями с сохранением их RowState.
Поэтому здесь будет Exception при попытке изменить ID у удаленной записи.
Можно конечно скидывать RowState а потом меняя ID получать строку с RowState = Modified.
А можно используя метод Select вообще не брать записи с RowState = Deleted. Вариантов много...

Основное меня интересует что вы собираетесь в конечном итоге делать с копированными записями:
Добавить их в БД? как у вас задается ID? Используются при этом хранимые процедуры? Какие ? и т.д
Потому что этот вариант (как и любой другой :-) ) имеет свое ограничение в использовании.
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32531718
hmsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
id у меня Identity , я добавляю их в таблицу uchveks из прошлого топика про обновление,
собственно так и буду их добавлять в бд при обновлении dataset
те хранимые процедуры при обновлении и используются
мне все равно какой id будет у новых записей
вот таким образом не получается, потому как ругается что коллекция расширена и перейти к следующему элементу нельзя Next drwSource
Код: plaintext
        Dim drwSource As Data.DataRow\n        Dim vue As New Data.DataView\n        vue.Table = dsNN.Tables("spVeks")\n\n        For Each drwSource In vue.Table.Rows\n\n            Dim drwNew As DataRow = dsNN.Tables("spVeks").NewRow   \' Новая строка-копия\'\n            drwNew.BeginEdit()\n            For i =  0  To  46 \n                drwNew(i) = drwSource(i)\n                drwNew("iduvsd") =  1000   \' новый Id для этой строки , пусть поле называется Id \'\n            Next i\n            drwNew.EndEdit()\n            dsNN.Tables("spVeks").Rows.Add(drwNew)\n        Next drwSource
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32531719
hmsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
пробую merge
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32531823
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Id у меня Identity , я добавляю их в таблицу uchveks из прошлого топика про обновление,
собственно так и буду их добавлять в бд при обновлении dataset
те хранимые процедуры при обновлении и используются
мне все равно какой id будет у новых записей

Вариант с Copy и Merge без дополнительного программирования вам не подойдет.

А этот вариант тоже понятно почему не работает, коллекция меняется вызывается исключение при Next. Сейчас исправлюсь :-)
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32531859
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо этого кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Dim drwSource As Data.DataRow
        Dim vue As New Data.DataView
        vue.Table = dsNN.Tables("spVeks")
        For Each drwSource In vue.Table.Rows
            Dim drwNew As DataRow = dsNN.Tables("spVeks").NewRow   ' Новая строка-копия'
            drwNew.BeginEdit()
            For i =  0  To  46 
                drwNew(i) = drwSource(i)
                drwNew("iduvsd") =  1000   ' новый Id для этой строки , пусть поле называется Id '
            Next i
            drwNew.EndEdit()
            dsNN.Tables("spVeks").Rows.Add(drwNew)
        Next drwSource


Попробуйте этот:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Dim dt As DataTable = dsNN.Tables("spVeks")
Dim newId As Integer =  1000  ' Если не задан PK то такой вариант пройдет, можно сделать через AutoIncrement column 

Dim rowsCount As Integer = dt.Rows.Count ' Количество строк
Dim rowIndex As Integer =  0  ' Индекс по строкам
For rowIndex = 0 To rowsCount - 1
    Dim drwSource As Data.DataRow = dt.Rows(rowIndex) ' Строка источник данных
    Dim drwNew As DataRow = dt.NewRow   ' Новая строка-копия'
    drwNew.BeginEdit() ' Чтобы невызывать каждый раз Event
    Dim columnIndex As Integer = 0
    For columnIndex = 0 To dt.Columns.Count - 1
        drwNew(columnIndex) = drwSource(columnIndex)
    Next
    drwNew("iduvsd") = newId  ' новый Id для этой строки , пусть поле называется Id'
    drwNew.EndEdit()
    dt.Rows.Add(drwNew) ' Добавим в таблицу
Next
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32533623
hmsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо! всё получилось!
только вот два вопроса:
1. Почему 1000 для нового id? пробовал через AutoIncrement column с выставленым шагом -1 - не получилось, а с тыщей работает!
2. Результат этого копирования сразу отображается в гриде(dataview не использую), а хотелось бы его делать за "кулисами" :) как быть?
...
Рейтинг: 0 / 0
Скопировать Row в DataSet
    #32533710
Sa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы заработало через autoincrement column надо модифицировать этот код следующим образом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Dim dt As DataTable = dsNN.Tables("spVeks")
Dim newId As Integer =  1000  ' Если не задан PK то такой вариант пройдет, можно сделать через AutoIncrement column 
Dim rowsCount As Integer = dt.Rows.Count ' Количество строк
Dim rowIndex As Integer =  0  ' Индекс по строкам
For rowIndex = 0 To rowsCount - 1
    Dim drwSource As Data.DataRow = dt.Rows(rowIndex) ' Строка источник данных
    Dim drwNew As DataRow = dt.NewRow   ' Новая строка-копия'
    drwNew.BeginEdit() ' Чтобы невызывать каждый раз Event
    Dim autoId As Integer = drwNew("iduvsd") ' Добавим эту строчку
    Dim columnIndex As Integer =  0 
    For columnIndex =  0  To dt.Columns.Count -  1 
        drwNew(columnIndex) = drwSource(columnIndex)
    Next
    drwNew("iduvsd") = autoId  ' изменим эту
    drwNew.EndEdit()
    dt.Rows.Add(drwNew) ' Добавим в таблицу
Next
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Скопировать Row в DataSet
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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