Копирование данных из одного поля базы данных в другое поле базы данных - PullRequest
0 голосов
/ 06 октября 2010

Я немного в поле.У нас есть среда разработки и насыщенная среда для наших баз данных Oracle.
Вот чего я хочу достичь.Я хочу скопировать данные из числа столбцов моего разработчика.окружающая среда к тому же х количество столбцов в моей окружающей среде.Я уже попробовал некоторые вещи и создал несколько функций, которые копируют все записи в мою среду sat (то есть из всех столбцов или полей, если хотите).

Function fncCopyDataTo(ByVal objFrom As OleDb.OleDbConnection, _
    ByVal objTo As OleDb.OleDbConnection, _
    ByVal objTrans As OleDb.OleDbTransaction, _
    ByVal strTable As String, _
    ByVal strFieldNames() As String, _
    ByVal strWhereClause As String, _
    ByVal blnBackup As Boolean, _
    ByRef strErrorText As String) As Boolean
        Dim objCmd As OleDb.OleDbCommand
        Dim drTemp As OleDb.OleDbDataReader
        Dim intAffected As Integer
        Dim strSQL As String
        Dim blnDeleteTo As Boolean
        Dim blnOK As Boolean


        blnOK = True
        strSQL = "SELECT * FROM " & strTable
        If Not strWhereClause Is Nothing Then
            strSQL = strSQL & " WHERE " & strWhereClause
        End If

        If Not blnBackup Then
            objCmd = objTo.CreateCommand()
            objCmd.Transaction = objTrans
            objCmd.CommandType = CommandType.Text
            objCmd.CommandText = strSQL
            drTemp = objCmd.ExecuteReader(CommandBehavior.Default)

            If drTemp.HasRows Then
                blnDeleteTo = True
            Else
                blnDeleteTo = False
            End If
            drTemp.Close()

            If blnDeleteTo Then
                strSQL = "DELETE FROM " & strTable
                If Not strWhereClause Is Nothing Then
                    strSQL = strSQL & " WHERE " & strWhereClause
                End If
                objCmd.CommandText = strSQL
                intAffected = objCmd.ExecuteNonQuery()
                If intAffected < 1 Then
                    blnOK = False
                    strErrorText = "Failed to delete table '" & strTable _
                    & "' because of issue with: intAffected = " & intAffected
                End If
            End If

        End If

        If blnOK Then
            objCmd = objFrom.CreateCommand()
            objCmd.CommandText = "SELECT COUNT(*) FROM " & strTable
            If Not strWhereClause Is Nothing Then
                strSQL = strSQL & " WHERE " & strWhereClause
            End If
            pbrVTReleaser.Maximum = objCmd.ExecuteScalar()
            pbrVTReleaser.Minimum = 0
            pbrVTReleaser.Value = 0
            objCmd.CommandType = CommandType.Text
            strSQL = "SELECT * FROM " & strTable
            If Not strWhereClause Is Nothing Then
                strSQL = strSQL & " WHERE " & strWhereClause
            End If

            objCmd.CommandText = strSQL

            drTemp = objCmd.ExecuteReader(CommandBehavior.SequentialAccess)
            While drTemp.Read() And blnOK
                StsBar.Text = "Releasing " & strTable
                blnOK = fncCopyRowTo(strTable, Nothing, objTo, objTrans, drTemp, blnBackup, strErrorText)
                pbrVTReleaser.Value = pbrVTReleaser.Value + 1

            End While

            strSQL = "SELECT * FROM " & strTable

            If Not blnBackup Then
                objCmd = objTo.CreateCommand()
                objCmd.Transaction = objTrans
                objCmd.CommandType = CommandType.Text
                objCmd.CommandText = strSQL
                intAffected = objCmd.ExecuteNonQuery()
            End If

        End If
        drTemp.Close()
        fncCopyDataTo = blnOK
        objCmd.Dispose()
    End Function 

Это моя функция копирования данныхи вот как я вставляю строки

Function fncCopyRowTo(ByVal strTable As String, _
    ByVal strFieldName As String, _
    ByVal objTo As OleDb.OleDbConnection, _
    ByVal objTrans As OleDb.OleDbTransaction, _
    ByVal drFrom As OleDb.OleDbDataReader, _
    ByVal blnBackup As Boolean, _
    ByRef strErrorText As String) As Boolean
        Dim objCmd As OleDb.OleDbCommand
        Dim strSQL As String, strSQLCreateTB As String
        Dim strParam As String
        Dim intIndex As Integer
        Dim intAffected As Integer
        Dim blnOK As Boolean
        Dim strField As String


        blnOK = True
        objCmd = objTo.CreateCommand()
        objCmd.Transaction = objTrans
        objCmd.CommandType = CommandType.Text

        strSQL = "INSERT INTO " & strTable & " ( "
        strParam = ""
        objCmd.Parameters.Clear()

        strSQLCreateTB = "CREATE TABLE " & strTable & " ( "    
        For intIndex = 0 To drFrom.FieldCount - 1
            If intIndex > 0 Then
                strSQL = strSQL & ", "
                strSQLCreateTB = strSQLCreateTB & " char(10)"
                strSQLCreateTB = strSQLCreateTB & ", "
                strParam = strParam & ", "
            End If
            strField = drFrom.GetName(intIndex)
            strSQL = strSQL & strField
            strSQLCreateTB = strSQLCreateTB & strField
            objCmd.Parameters.Add(New OleDb.OleDbParameter(drFrom.GetName(intIndex), drFrom.GetValue(intIndex)))

            strParam = strParam & "?"
        Next
        strSQL = strSQL & " ) VALUES ( " & strParam & " )" '
        strSQLCreateTB = strSQLCreateTB & " char(10))"

        If blnBackup Then
            blnOK = fncCreateTblDB(strSQLCreateTB)
        End If

        objCmd.CommandText = strSQL

        If Not blnBackup Then
            intAffected = objCmd.ExecuteNonQuery()
            If intAffected < 1 Then
                blnOK = False
                strErrorText = "Failed to insert into table '" & strTable _
                & "' because of issue with: intAffected = " & intAffected
            End If
        End If

        fncCopyRowTo = blnOK
    End Function

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

Я думал об этом и пришел к выводу, что мне следует сделать следующее: 1) при выполнении функции сначала создать копию (резервную копию) из моей текущей среды.(мы будем использовать это позже)

2) выполнить то же действие, которое использовалось при копировании всех данных, то есть удалить данные в sat.

3) каким-то образом объединить данные из моей среды разработки скопия окружающей среды.

пример: скажем,

DEV data  has 4 columns   1   2   3   4 
                          x   x   x   x
                          x   x   x   x
                          x   x   x   x


SAT data                  1  2  3  4     identical with different data  
                          0  0  0  0
                          0  0  0  0
                          0  0  0  0

SAT COPY data             1  2  3  4 
                          0  0  0  0
                          0  0  0  0 
                          0  0  0  0

new SAT DATA(merge)       1  2  3  4
                          0  x  0  x 
                          0  x  0  x
                          0  x  0  x

Итак, как вы можете видеть, только столбцы 2 и 4 содержат данные из моей среды разработки, а 1 и 3 все еще содержат данные из моей старой среды хранения..

Это то, чего я хочу достичь.Это возможно ?Если да, то есть идеи, как мне этого добиться?

edit: Просто подумал об этом, и, возможно, я смогу создать оператор вставки с данными из обеих моих баз данных.

Редактировать: Вот мой прогресс.Я решил создать временную таблицу, содержащую информацию из моей среды SAT.И решил использовать это как резервную копию.
Я не только использую это как резервную копию, я также использую поля, которые мне нужны из этой таблицы, и создаю оператор вставки.

1 Ответ

0 голосов
/ 06 октября 2010

"Как вы можете видеть, мне нужно было удалить оператор в моей функции copydata, потому что в противном случае я получу ошибку нарушения уникального ограничения. Также нет уникальных идентификаторов"

Уникальное ограничение подразумевает, что существует некоторый уникальный идентификатор,Вы имеете в виду, что нет единственного столбца, который действует как идентификатор?

Независимо от того, делаете ли вы это по UPDATE или по INSERT, который извлекает некоторые столбцы из каждой базы данных, вам нужен какой-то метод сопоставления строк в DEV со строкамив сб.Если совпадение не является уникальным, вы получите либо недетерминированные результаты, либо больше строк, чем вы начали.

Единственная альтернатива, о которой я могу подумать, это то, что у вас есть неявное упорядочение строк, и вы хотите сопоставитьна этом - что в конечном итоге ничем не отличается, вы можете просто сгенерировать уникальный идентификатор из порядков.

Скажем, в следующем примере вы хотите скопировать столбец 2 из DEV в SAT.Что решает, какое значение в DEV входит в какую строку в SAT?

DEV data                  1   2
                          x   u
                          y   v
                          z   w


SAT data                  1  2
                          a  0
                          b  0
                          c  0

new SAT DATA(merge)       1  2
                          a  ?
                          b  ?
                          c  ?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...