Скопировать данные из однои таблицы в другую

Форум посвящён работе с базами данных в .NET.

Модератор: Ramzes

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Скопировать данные из однои таблицы в другую

Сообщение student-uni » 06.04.2006 (Чт) 11:32

Задача:
Скопировать данные из однои таблицы А /Аксесс/ в другую Б /MS SQL/
Все поля и имена из А присутствуют в Б и идентичны по имени и типу.
Но Б может иметь и дополнительные поля.


Вот какую уродскую подпрогу наваял я. VB.NET

Если кто наидет умнее решение или алгоритм
-буду признателен.

Заранее Спасибо
Код: Выделить всё
' Итак вынимаем все из Access и запихиваем в Датасет
Dim ConnectionString2 As String = "Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Registry Path=;Jet OLEDB:Database Locking Mode=1;Data Source= ... итд "
            Dim conn2 As OleDbConnection = New OleDbConnection(ConnectionString2)

            Dim connTools As SqlConnection = New SqlConnection(ConnectionString)

            Dim sql3 As String = "SELECT * FROM " + SourceTab

            Dim da2 As OleDbDataAdapter = New OleDbDataAdapter(sql3, conn2)
            Dim ds2 As DataSet = New DataSet

            ds2.Clear()

            conn2.Open()

            da2.Fill(ds2)

            conn2.Close()

'Теперь надо изьять Имена полеи и запихнуть их в отдельныи массив
' дабы потом использовать их для записи
Dim SPALTANZAHL As Int32 = ds2.Tables.Item(0).Columns.Count
                        Dim SPAHLTENAME(SPALTANZAHL - 1) As String

            Dim i%


            Dim CM As DataColumn
             
            For i = 0 To ds2.Tables.Item(0).Columns.Count - 1

                SPAHLTENAME(i) = ds2.Tables.Item(0).Columns.Item(i).ColumnName()

            Next

'теперь надо сконструировать запрос типа INSERT INTO имена полеи - значения


' Итак для каждои строки в датасете

For Each zeile2 In ds2.Tables.Item(0).Rows
                                 
                Dim PfadUpdateStr As String ' сюда будем склеивать имена полеи
                Dim PfadUpdateStr2 As String = " " ' сюда будем склеивать значения полеи
                Dim Erstmal As Boolean = True ' первыи раз запятую между значениями не ставим


                'ето начало запроса
                PfadUpdateStr = " INSERT INTO " + DestTab + "

' сколько полеи столько раз и клеим
For i = 0 To ds2.Tables.Item(0).Columns.Count - 1


'если значение не пустое

                    If Convert.ToString(zeile2.Item(i)) <> "" Then
                        If Erstmal = False Then
' первыи раз запятую не ставим
' потом ставим всегда
                            PfadUpdateStr = PfadUpdateStr + ","
                            PfadUpdateStr2 = PfadUpdateStr2 + ","
                        End If
                        Erstmal = False


' склеиваем имена колонок
                        PfadUpdateStr = PfadUpdateStr + " " + SPAHLTENAME(i)

                         
' склеиваем значения и если оно текстовое - тогда в кавычки
                         
                        If (zeile2.Item(i).GetType.ToString) = "System.String" Then

                            PfadUpdateStr2 = PfadUpdateStr2 + " '" + Convert.ToString(zeile2.Item(i)) + "' "
                        Else
                            PfadUpdateStr2 = PfadUpdateStr2 + " " & (zeile2.Item(i))

                        End If




                    End If

                Next
                PfadUpdateStr = PfadUpdateStr + ") " + " VALUES ( "
                PfadUpdateStr2 = PfadUpdateStr2 + ") "

                PfadUpdateStr = PfadUpdateStr + PfadUpdateStr2

' собираем все до кучи
' в результате имеем SQL запрос для ввода однои строки

' делаем коммандо и выполняем запрос
Dim PfadUpdateCommand As SqlCommand = New SqlCommand(PfadUpdateStr, connTools)

                 
'выбираем базу
                Dim Cmd1 As SqlCommand = New SqlCommand("USE " + "test1", connTools)
'включаем идентити /могут идексы попасться/
                Dim Cmd2 As SqlCommand = New SqlCommand("SET IDENTITY_INSERT " + DestTab + " ON", connTools)


                connTools.Open()
                Cmd1.ExecuteNonQuery()
                Cmd2.ExecuteNonQuery() 'Identity On

                Try
                    PfadUpdateCommand.ExecuteNonQuery() '
                Catch ex As Exception
                    MsgBox(ex.ToString)
                End Try

       'Строка заполнена. Повторяем все для всех строк


student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 06.04.2006 (Чт) 11:44

На счет ДТС:

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

Так сказать "сидя на клиенте" у меня нет доступа к Ентерпраиз менеджер.
В вышеприведенном примере я могу все же чисто теоретически составить скрипт из всех полученных инструкции и запустить его на сервере.

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 06.04.2006 (Чт) 11:48

НУжно всего лишь вытащить Datatable из одной базы, указать всем записям Added. и через DataAdapter.Update засунуть в другую базу. При условии что структура идентична. И все дататипы поддерживаются.
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 06.04.2006 (Чт) 12:59

что значит

указать всем записям Added.


остальное вроде понятно


НУжно всего лишь вытащить Datatable из одной базы


Код: Выделить всё
Dim sql3 As String = "SELECT * FROM " + SourceTab

            Dim da2 As OleDbDataAdapter = New OleDbDataAdapter(sql3, conn2)
            Dim ds2 As DataSet = New DataSet

            ds2.Clear()

            conn2.Open()

            da2.Fill(ds2)

            conn2.Close()

Dim DT As DataTable = ds2.Tables.Item(0)



через DataAdapter.Update засунуть в другую базу

Код: Выделить всё
Dim sql1 As String = "SELECT * FROM " + DestinationTab

            Dim da1 As sqlDataAdapter = New sqlDataAdapter(sql1, conn1)
            Dim ds1 As DataSet = New DataSet

            ds1.Clear()

            conn1.Open()

            da1.Fill(ds1)

            conn1.Close()


da1.Update(ds1)

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 06.04.2006 (Чт) 14:51

вытащить Datatable из одной базы

а как ето сделать если база пустая ?

заполнить дататсет не удается
Код: Выделить всё
Dim sql3 As String = "SELECT * FROM " + SourceTab

            Dim da2 As OleDbDataAdapter = New OleDbDataAdapter(sql3, conn2)
            Dim ds2 As DataSet = New DataSet

            ds2.Clear()

            conn2.Open()

            da2.Fill(ds2)

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 06.04.2006 (Чт) 16:47

Public Sub SetAdded()
Member of: System.Data.DataRow
Summary:
Changes the System.Data.DataRow.Rowstate of a System.Data.DataRow to Added.

как ето сделать если база пустая ?


ЧТО "ето" ?
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

student-uni
Бывалый
Бывалый
 
Сообщения: 242
Зарегистрирован: 01.10.2005 (Сб) 18:54

Сообщение student-uni » 07.04.2006 (Пт) 10:36

Как сделать Fill.Dataset если база пустая ?

Если я правильно понял, нужно:

Из базы- приемника-
Создать дата адаптер используя запрос "SELECT * FROM destinationDB"
Заполнить Fill.Dataset , назвать таблицу напр "Table1"

Из базы- источника-
Создать дата адаптер используя запрос "SELECT * FROM sourceDB"
Заполнить тотже самыи датасет , ту же таблицу "Table1"


пометить записи как добавленные и сказать датаАдаптеру - приемника - UPDATE
daDest.Update(ds2.Tables.Item(0).GetChanges(DataRowState.Added))

Проблема:
база приемник - абсолютно пустая!
Таблица есть, форматы есть а значении - еще нет.
и запрос "SELECT * FROM destinationDB" возвращает - ничего.
И попытка Fill.Dataset вызывет ошибку.
Вопрос:
Как создать датасет если база пустая ?

или я неправильно все понял ?

Sebas
Неуловимый Джо
Неуловимый Джо
Аватара пользователя
 
Сообщения: 3626
Зарегистрирован: 12.02.2002 (Вт) 17:25
Откуда: столько наглости такие вопросы задавать

Сообщение Sebas » 07.04.2006 (Пт) 13:22

нечего второй раз заполнять не надо.
Просто подмени коннекшн у дата адаптера и сделай Update
- Я никогда не понимал, почему они приходят ко мне чтобы умирать?

sebas<-@->mail.ru

lonejan
Начинающий
Начинающий
 
Сообщения: 14
Зарегистрирован: 15.05.2006 (Пн) 9:24
Откуда: Houston

Сообщение lonejan » 15.05.2006 (Пн) 9:26

Подскажите как сделать такое в ВБ6.0!!!
...и если есть те кто приходят к тебе, найдутся и те кто придёт за тобой...(С) Наутилус

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 15.05.2006 (Пн) 17:34

Тебе подсказывают в твоей теме. Сюда не надо.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

baha76
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 168
Зарегистрирован: 07.01.2004 (Ср) 10:59
Откуда: Ташкент

Сообщение baha76 » 16.05.2006 (Вт) 7:05

Можешь еще скопировать данные из одной Датасет в другую и обновить эту другую.


Вернуться в ADO.NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17

    TopList