Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1951 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Synchroniser tables de deux bases de données en VB.NET

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Synchroniser tables de deux bases de données en VB.NET

n°1617370
ofnipus
Posté le 01-10-2007 à 14:30:02  profilanswer
 

Bonjour à tous !
 
Je développe actuellement un programme en VB.net avec Visual Studio.
La couche d’accès aux données réside en un server Microsoft SQL Server 2005.
Les clients traitent les informations de la base de données du serveur.
Seulement, certains clients seront amenés à utiliser le programme à l’extérieur (les commerciaux).
Pour leurs permettre l’accès (en lecture seulement) à la base de données, une copie des tables à été effectuée sur une base local (SQL Serveur 2005 Edition Express).
 
Mon problème, est que si la base de donnée distante (du serveur) est mise à jours (nouveau clients, nouveaux devis, etc.), l’utilisateur doit pouvoir mettre à jour sa base de donnée locale via une fonction de synchronisation : « Synchroniser ma base locale avec la base de donnée du serveur ».
 
Seulement, je ne sais pas comment programmer cette fonction.
Voici le prototype que pourrais être cette fonction, mais comment la programmer …
Sub SynchroniserBase(byval serveur_distant as string, byval serveur_local as string)
.
End Sub
 
(Dans l’accès aux données, j’ai su utiliser l’objet SQLConnection pour charger mon DataSet pour les traitements)
Qu’elle démarche à suivre pour une synchronisation ?
Merci par avance pour votre aide !


Message édité par ofnipus le 05-10-2007 à 11:29:06
mood
Publicité
Posté le 01-10-2007 à 14:30:02  profilanswer
 

n°1617537
MagicBuzz
Posté le 01-10-2007 à 17:47:00  profilanswer
 

Le plus simple, c'est de passer par les outils de réplication de SQL Server directement. SQL Server Express contient tout ce qu'il faut pour ça.
 
Autre solution, vider ta table locale, charger la table distante dans une DataTable, puis recopier les lignes de ce datatable dans un autre qui provient d'un select sur la base locale. Un simple dt.Update() permettera de remplir la base locale. Attention cependant, c'est lent comme méthode, et applicable uniquement si le volume des données n'est pas trop important.
 
Encore une solution... Un drop de ta table locale, puis un create as select à partir d'une requête réportée (serveur lié par exemple)

n°1617540
ofnipus
Posté le 01-10-2007 à 17:51:36  profilanswer
 

Merci pour ta réponse qui ouvre plusieurs solutions.
 
Pour ce qui est de la première, en effet, je me suis informé sur la réplication, mais il semblerai que celle-ci ne soit possible avec l'Edition Express de SQL Server (en effet, toute les versions sont Express, même sur le serveur).
 
Pour la deuxième, c'été la seule idée que j'avais, avec prés de 500 enregistrements sur environs une dizaine de tables, j'ai peur de la lenteur de la synchronisation.
 
En revanche, ta dernière solution m'intéresse (par élimination), mais je ne vois pas trés bien ce que tu veux dire par la...
Peux- tu développer ?
 
Merci encore.

Message cité 1 fois
Message édité par ofnipus le 01-10-2007 à 17:52:37
n°1617545
ixemul
Nan mais sans blague ! ⚡
Posté le 01-10-2007 à 17:55:51  profilanswer
 

ofnipus a écrit :

Merci pour ta réponse qui ouvre plusieurs solutions.
 
Pour ce qui est de la première, en effet, je me suis informé sur la réplication, mais il semblerai que celle-ci ne soit possible avec l'Edition Express de SQL Server (en effet, toute les versions sont Express, même sur le serveur).
 
Pour la deuxième, c'été la seule idée que j'avais, avec prés de 500 enregistrements sur environs une dizaine de tables, j'ai peur de la lenteur de la synchronisation.
 
En revanche, ta dernière solution m'intéresse (par élimination), mais je ne vois pas trés bien ce que tu veux dire par la...
Peux- tu développer ?
 
Merci encore.


 
 
500 Enreg par table c'est "Minuscule" ;)


---------------
VA APPRENDRE ET REVIENS QUAND TU SAIS, SINON ABSTIENT TOI C'EST UN GRAND CONSEIL QUE JE TE DONNE... TU ES INCOMPÉTENT ET C'EST UNE RÉALITÉ, TU N'AS RIEN A FAIRE ICI FAUT S'Y CONNAITRE ... -Jojo1998 - RIP - http://tinyurl.com/qc47ftk
n°1617550
ofnipus
Posté le 01-10-2007 à 18:00:06  profilanswer
 

Vive les SGBR alors !!!!! Chouette !!!! :D
 
Jvais faire ca.
 
Derniére question ...
Existe t'il une solution "générique" pour permettre à un programme client d'accés à un SQL Server en mode HORS CONNEXION ? (les commerciaux chez les clients, sans accés internet).
 
Merci encore !

n°1617552
ixemul
Nan mais sans blague ! ⚡
Posté le 01-10-2007 à 18:02:45  profilanswer
 

ofnipus a écrit :

Vive les SGBR alors !!!!! Chouette !!!! :D
 
Jvais faire ca.
 
Derniére question ...
Existe t'il une solution "générique" pour permettre à un programme client d'accés à un SQL Server en mode HORS CONNEXION ? (les commerciaux chez les clients, sans accés internet).
 
Merci encore !


 
Un SQL Server en local sur le pc portable ;)


---------------
VA APPRENDRE ET REVIENS QUAND TU SAIS, SINON ABSTIENT TOI C'EST UN GRAND CONSEIL QUE JE TE DONNE... TU ES INCOMPÉTENT ET C'EST UNE RÉALITÉ, TU N'AS RIEN A FAIRE ICI FAUT S'Y CONNAITRE ... -Jojo1998 - RIP - http://tinyurl.com/qc47ftk
n°1617561
ofnipus
Posté le 01-10-2007 à 18:20:14  profilanswer
 

Avec une réplication sur le serveur principal ... OK
 
Mais ... ca demande d'avoir une version non-gratuite de SQL Server, ce que l'entreprise dans laquelle je suis en stage ne peut pas se permettre, tant pis. Merci encore pour toute ces info !!


Message édité par ofnipus le 01-10-2007 à 18:20:39
n°1618734
ofnipus
Posté le 04-10-2007 à 11:10:01  profilanswer
 

Me revoilà, toujours pour le même problème...
 
Rappel : les enregistrements ajoutés en mode "hors connexion" sont ajouté dans la base locale du client, avec un ID contenant le 'CODE UTILISATEUR' : « ID_USERxxxxx »
Pour effectuer une synchronisation, j’ai découpé les taches en 2 étapes, et j’ai écrit les requêtes SQL pour ce faire :
1/ Mettre à jour la table de la base SERVER

Code :
  1. INSERT INTO [server].clients
  2. SELECT *
  3. FROM [local].clients
  4. WHERE id_client LIKE (‘ID_USER%’)
  5. MINUS
  6. SELECT * FROM [server].clients


 
2/ Mettre à jour la table de la base LOCAL

Code :
  1. DROP TABLE [local].clients
  2. CREATE TABLE [local].clients
  3. AS SELECT * FROM [server].clients


Je ne vois pas comment faire pour faire exécuter ces requêtes sans erreurs, merci de votre aide.


Message édité par ofnipus le 04-10-2007 à 11:10:39
n°1618736
MagicBuzz
Posté le 04-10-2007 à 11:11:22  profilanswer
 

plutôt qu'un drop, utilise un truncate, ça évite de devoir recréer la table.
 
sinon, c'est quoi tes erreurs ?

n°1618741
ofnipus
Posté le 04-10-2007 à 11:18:11  profilanswer
 

Je ne sais pas où et comment exécuter cette requête.
Je suis partis du principe que la synchronisation été un programme à lui seul (programme que je réimplanterai après dans mon soft sous forme de procédure SUB SynchroBase).
 
J'ai écrit les requêtes, mais que mettre dans ma procédure pour l'exécution correcte de celle-ci ?
 
PS: éxécuter une requête sur une base, je m'en sort, mais une sur 2 bases en même temps, c'est la ou est le malaise :s
 
Merci pour votre aide !


Message édité par ofnipus le 04-10-2007 à 11:20:19
mood
Publicité
Posté le 04-10-2007 à 11:18:11  profilanswer
 

n°1618744
MagicBuzz
Posté le 04-10-2007 à 11:26:33  profilanswer
 

regarde du côté de "sp_addserver"

n°1618749
ofnipus
Posté le 04-10-2007 à 11:45:00  profilanswer
 

Je ne comprend pas ...
A quoi sert cette procédure ?

n°1618754
ofnipus
Posté le 04-10-2007 à 11:51:28  profilanswer
 

Pour recardrer mon probléme, le voici en une phrase :
 
"Comment, en VB.net, exécuter une requête sur 2 tables de 2 bases de données de 2 serveurs SQL Server 2005 différentes ?"
 
Table_server = Server (SQL Server 2005EX) >> maBase >> maTable
Table_local = myHost (SQL Server 2005EX) >> maBase >> maTable
 
Merci !


Message édité par ofnipus le 04-10-2007 à 12:15:10
n°1618783
MagicBuzz
Posté le 04-10-2007 à 12:17:31  profilanswer
 

Je répète.
 
Regarde du côté de "sp_addserver" :o

n°1618784
ofnipus
Posté le 04-10-2007 à 12:18:46  profilanswer
 

Ca marche, je vais voir ca de plus prés ... Merci ;)

n°1618785
MagicBuzz
Posté le 04-10-2007 à 12:21:23  profilanswer
 

Et n'oublie pas de regarder les articles anexes :


Reference
sp_addlinkedserver (Transact-SQL)
sp_addremotelogin (Transact-SQL)
sp_dropremotelogin (Transact-SQL)
sp_dropserver (Transact-SQL)
sp_helpremotelogin (Transact-SQL)
sp_helpserver (Transact-SQL)
sp_serveroption (Transact-SQL)
System Stored Procedures (Transact-SQL)
Security Stored Procedures (Transact-SQL)

n°1618788
ofnipus
Posté le 04-10-2007 à 12:22:56  profilanswer
 

AAA ...  
 
Tout ca ne serai pas en rapport avec la troisiéme solution que tu ma proposé ... ?
 
(Serveur lié ...)


Message édité par ofnipus le 04-10-2007 à 12:25:08
n°1618794
MagicBuzz
Posté le 04-10-2007 à 12:28:43  profilanswer
 

exactement

n°1619200
ofnipus
Posté le 04-10-2007 à 18:32:37  profilanswer
 

Ca y est, je suis content, j'ai bien avancé ...
 
J’ai ajouté un SERVER LIE dans ma base de données locale

Code :
  1. sp_addlinkedserver N'pcserver\sqlexpress'


 
, puis j’ai créé une procédure de synchronisation (maj_data).

Code :
  1. CREATE PROCEDURE maj_data (@id int) as
  2. insert into [PCSERVER\SQLEXPRESS].[Base CartoRapido].[dbo].devis
  3. select *
  4. from devis
  5. where id_devis > @id * 100000
  6. and  id_devis < (@id+1)*100000 - 1
  7. and  id_devis not in (select id_devis from [PCSERVER\SQLEXPRESS].[Base CartoRapido].[dbo].devis)
  8. -------------  MISE A JOUR DE LA BASE SERVER  -------------
  9. DROP TABLE semaines
  10. SELECT * INTO semaines FROM [PCSERVER\SQLEXPRESS].[Base CartoRapido].[dbo].semaines
  11. -------------  MISE A JOUR DE LA BASE LOCALE / SEMAINES  -------------
  12. DROP TABLE distributions
  13. SELECT * INTO distributions FROM [PCSERVER\SQLEXPRESS].[Base CartoRapido].[dbo].distributions
  14. -------------  MISE A JOUR DE LA BASE LOCALE / DISTRIBUTION  -------------
  15. DROP TABLE communes
  16. SELECT * INTO communes FROM [PCSERVER\SQLEXPRESS].[Base CartoRapido].[dbo].communes
  17. -------------  MISE A JOUR DE LA BASE LOCALE / COMMUNES  -------------
  18. DROP TABLE secteurs
  19. SELECT * INTO secteurs FROM [PCSERVER\SQLEXPRESS].[Base CartoRapido].[dbo].secteurs
  20. -------------  MISE A JOUR DE LA BASE LOCALE  / SECTEURS  -------------
  21. DROP TABLE devis
  22. SELECT * INTO devis FROM [PCSERVER\SQLEXPRESS].[Base CartoRapido].[dbo].devis
  23. -------------  MISE A JOUR DE LA BASE LOCALE  / DEVIS  -------------
  24. DROP TABLE clients
  25. SELECT * INTO clients FROM [PCSERVER\SQLEXPRESS].[Base CartoRapido].[dbo].clients
  26. -------------  MISE A JOUR DE LA BASE LOCALE / CLIENTS  -------------


 
Le soft client travaille maintenant sur sa base locale. Pour synchroniser, il n’y a plus qu’a faire appel à la procédure maj_data de l’extérieur (à partir du soft client en VB.net)

Code :
  1. Dim connection As New SqlConnection
  2.         Dim sql_data_adapter As New SqlDataAdapter
  3.         Dim sql_command = New SqlCommand
  4.         connection.ConnectionString = "Data Source=" & p_server_local & "\SQLEXPRESS;Initial Catalog=" & p_bdd & ";Integrated Security=True"
  5.         sql_command = sql_connexion.CreateCommand()
  6.         sql_command.CommandText = "execute maj_data " & p_id_user
  7.         Try
  8.             connection.Open()
  9.             data_set = New DataSet
  10.             sql_data_adapter.Fill(data_set, "table" )
  11.         Catch ex As Exception
  12.         End Try


 
PB : il me met «procédure introuvable »…  pourtant, dans Management Studio, quand je fait appel à cette procédure dans une requête, tout passe bien ! :(


Message édité par ofnipus le 04-10-2007 à 18:38:04
n°1619232
MagicBuzz
Posté le 04-10-2007 à 19:15:13  profilanswer
 

A quelques erreurs de syntaxes près -y'a pas d'intellisense sur le forum :o- (et en C#, mais c'est quasi la même syntaxe comme tu peux voir, puisque ce sont les mêmes objets) :
 

Code :
  1. sql_command.CommandText = "maj_data";
  2. sql_command.CommandType = CommandType.StoredProcedure;
  3. SqlParameter p = sql_command.CreateParameter();
  4. p.SqlDataType = SqlDataType.Int;
  5. p.Name = "id";
  6. p.Direction = ParameterDirection.Input;
  7. p.Size = 4;
  8. p.Value = p_id_user;
  9. sql_command.AddParameter(p);
  10. try
  11. {
  12.  sql_command.Prepare();
  13.  sql_command.ExecuteNonQuery();
  14. }
  15. catch {}


Message édité par MagicBuzz le 04-10-2007 à 19:17:26
n°1619257
ofnipus
Posté le 04-10-2007 à 20:08:40  profilanswer
 

YOUPI !!!
 
Ca marche !! Merci INIFINIMENT pour ton aide !!
 
Voici le code VB.net pour ceux que ca pourrait intérresser :
 

Code :
  1. Dim connection As New SqlConnection
  2.         connection.ConnectionString = "Data Source=" & p_server2 & "\SQLEXPRESS;Initial Catalog=" & p_bdd & ";Integrated Security=True"
  3.         Dim sql_command As SqlCommand
  4.         sql_command = connection.CreateCommand
  5.         sql_command.CommandText = "maj_data"
  6.         sql_command.CommandType = CommandType.StoredProcedure
  7.         Dim p As New SqlParameter
  8.         p = sql_command.CreateParameter
  9.         p.SqlDbType = SqlDbType.Int
  10.         p.ParameterName = "id"
  11.         p.Direction = ParameterDirection.Input
  12.         p.Size = 4
  13.         p.Value = p_id_user
  14.         sql_command.Parameters.Add(p)
  15.         Try
  16.             connection.Open()
  17.             sql_command.Prepare()
  18.             sql_command.ExecuteNonQuery()
  19.         Catch ex As Exception


        End Try
 
Merci pour tous, a bientôt !!


Message édité par ofnipus le 15-10-2007 à 14:51:42
n°1623939
ofnipus
Posté le 15-10-2007 à 14:54:54  profilanswer
 

Attention : Faute de ne pas avoir suivit le consseil de Magic Buzz concernant le DROP > TRUNCATE, ma procédure de mise à jours s'effectuer bien, mais occasionnent la destruction des tables (DROP), il s'en trouvai par la suite que les relations et les clé primaires et étrangére sont supprimer.
En effet, il me fallait bien utiliser un TRUNCATE pour conserver la structure des tables, et donc leur relation.
 
Ceci ma occasionné quelques cheveux en moins avant de pouvoir trouver pourquoi tout le programme planter suite à une synchro !

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

  Synchroniser tables de deux bases de données en VB.NET

 

Sujets relatifs
Serveur d'application .NETprogrammation pour crypter des données
Utilisation des web services avec Visual Studio 2008 (.NET frwk 3.5)Synchro de bases access sous access
Application de réplication entre 2 bases différentespb formulaire html recuperer données avc perl/cgi ou c++
[WINDEV] Avis sur ce produit face à .NET[VB.Net 1.1] Scrollbars "incompletes"
Charge de travail d'une migration VB vers VB.NET / C# / JAVAprobléme de base de données une fois pausé sur serveur
Plus de sujets relatifs à : Synchroniser tables de deux bases de données en VB.NET


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR