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.
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