none
Как можно импортировать строку с одной таблицы в другую без ключего поля? RRS feed

  • Вопрос

  • Здравствуйте,

    Как можно импортировать строку с одной таблицы в другую без ключего поля?

    Вот мой код, что нужно сюда добавить?

    For Each MydataRow In Test2DataSet.fttutsaq.Select ("[noqeyd]" & " like " & "'" & Me.NOQEYDTextBox.Text & "%'")

    Test2DataSet.destination.ImportRow(MydataRow)

    Next MydataRow


    Спасибо

    1 марта 2012 г. 16:52

Ответы

  • Пришлось так и сделать :( целых 79 полей

      Dim WorkRow As DataRow = Me.Test2DataSet.FTDEST.NewRow
            For Each mydatarow In Test2DataSet.fttutsaq.Select("[noqeyd]" & "like" & " '" & Me.NOQEYDTextBox.Text & "%'")
                WorkRow(1) = mydatarow(1)
                WorkRow(2) = "2"
                WorkRow(3) = mydatarow(3)
                WorkRow(4) = mydatarow(4)
                WorkRow(5) = mydatarow(5)
                WorkRow(6) = Me.ComboBox2.SelectedValue
                WorkRow(7) = mydatarow(7)
                WorkRow(8) = mydatarow(8)
                WorkRow(9) = mydatarow(9)
                WorkRow(10) = mydatarow(10)
                WorkRow(11) = mydatarow(11)
                WorkRow(12) = mydatarow(12)
                WorkRow(13) = mydatarow(13)
                WorkRow(14) = mydatarow(14)
                WorkRow(15) = mydatarow(15)
                WorkRow(16) = mydatarow(16)
                WorkRow(17) = mydatarow(17)
                WorkRow(18) = mydatarow(18)
                WorkRow(19) = mydatarow(19)
                WorkRow(20) = mydatarow(20)
                WorkRow(21) = mydatarow(21)
                WorkRow(22) = mydatarow(22)
                WorkRow(23) = mydatarow(23)
                WorkRow(24) = mydatarow(24)
                WorkRow(25) = mydatarow(25)
                WorkRow(26) = Me.MaskedTextBox1.Text
                WorkRow(27) = mydatarow(27)
                WorkRow(28) = mydatarow(28)
                WorkRow(29) = mydatarow(29)
                WorkRow(30) = mydatarow(30)
                WorkRow(31) = mydatarow(31)
                WorkRow(32) = mydatarow(32)
                WorkRow(33) = mydatarow(33)
                WorkRow(34) = mydatarow(34)
                WorkRow(35) = mydatarow(35)
                WorkRow(36) = mydatarow(36)
                WorkRow(37) = mydatarow(37)
                WorkRow(38) = mydatarow(38)
                WorkRow(39) = mydatarow(39)
                WorkRow(40) = mydatarow(40)
                WorkRow(41) = mydatarow(41)
                WorkRow(42) = mydatarow(42)
                WorkRow(43) = mydatarow(43)
                WorkRow(44) = mydatarow(44)
                WorkRow(45) = mydatarow(45)
                WorkRow(46) = mydatarow(46)
                WorkRow(47) = mydatarow(47)
                WorkRow(48) = mydatarow(48)
                WorkRow(49) = mydatarow(49)
                WorkRow(50) = mydatarow(50)
                WorkRow(51) = mydatarow(51)
                WorkRow(52) = mydatarow(52)
                WorkRow(53) = mydatarow(53)
                WorkRow(54) = mydatarow(54)
                WorkRow(55) = mydatarow(55)
                WorkRow(56) = mydatarow(56)
                WorkRow(57) = mydatarow(57)
                WorkRow(58) = mydatarow(58)
                WorkRow(59) = mydatarow(59)
                WorkRow(60) = mydatarow(60)
                WorkRow(61) = mydatarow(61)
                WorkRow(62) = mydatarow(62)
                WorkRow(63) = mydatarow(63)
                WorkRow(64) = mydatarow(64)
                WorkRow(65) = mydatarow(65)
                WorkRow(66) = mydatarow(66)
                WorkRow(67) = mydatarow(67)
                WorkRow(68) = mydatarow(68)
                WorkRow(69) = mydatarow(69)
                WorkRow(70) = mydatarow(70)
                WorkRow(71) = mydatarow(71)
                WorkRow(72) = Me.ComboBox1.SelectedValue
                WorkRow(73) = mydatarow(73)
                WorkRow(74) = mydatarow(74)
                WorkRow(75) = mydatarow(75)
                WorkRow(76) = mydatarow(76)
                WorkRow(77) = mydatarow(77)
                WorkRow(78) = mydatarow(78)
                WorkRow(79) = mydatarow(79)
                Me.Test2DataSet.FTDEST.Rows.Add(WorkRow)
            Next mydatarow
    

    • Помечено в качестве ответа Abolmasov Dmitry 5 марта 2012 г. 9:05
    5 марта 2012 г. 8:43

Все ответы

  • Здравствуйте.

    Не очень понятен вопрос, вы можете его перефразировать? Что вы выбираете и куда как вставляете, какова структура таблиц?

    Спасибо.


    Для связи [mail]

    2 марта 2012 г. 11:29
  • Спасибо что откликнулись на мой вопрос.

    Я имею две таблицы, оба обдной структуры и с одинаковыми полями один к одному. В первую таблицу вводятся данные вручную, такие как фамилия, имя, отчество, дата рождения и т.д. Вторая таблица имеет только структуру. Часто нужно бывает просто путем выборки по разнным данным копировать строки с первой таблицы на второй. Я код прописал, но дело в том что в этом случае копируется также и ключевое поле тоже, а она имеет автоматический счетчик и уникальное значение. Так вот иногда приходится по 10 раз импортировать одну и ту же строку во вторую таблицу. А так как строка имеет уникальное значение это не получается.

    Мне нужно чтоб я смог импортировать строку со всеми стоблцами кроме ключевого поля, чтоб во второй таблице счетчик работал по своей последовательности.

    Код у меня такой:

    For EachMydataRowIn Test2DataSet.fttutsaq.Select ("[noqeyd]"& " like " & "'" & Me.NOQEYDTextBox.Text & "%'")

    Test2DataSet.destination.ImportRow(MydataRow)

    NextMydataRow

    Для информации скажу что ключевое поле у меня называется  "KEY"

    Спасибо


    2 марта 2012 г. 11:41
  • А какой смысл копировать данные из одной таблицы в другую?

    2 марта 2012 г. 12:07
    Модератор
  • А какой смысл копировать данные из одной таблицы в другую?

    ОК, попытаюсь обяснить. Например у вас в фирме 100 сотрудников. Фирму назовем буквой А, также у вас есть филиалы фирмы Б, В, Г, Д. Ваши сотрудники  часто бывают в командировках, несколько раз в месяц и вам нужно знать кто, когда и сколько раз в какой из этих филиалах бывал, также нужно быстро напечатать путевки и другие бланки которые можно заполнить ввиде списка и других отчетов со второй таблицы с помощю определенной выборки,

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

    Спасибо


    2 марта 2012 г. 12:42
  • Дело не в том, что я не хочу помочь и не разбираюсь в этом. Раз задал вопрос,значит пытаюсь понять суть вашего вопроса, иначе бы не отвечал.

    2 марта 2012 г. 13:05
    Модератор
  • Для вашего случая как раз и были придуманы представления(виртальные таблицы), они сами не содержат данные но из кода с ними можно работать как с полноценными таблицами, и данные в этом случае не дубдируются и следовательно повышается эффективность обработки данных.

    Важнее изначально создать насколько возможно правильную структуру БД потратив на это больше времени, чем потом мучиться исправляя ошибки, которые порой неисправимы, потратив при этом больше времени.

    2 марта 2012 г. 13:15
    Модератор
  • Можете вместо ImportRow использовать NewRow и заполнение ее нужными данными, а после добавление этой Row в DataTable.

    Пример


    Для связи [mail]

    2 марта 2012 г. 13:25
  • Для вашего случая как раз и были придуманы представления(виртальные таблицы), они сами не содержат данные но из кода с ними можно работать как с полноценными таблицами, и данные в этом случае не дубдируются и следовательно повышается эффективность обработки данных.

    Важнее изначально создать насколько возможно правильную структуру БД потратив на это больше времени, чем потом мучиться исправляя ошибки, которые порой неисправимы, потратив при этом больше времени.


    Но мне нужно чтоб они именно дублировались, потому что в этом случае в конце месяца, четверти, полгода или же года можно будет использовать эти данные для отчета, вовторых если может быть что мне понадобится сделать импорт строки для таблицы что стоит в базе данных программы что стоит в филиале, или же по простой причине что человек уволился, а его уже не нужно держать в таблице где активные работники, а просто переместить его данные в архивную таблицу.
    2 марта 2012 г. 14:14
  • Можете вместо ImportRow использовать NewRow и заполнение ее нужными данными, а после добавление этой Row в DataTable.

    Пример


    Для связи [mail]


    Я попробовал Ваш пример, но он не подошел. Потому что насколько я понял он просто создает и добавляет НОВЫЕ стоблцы и строки
    2 марта 2012 г. 14:17
  • Ну так и ImportRow добавляет новую строку в таблицу (строка сразу заполненная). А про NewRow нужно в коде задать значения соответсвующим столбцам.


    Для связи [mail]

    2 марта 2012 г. 15:48
  • Возможно Вам подойдет такой вариант (сорри, на C#):

    foreach DataRow mydatarow in Test2DataSet.fttutsaq.Select("[noqeyd]"& " like " & "'" & Me.NOQEYDTextBox.Text & "%'")

    {

       DataRow newrow = Test2DataSet.destination.NewRow();

      newrow["field1"] = mydatarow["field1"];

      //и так для все полей кроме KEY

      Test2DataSet.destination.Rows.Add(newrow);

    }

    2 марта 2012 г. 15:59
  • Возможно Вам подойдет такой вариант (сорри, на C#):

    foreach DataRow mydatarow in Test2DataSet.fttutsaq.Select("[noqeyd]"& " like " & "'" & Me.NOQEYDTextBox.Text & "%'")

    {

       DataRow newrow = Test2DataSet.destination.NewRow();

      newrow["field1"] = mydatarow["field1"];

      //и так для все полей кроме KEY

      Test2DataSet.destination.Rows.Add(newrow);

    }

    То есть

    field1=field1

    field2=field2

    field3=field3..... и так далее?

    если да, то так не охото делать это :)

    там этих полей очень много :(

    2 марта 2012 г. 16:05
  • Ну так и ImportRow добавляет новую строку в таблицу (строка сразу заполненная). А про NewRow нужно в коде задать значения соответсвующим столбцам.


    Для связи [mail]

    то есть все таки нужно все столбцы перечислять?

    послушайте, я так понял что все таки есть вариант, только я не могу его праввильно применить. Значить я обратил внимание что в таблице у меня 5000 записей, когда я даю команду просто ME.DESTINATIONTABindingSource.AddNew() то ключевое поле получает значение -1, -2, -3 и т.д. а не 5001, 5002, 5003. После добавления данных в эти строки и сохранения последовательность восстановливается, то есть то что -1 становится 5001. И это делается либо так:

     dataSet.EnforceConstraints = False
        ' Change the values of all rows to 1.
        Dim thisRow As DataRow
        For Each thisRow In table.rows
           thisRow("col1") = 1
        Next
    
        Try
            dataSet.EnforceConstraints = True
        Catch e As System.Data.ConstraintException
    	    ' Process exception and return.
            Console.WriteLine("Exception of type {0} occurred.", _
                e.GetType().ToString())
        End Try
    

    либо так:

        With Test2DataSet.FTDEST.Columns("key")
                    .AutoIncrement = True
                    .AutoIncrementSeed = -1
                    .AutoIncrementStep = -1
    
                End With

    Но как именно все это правильно связать я незнаю
    2 марта 2012 г. 16:22
  • Не обязательно так, можно воспользоваться свойством ItemArray и присвоить все поля в цикле, кроме 1го. Должно получиться.


    Для связи [mail]

    5 марта 2012 г. 8:32
  • Пришлось так и сделать :( целых 79 полей

      Dim WorkRow As DataRow = Me.Test2DataSet.FTDEST.NewRow
            For Each mydatarow In Test2DataSet.fttutsaq.Select("[noqeyd]" & "like" & " '" & Me.NOQEYDTextBox.Text & "%'")
                WorkRow(1) = mydatarow(1)
                WorkRow(2) = "2"
                WorkRow(3) = mydatarow(3)
                WorkRow(4) = mydatarow(4)
                WorkRow(5) = mydatarow(5)
                WorkRow(6) = Me.ComboBox2.SelectedValue
                WorkRow(7) = mydatarow(7)
                WorkRow(8) = mydatarow(8)
                WorkRow(9) = mydatarow(9)
                WorkRow(10) = mydatarow(10)
                WorkRow(11) = mydatarow(11)
                WorkRow(12) = mydatarow(12)
                WorkRow(13) = mydatarow(13)
                WorkRow(14) = mydatarow(14)
                WorkRow(15) = mydatarow(15)
                WorkRow(16) = mydatarow(16)
                WorkRow(17) = mydatarow(17)
                WorkRow(18) = mydatarow(18)
                WorkRow(19) = mydatarow(19)
                WorkRow(20) = mydatarow(20)
                WorkRow(21) = mydatarow(21)
                WorkRow(22) = mydatarow(22)
                WorkRow(23) = mydatarow(23)
                WorkRow(24) = mydatarow(24)
                WorkRow(25) = mydatarow(25)
                WorkRow(26) = Me.MaskedTextBox1.Text
                WorkRow(27) = mydatarow(27)
                WorkRow(28) = mydatarow(28)
                WorkRow(29) = mydatarow(29)
                WorkRow(30) = mydatarow(30)
                WorkRow(31) = mydatarow(31)
                WorkRow(32) = mydatarow(32)
                WorkRow(33) = mydatarow(33)
                WorkRow(34) = mydatarow(34)
                WorkRow(35) = mydatarow(35)
                WorkRow(36) = mydatarow(36)
                WorkRow(37) = mydatarow(37)
                WorkRow(38) = mydatarow(38)
                WorkRow(39) = mydatarow(39)
                WorkRow(40) = mydatarow(40)
                WorkRow(41) = mydatarow(41)
                WorkRow(42) = mydatarow(42)
                WorkRow(43) = mydatarow(43)
                WorkRow(44) = mydatarow(44)
                WorkRow(45) = mydatarow(45)
                WorkRow(46) = mydatarow(46)
                WorkRow(47) = mydatarow(47)
                WorkRow(48) = mydatarow(48)
                WorkRow(49) = mydatarow(49)
                WorkRow(50) = mydatarow(50)
                WorkRow(51) = mydatarow(51)
                WorkRow(52) = mydatarow(52)
                WorkRow(53) = mydatarow(53)
                WorkRow(54) = mydatarow(54)
                WorkRow(55) = mydatarow(55)
                WorkRow(56) = mydatarow(56)
                WorkRow(57) = mydatarow(57)
                WorkRow(58) = mydatarow(58)
                WorkRow(59) = mydatarow(59)
                WorkRow(60) = mydatarow(60)
                WorkRow(61) = mydatarow(61)
                WorkRow(62) = mydatarow(62)
                WorkRow(63) = mydatarow(63)
                WorkRow(64) = mydatarow(64)
                WorkRow(65) = mydatarow(65)
                WorkRow(66) = mydatarow(66)
                WorkRow(67) = mydatarow(67)
                WorkRow(68) = mydatarow(68)
                WorkRow(69) = mydatarow(69)
                WorkRow(70) = mydatarow(70)
                WorkRow(71) = mydatarow(71)
                WorkRow(72) = Me.ComboBox1.SelectedValue
                WorkRow(73) = mydatarow(73)
                WorkRow(74) = mydatarow(74)
                WorkRow(75) = mydatarow(75)
                WorkRow(76) = mydatarow(76)
                WorkRow(77) = mydatarow(77)
                WorkRow(78) = mydatarow(78)
                WorkRow(79) = mydatarow(79)
                Me.Test2DataSet.FTDEST.Rows.Add(WorkRow)
            Next mydatarow
    

    • Помечено в качестве ответа Abolmasov Dmitry 5 марта 2012 г. 9:05
    5 марта 2012 г. 8:43
  • Так тут тоже можно было обойтись циклом с исключениями, ну раз сделали, то наверн не стоит переделывать.

    Для связи [mail]

    5 марта 2012 г. 9:04
  • Вообще конечно страшно, 79 столбцов в одной таблице. Может вам действительно стоит пересмотреть структуру БД пока это еще возможно.


    Для связи [mail]

    5 марта 2012 г. 9:06
  • Извините, но Вы разговариваете со мной как с профи. А я просто любитель и образование юридическое. Вот еслиб Вы мне написали бы в примере, может я и понял. Но в любом случае спасибо Вам за отклик
    5 марта 2012 г. 9:07
  • Эх нет, все таки нужно, слишком много информации приходится вводить о человеке.
    5 марта 2012 г. 9:09
  • Посмотрите Оператор For... Next (Visual Basic)

    Например, как в 1ом примере, у вас будет переменная index, тогда присваивание значений стобцам будет выглядеть так WorkRow(index) = mydatarow(index).

    Но перед этим присваиванием нужно с помощью Оператор If...Then...Else (Visual Basic) проверить index на частные случаи и выполнить соответсвующие присваивания.

    Т.е. стуркутра будет такая:

    If index = частныйСлучай1 Then
    ' обработка....
    ElseIf index = частныйСлучай2 Then
    ' обработка ...
    Else
    'общий случай 
    End If
    


    Для связи [mail]

    5 марта 2012 г. 9:43