Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Скопировать Row в DataSet / 22 сообщений из 22, страница 1 из 1
20.05.2004, 15:57
    #32526534
hmsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
какими методами или способами лучше воспользоваться чтобы скопировать строку из таблицы dataset
и изменив значения некоторых полей этой строки добавить эту копию строки в ту же таблицу бд
?
...
Рейтинг: 0 / 0
20.05.2004, 22:46
    #32527184
hmsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
ну так лучше воспользоваться своей ХП, которая будет копировать строку по id взятому из dataset и переданному в ХП,
или же есть метод скопировать строку в datatable, а потом весь датасет обновить в бд?
?
...
Рейтинг: 0 / 0
21.05.2004, 07:34
    #32527303
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
>ну так лучше воспользоваться своей ХП, которая будет копировать строку по 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
23.05.2004, 14:01
    #32529622
hmsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
делаю так:

Код: 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
24.05.2004, 07:53
    #32529896
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
Код: 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
24.05.2004, 11:19
    #32530252
hmsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
не получается из UltraGridRow сделать DataRow
drwSource = CType(drwSource.ListObject, DataRowView).Row
...
Рейтинг: 0 / 0
24.05.2004, 11:22
    #32530264
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
Наоборот все получается :-), просто тогда вверху надо это:
Код: plaintext
1.
Dim drwSource As Infragistics.Win.UltraWinGrid.UltraGridRow
Поменять на это
Код: plaintext
1.
Dim drwSource As DataRow
...
Рейтинг: 0 / 0
24.05.2004, 12:01
    #32530365
hmsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
тогда ругается на:
drwSource = Me.ugVeks.Rows(i)
так попробовал:
drwSource = CType(Me.ugVeks.Rows(i), DataRowView).Row
пишет cannot convert ...
...
Рейтинг: 0 / 0
24.05.2004, 12:13
    #32530406
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
А мы же можем вообще от UltraGrid уйти. Для чего он нам?
Ведь источником UltraGrid является какой то DataSet (DataTable and etc) . Надо сразу же брать необходимые строки из этого набора данных и все.

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

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

Дано: 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
24.05.2004, 16:15
    #32531028
hmsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
мне нужно скопировать их в ту же таблицу ...
а в вашем примере же получаем новую таблицу
...
Рейтинг: 0 / 0
24.05.2004, 20:21
    #32531479
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
Ну ни что нам не мешает объединить эту таблицу с DataSet
DataSet.Merge(dtTarget) ' где DataSet первичный DataSet

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

Основное меня интересует что вы собираетесь в конечном итоге делать с копированными записями:
Добавить их в БД? как у вас задается ID? Используются при этом хранимые процедуры? Какие ? и т.д
Потому что этот вариант (как и любой другой :-) ) имеет свое ограничение в использовании.
...
Рейтинг: 0 / 0
25.05.2004, 10:06
    #32531718
hmsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
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
25.05.2004, 10:07
    #32531719
hmsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
пробую merge
...
Рейтинг: 0 / 0
25.05.2004, 10:44
    #32531823
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
>Id у меня Identity , я добавляю их в таблицу uchveks из прошлого топика про обновление,
собственно так и буду их добавлять в бд при обновлении dataset
те хранимые процедуры при обновлении и используются
мне все равно какой id будет у новых записей

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

А этот вариант тоже понятно почему не работает, коллекция меняется вызывается исключение при Next. Сейчас исправлюсь :-)
...
Рейтинг: 0 / 0
25.05.2004, 10:54
    #32531859
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
Вместо этого кода:
Код: 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
26.05.2004, 01:12
    #32533623
hmsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
спасибо! всё получилось!
только вот два вопроса:
1. Почему 1000 для нового id? пробовал через AutoIncrement column с выставленым шагом -1 - не получилось, а с тыщей работает!
2. Результат этого копирования сразу отображается в гриде(dataview не использую), а хотелось бы его делать за "кулисами" :) как быть?
...
Рейтинг: 0 / 0
26.05.2004, 08:04
    #32533710
Sa
Sa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скопировать Row в DataSet
Чтобы заработало через 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
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Скопировать Row в DataSet / 22 сообщений из 22, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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