繁体   English   中英

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

[英]Copying data from one database field to another database field

我在这里有点发言。 我们有一个用于Oracle数据库的开发环境和一个坐姿环境。
这是我想要实现的。 我想从开发人员的x列中复制数据。 环境设置为与我的环境相同的x列数。 我已经尝试了一些东西,并创建了几个函数,可以将所有记录复制到我的坐姿环境中(如果需要,可以从所有列或字段中复制)。

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)在执行该函数时,请首先从当前的环境中创建一个copy(备份)。 (我们将在以后使用)

2)执行复制所有数据时所用的相同操作,即删除卫星中的数据。

3)以某种方式将来自我的开发环境的数据与副本sat环境合并。

例如:假设

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列仍包含来自我的旧环境的数据。

这是我想要实现的。 这可能吗 ? 如果是这样,我有什么想法可以实现这一目标?

编辑:只是考虑了一下,也许我可以用两个数据库中的数据创建一个插入语句。

编辑:这是我的进度。 我决定创建一个临时表,其中包含来自SAT环境的信息。 并决定将其用作备份。
我不仅将其用作备份,而且还使用了该表中所需的字段并创建了我的插入语句。

“正如您所看到的,我在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  ?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM