2010-10-06 90 views
0

我在这里有点麻烦。我们的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 

正如你可以看到我需要的delete语句我了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的数据还包含从我的旧数据坐着环境。

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

编辑:刚刚给了一些更多的想法,也许我可以创建一个插入语句与我的数据库中的数据。

编辑:这是我的进步。我决定创建一个包含我的SAT环境信息的临时表。并决定将其用作备份。
我不仅使用这个作为备份我也使用我需要从这个表中的字段,并创建我的插入语句。

回答

0

“正如你所看到的,我需要delete语句我了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 ? 
+0

有两个完全相同。 SAT环境实际上是开发者的副本。所以当我想将第2列从DEV复制到SAT时,我想复制该列中的所有数据。我决定做一个备份,并从我的旧SAT数据和DEV列创建插入语句。一旦我完成了,我会做一个编辑,告诉你我的意思。谢谢回复。 – jovany 2010-10-07 08:41:00

相关问题