2010-10-06 9 views
0

Je suis un peu dans un terrain ici. Nous avons un environnement de développement et un environnement sat pour nos bases de données Oracle.
Voici ce que je veux réaliser. Je veux copier des données d'un nombre x de colonnes de mon dev. environnement au même nombre de colonnes de mon environnement sat. J'ai déjà essayé quelques trucs et j'ai créé quelques fonctions qui copient tous les enregistrements dans mon environnement sat (c'est-à-dire de toutes les colonnes ou champs si vous voulez).Copie de données d'un champ de base de données vers un autre champ de base de données

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 

C'est ma fonction de données de copie et voici comment insérer les lignes

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 

Comme vous pouvez le voir, je avais besoin déclaration de suppression dans ma fonction CopyData parce que sinon je vais obtenir la contrainte unique erreur violée . Il n'y a pas non plus d'identifiants uniques sinon j'aurais pu créer la même fonction avec une requête de mise à jour.

J'ai réfléchi à cela et j'en suis arrivé à la conclusion que je devrais faire ce qui suit: 1) lors de l'exécution de la fonction, créez d'abord une copie (sauvegarde) de mon environnement sat actuel. (nous l'utiliserons plus tard)

2) effectuer la même action que celle utilisée lors de la copie de toutes les données, c'est-à-dire supprimer des données dans la sat. 3) en quelque sorte fusionner les données de mon environnement de développement avec l'environnement de copie sat.

exemple: disons

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 

Donc, comme vous pouvez voir que les colonnes 2 et 4 contiennent les données de mon environnement dev et 1 et 3 contiennent encore les données de mon ancien environnement assis.

C'est ce que je veux réaliser. Est-ce possible? Si oui, des idées comment je peux y parvenir? Edit: J'ai juste réfléchi un peu plus, et peut-être que je peux créer une instruction d'insertion avec les données de mes deux bases de données.

Modifier: Voici mes progrès. J'ai décidé de créer une table temporaire contenant les informations de mon environnement SAT. Et a décidé d'utiliser cela comme une sauvegarde.
Non seulement je l'utilise comme sauvegarde, mais j'utilise aussi les champs dont j'ai besoin à partir de cette table et je crée mon instruction d'insertion.

Répondre

0

« Comme vous pouvez le voir, je avais besoin déclaration de suppression dans ma fonction CopyData parce que sinon je vais obtenir la contrainte unique erreur violée. Il n'y a pas non plus d'identificateurs uniques »

Une contrainte unique implique qu'il existe un identifiant unique. Voulez-vous dire qu'il n'y a pas une seule colonne qui agit comme un identifiant? Que vous le fassiez par UPDATE ou par un INSERT qui extrait des colonnes de chaque base de données, vous avez besoin d'une méthode pour faire correspondre les lignes de DEV avec celles de SAT. Si la correspondance n'est pas unique, vous obtiendrez des résultats non déterministes ou plus de lignes que vous avez commencées. La seule alternative que je peux penser est que vous avez un ordre implicite des rangées et que vous voulez faire correspondre cela - ce qui n'est finalement pas différent, vous pourriez simplement générer l'identifiant unique à partir des commandes.Dites dans l'exemple suivant que vous vouliez copier la colonne 2 de DEV à SAT.

Qu'est-ce qui décide quelle valeur dans DEV va dans quelle ligne dans 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

Les deux sont identiques. l'environnement SAT est en fait une copie du dev. Donc, quand je veux copier la colonne 2 de DEV à SAT, je veux copier toutes les données de cette colonne. J'ai décidé de faire une sauvegarde et de créer une instruction d'insertion à partir de mes anciennes données SAT et des colonnes de DEV. Je vais faire un montage dès que j'ai terminé pour vous montrer ce que je voulais dire. Merci pour la réponse. – jovany

Questions connexes