Hello tout le monde!
Donc voici mon petit défi du moment sur lequel je plante depuis quelques heures... !
J'ai les mêmes tables sur une DB Access qui est utilisée lorsque l'application est locale, sur un portable, pour des usagers en déplacement.
Lorsque ces mêmes usagers reviennent parmi nous, ils peuvent (doivent) synchronisé leurs données avec nos BD Oracle serveur.
J'ai donc exactement le même schema Access et Oracle, et je dois récupéré les données d'Access plus récentes dans Oracle.
Je me suis dit, allez, soyons fou, ce sont les même tables, il doit avoir moyen d'évité de se taper 12 Select/Insert/Update avec ADO.NET.
Voici mon bout de code actuel;`
et je remettrais donc l'accent sur ce bout de code LÀ:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 'Opérations de transfert Dim TableAcc As DataTable Dim TableOra As DataTable Dim Requetes() As String = {Array de nom des tables} Dim ds As New DataSet For x As Integer = 0 To Requetes.Length - 1 'Appel des fonctions SELECT stockées sous l'appélation "Transfert_nomtable" Dim ressource As String = "Transfert_" + Requetes(x) Dim rm As New ResourceManager("ApplicationTransfert.RequeteAccess", Assembly.GetExecutingAssembly) Dim sql As String = rm.GetString(ressource) TableAcc = connAccess.executerRequete(sql, CommandType.Text) TableOra = connOra.executerRequete(sql, CommandType.Text) For Each row As DataRow In TableAcc.Rows Dim conflit As Boolean For Each rowOra As DataRow In TableOra.Rows 'On compare les premieres colonnes, qui sont toutes le ID 'On vérifie donc qu'il n'y a pas eu de modifications faites en local If rowOra.Item(0).ToString = row.Item(0).ToString Then conflit = True End If Next If Not conflit Then TableOra.ImportRow(row) Else ' Gestion des conflits encore a faire - pas d'existants encore End If Next ds.Tables.Add(TableOra) Next ' On applique les modifications sur la Table Oracle Dim adapter As New Oracle.DataAccess.Client.OracleDataAdapter("SELECT 1 FROM DUAL", ApplicationSomVac.obtenirConnexionOracle.connexionString.ConnectionString) adapter.Fill(ds) Dim commbuilder As New Oracle.DataAccess.Client.OracleCommandBuilder(adapter) For Each dstable As DataTable In ds.Tables adapter.Update(ds, dstable.TableName) Next MessageBox.Show("La synchronisation à été effectuée avec succès!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
je sais pas trop pourquoi j'ai un select dual, le adapter.fill me déclenchait une erreur comme quoi je n'avais pas de Select Command en place. Ça fait parti de mes essais sans résultat... mais c'est le code dans lequel je suis actuellement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 ' On applique les modifications sur la Table Oracle Dim adapter As New Oracle.DataAccess.Client.OracleDataAdapter("SELECT 1 FROM DUAL", ApplicationSomVac.obtenirConnexionOracle.connexionString.ConnectionString) adapter.Fill(ds) Dim commbuilder As New Oracle.DataAccess.Client.OracleCommandBuilder(adapter) For Each dstable As DataTable In ds.Tables adapter.Update(ds, dstable.TableName) Next MessageBox.Show("La synchronisation à été effectuée avec succès!", "Information", MessageBoxButtons.OK, MessageBoxIcon.Information)
Donc voilà... au final tout ce que je cherche a faire c'est planté les données stockés dans le DataSet "ds" dans ma DB Oracle. Y'a surement un petit truc dans le jeu DataSet/Adapter/Source[...] que j'ai zappé, mais j'arrive pas a comprendre où/comment/pourquoi. J'ai rechercher pas mal sur le web, et je vois leurs bout de code presque identique au miens, et tout semble fonctionner chez eu, ca m'énerve un peu
Merci d'avance pour le coup de main,
Amuny.
Partager