DataAdapter avec deux BD.

DataAdapter avec deux BD. - C#/.NET managed - Programmation

Marsh Posté le 18-05-2007 à 11:58:16    

Bonjour,
J'ai un petit problème avec des bases de données CE. J'aimerai à partir d'une base de donnée 1, remplir une base de donnée 2. (Qui contient les mêmes tables que la base de donnée 1, mais ces tables sont vides.)  
 
J'ai essayé les requêtes qui permettent de faire ce genre de chose (Serveur.Base.dbo.tables...) mais apparemment en mobile cela ne fonctionne pas. J'ai donc tenté cette méthode :
1) Récupérer dans un dataset les informations et le schéma d'une table de la BD1
2) Récupérer dans un autre dataset le schéma de la même table mais de la BD2
3) Je fusionne les deux Dataset
4) J'update avec le DataAdapter de la BD2 le nouveau dataset.  
 
Mais cela ne fonctionne pas, je ne vois pas où pourrait se situer l'erreur, sachant que j'ai bien initialisé le SqlceBuilder.
 
 
Merci, :jap:
 

Code :
  1. '_______________________________________________________
  2.         ' Déclaration Variables connections BD2 => PDA
  3.         '_______________________________________________________
  4.         Dim cnx_BasePDA As SqlCeConnection
  5.         Dim obj_command_BasePDa As SqlCeCommand
  6.         cnx_BasePDA = New SqlCeConnection
  7.         cnx_BasePDA.ConnectionString = ("Data Source = C:\BDPDA\ODYSSEE.sdf" )
  8.         '_______________________________________________________
  9.         ' Déclaration Variables connections BD1
  10.         '_______________________________________________________
  11.         Dim cnx As SqlCeConnection
  12.         Dim obj_command As SqlCeCommand
  13.         cnx = New SqlCeConnection
  14.         cnx.ConnectionString = ("Data Source = " & My.Settings.TextBD & "" )
  15.         cnx.Open()
  16.         Dim DS_BD1 As DataSet
  17.         Dim DS_BD2 As DataSet
  18.         Dim DA_BD1 As SqlCeDataAdapter
  19.         Dim DA_BD2 As SqlCeDataAdapter
  20.         obj_command = New SqlCeCommand
  21.         obj_command.Connection = cnx
  22.         obj_command.CommandText = "Select * From Modules"
  23.         DS_BD1 = New DataSet
  24.         DA_BD1 = New SqlCeDataAdapter(obj_command.CommandText, cnx)
  25.         DA_BD1.FillSchema(DS_BD1, SchemaType.Mapped, "Modules" )
  26.         DA_BD1.Fill(DS_BD1, "Modules" )
  27.         cnx_BasePDA.open()
  28.         obj_command_BasePDA = New SqlCeCommand
  29.         obj_command_BasePDA.Connection = cnx_BasePDA
  30.         obj_command_BasePDA.CommandText = "Select * From Modules"
  31.         DS_BD2 = New DataSet
  32.         DA_BD2 = New SqlCeDataAdapter(obj_command_BasePDA.CommandText, cnx_BasePDA)
  33.         DA_BD2.FillSchema(DS_BD2, SchemaType.Mapped, "Modules" )
  34.         Dim builder As SqlServerCe.SqlCeCommandBuilder
  35.         builder = New SqlServerCe.SqlCeCommandBuilder(DA_BD2)
  36.         DA_BD2.UpdateCommand = builder.GetUpdateCommand
  37.         DA_BD2.InsertCommand = builder.GetInsertCommand
  38.         DA_BD2.DeleteCommand = builder.GetDeleteCommand
  39.         cnx.Close()
  40.         DS_BD2.Merge(DS_BD1, True, MissingSchemaAction.Ignore)
  41.         DA_BD2.Update(DS_BD2, "Modules" )
  42.         cnx_BasePDA.Close()


Message édité par Lemminkainen le 18-05-2007 à 14:12:28

---------------
Que vois-tu quand tu fermes les yeux ?
Reply

Marsh Posté le 18-05-2007 à 11:58:16   

Reply

Marsh Posté le 18-05-2007 à 14:25:47    

Au lieu de faire un Merge, essaie de faire Insert des lignes du DS source.
 
Vu que c'est pas la même base, il y a des chances pour que le Merge échoue à cause de ça, tout comme c'est impossible de jouer avec des Nodes XML provement de deux XmlDocuments différents.
 
D'un autre côté, tu risques d'avoir le même problème avec Insert... Il ne te restera alors plus que la solution de copier les données "à la main"... (en je bossant plus avec les objets "row", mais les valeurs qui sont dedans)

Reply

Marsh Posté le 18-05-2007 à 14:28:53    

Au niveau du merge, cela fonctionne bien. :/
 
Après le merge, j'ai essayé de voire ce qu'il y avait dans le dataset fusionné, et les données étaient bien présentes.
 
Mais je vais essayer avec l'INSERT, et puis sinon, lignes par lignes... :/


Message édité par Lemminkainen le 18-05-2007 à 14:30:23

---------------
Que vois-tu quand tu fermes les yeux ?
Reply

Marsh Posté le 18-05-2007 à 14:32:50    

Ah, ok, si le merge marche, c'est un bon début.
 
Sinon, effectivement, je sais que je m'étais heurté à un souci avec le Update()
 
Je ne me souviens plus comment je l'avais résolu, et j'ai pas accès à mes sources là... :/

Reply

Marsh Posté le 18-05-2007 à 14:37:56    

Ce qui est étrange c'est qu'il n'y a aucuns messages d'erreurs. Les données ne se copient tout simplement pas.
 
Merci quand même. :jap:


Message édité par Lemminkainen le 18-05-2007 à 14:38:15

---------------
Que vois-tu quand tu fermes les yeux ?
Reply

Marsh Posté le 18-05-2007 à 14:39:09    

Relou...
 
Je trouve que ce topic :
http://forum.hardware.fr/hfr/Progr [...] 3525_1.htm
 
Mais je suis sûr qu'il y a un autre topic dans lequel j'avais fait une copie complète de mon code... Avec le module d'enregistrement :sweat:
 
Fait une recherche sur "http://magicsite.manga-torii.com" sur le forum, t'aura peut-être plus de chance que moi :spamafote:
 
ps : pas la peine de tenter d'ouvrir l'url, mon serveur est down depuis un mois, ma consommation d'électricité avoisine celle de la SNCF, faut que je me calme avec les serveurs allumés plein l'appart :D

Reply

Marsh Posté le 18-05-2007 à 14:40:42    

Merci je vais essayer. :o


---------------
Que vois-tu quand tu fermes les yeux ?
Reply

Marsh Posté le 18-05-2007 à 14:44:44    

ouais, j'ai tout cherché, je trouve désespérément rien.
 
au mieux, des bouts de code d'un projet dérivé, mais qui fait de la lecture seule :/

Reply

Marsh Posté le 18-05-2007 à 14:48:16    

ah, ça me reviens.
 
après ton FillSchema, fais un Fill (même si la table est vide, ça dit au DS qu'il est correctement lié aux données de ton DA), puis à nouveau un FillSchema
 
(ne me demande pas pourquoi, me souvient plus de l'explication, mais c'est le seul moyen que j'avais trouvé pour faire marcher le truc avant de trouver une solution plus propre)


Message édité par MagicBuzz le 18-05-2007 à 14:49:02
Reply

Marsh Posté le 18-05-2007 à 15:08:57    

Je fais donc un :
 

Code :
  1. DA_BD2.FillSchema(DS_BD2, SchemaType.Mapped, "Modules" )
  2.         DA_DS_BD2.Fill(DS_BD2, "Modules" )
  3.         DA_BD2.FillSchema(DS_BD2, SchemaType.Mapped, "Modules" )



---------------
Que vois-tu quand tu fermes les yeux ?
Reply

Marsh Posté le 18-05-2007 à 15:08:57   

Reply

Marsh Posté le 18-05-2007 à 15:13:06    

Lemminkainen a écrit :

Je fais donc un :
 

Code :
  1. DA_BD2.FillSchema(DS_BD2, SchemaType.Mapped, "Modules" )
  2.         DA_DS_BD2.Fill(DS_BD2, "Modules" )
  3.         DA_BD2.FillSchema(DS_BD2, SchemaType.Mapped, "Modules" )



 
Pas mieux de succés. :o


---------------
Que vois-tu quand tu fermes les yeux ?
Reply

Marsh Posté le 18-05-2007 à 16:03:54    

mardoum :sweat:
 
ben je sais pas :/

Reply

Marsh Posté le 18-05-2007 à 16:09:41    

Je viens de retester le Merge, et ça marche niquel.  
 
Le dataset de la BD2 prend bien les infos du dataset de la BD1. C'est uniquement l'update qui merde. :o C'est rageant. :o


---------------
Que vois-tu quand tu fermes les yeux ?
Reply

Marsh Posté le 18-05-2007 à 16:13:37    

Ben oui oui oui, si le DS se rempli bien, c'est que ça marche.
 
Y'a pas un "Save" ou "CommitChanges" ou un truc du genre ?

Reply

Marsh Posté le 18-05-2007 à 16:23:00    

Si je ne fais pas d'erreur, la fonction update va faire une comparaison et verifier si des lignes ont été ajouté,supprimé,... Et selon, va faire l'instruction necessaire.
 
Je viens de faire un test après le merge :
 

Code :
  1. MsgBox(DS_BD2.HasChanges())


 
Et il me répond False. :/ Ca ne pourrait pas venir de là ?


Message édité par Lemminkainen le 18-05-2007 à 16:31:30

---------------
Que vois-tu quand tu fermes les yeux ?
Reply

Marsh Posté le 18-05-2007 à 17:32:21    

Ha ben si y'a des chances :D

Reply

Marsh Posté le 18-05-2007 à 17:40:55    

Si je rajoute une ligne à la fin, ça devrait marcher non, en théorie ? :o


---------------
Que vois-tu quand tu fermes les yeux ?
Reply

Marsh Posté le 18-05-2007 à 17:51:23    

Aucune idée.
J'ai plutôt l'impression que les lignes ramenées avec Merge ne sont pas comptabilisées comme ajoutée ou modifiées.
 
Si j'étais toi, je m'orienterais directement vers Insert() d'autant qu'il me semble que tu peux lui passer une collection de rows non ?
 
=> DS_DB2.Insert(DS_DB1.Rows);
 
Si ça marche, ça te fait pas de changement fondamental, et ça devrait résoudre ton problème ;)

Reply

Marsh Posté le 18-05-2007 à 17:55:47    

MagicBuzz a écrit :

Aucune idée.
J'ai plutôt l'impression que les lignes ramenées avec Merge ne sont pas comptabilisées comme ajoutée ou modifiées.
 
Si j'étais toi, je m'orienterais directement vers Insert() d'autant qu'il me semble que tu peux lui passer une collection de rows non ?
 
=> DS_DB2.Insert(DS_DB1.Rows);
 
Si ça marche, ça te fait pas de changement fondamental, et ça devrait résoudre ton problème ;)


Oui je vais essayer.
 
Merci beaucoups pour ton aide.  :jap:


---------------
Que vois-tu quand tu fermes les yeux ?
Reply

Marsh Posté le 21-05-2007 à 09:45:50    

Bon, je n'ai pas trouvé d'option avec l'insert. Je vais donc remplir le DS1 avec les informations que je veux, et pour chaque table je ferais un insert.


---------------
Que vois-tu quand tu fermes les yeux ?
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed