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

Synchroniser tables de deux bases de données en VB.NET - C#/.NET managed - Programmation

Marsh Posté le 01-10-2007 à 14:30:02    

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
Reply

Marsh Posté le 01-10-2007 à 14:30:02   

Reply

Marsh Posté le 01-10-2007 à 17:47:00    

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)

Reply

Marsh Posté le 01-10-2007 à 17:51:36    

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
Reply

Marsh Posté le 01-10-2007 à 17:55:51    

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
Reply

Marsh Posté le 01-10-2007 à 18:00:06    

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 !

Reply

Marsh Posté le 01-10-2007 à 18:02:45    

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
Reply

Marsh Posté le 01-10-2007 à 18:20:14    

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
Reply

Marsh Posté le 04-10-2007 à 11:10:01    

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
Reply

Marsh Posté le 04-10-2007 à 11:11:22    

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

Reply

Marsh Posté le 04-10-2007 à 11:18:11    

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
Reply

Marsh Posté le 04-10-2007 à 11:18:11   

Reply

Marsh Posté le 04-10-2007 à 11:26:33    

regarde du côté de "sp_addserver"

Reply

Marsh Posté le 04-10-2007 à 11:45:00    

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

Reply

Marsh Posté le 04-10-2007 à 11:51:28    

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
Reply

Marsh Posté le 04-10-2007 à 12:17:31    

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

Reply

Marsh Posté le 04-10-2007 à 12:18:46    

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

Reply

Marsh Posté le 04-10-2007 à 12:21:23    

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)

Reply

Marsh Posté le 04-10-2007 à 12:22:56    

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
Reply

Marsh Posté le 04-10-2007 à 12:28:43    

exactement

Reply

Marsh Posté le 04-10-2007 à 18:32:37    

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
Reply

Marsh Posté le 04-10-2007 à 19:15:13    

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
Reply

Marsh Posté le 04-10-2007 à 20:08:40    

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
Reply

Marsh Posté le 15-10-2007 à 14:54:54    

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 !

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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