将数据从一个数据库字段复制到另一个数据库字段

时间:2010-10-06 14:12:48

标签: database vb.net oracle

我在这里有点间隔。我们的oracle数据库有一个开发环境和一个sat环境 这就是我想要实现的目标。我想从我的dev的x列中复制数据。环境与我坐着的环境的x列相同。我已经尝试了一些东西并创建了一些函数,可以将所有记录复制到我的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函数中使用delete语句,否则我将获得违反唯一约束的错误。除了我可以使用更新查询创建相同的函数之外,还没有唯一标识符。

我已经考虑过了,我得出的结论是我应该做到以下几点: 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仍然包含来自我旧环境的数据。

这就是我想要实现的目标。 这可能吗 ? 如果是这样,任何想法我怎么能实现这一点?

编辑:只是对它进行了一些思考,也许我可以使用来自两个数据库的数据创建一个insert语句。

编辑:这是我的进步。我决定创建一个包含来自SAT环境的信息的临时表。并决定使用它作为备份 我不仅使用它作为备份我还使用此表中需要的字段并创建我的insert语句。

1 个答案:

答案 0 :(得分:0)

“你可以看到我在我的copydata函数中需要删除语句,否则我将得到违反唯一约束的错误。还没有唯一标识符”

唯一约束意味着存在一些唯一标识符。您的意思是没有单个列充当标识符吗?

无论是通过UPDATE还是通过从每个数据库中提取一些列的INSERT来执行此操作,都需要一些方法将DEV中的行与SAT中的行进行匹配。如果匹配不是唯一的,您将得到不确定的结果或比您开始时更多的行。

我能想到的唯一选择是你有一些行的隐式排序,你想要匹配 - 最终没有什么不同,你可以从排序中生成唯一标识符。

在下面的示例中,您要将第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  ?