Скопировать данные из однои таблицы А /Аксесс/ в другую Б /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
'Строка заполнена. Повторяем все для всех строк