2010-10-06 92 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

相關問題