Synchronisation de bases de données via Internet 

 

Quand la base de donnée devient trop grosse, le transfert par FTP devient dissuasif. Sans compter que la base de données est bloquée pendant le transfert.

Méthodes utilisées (détaillées plus loin) :

Tout ça ne s'est pas fait en un jour : Gros avantages :


Méthodes utilisées

Ajouter un champ dans toutes les tables concernées.

MAJ ( byte ) - valeurs :

Modifier les programmes de création / mise à jour / suppression.


  »  SQL = "update SUBJECT1 set SUBJECT=?, MAJ=0, I=0 where S1=?"


  »  SQL = "update SUBJECT1 set SUBJECT=?, MAJ=2 where S1=?"


  »  SQL = "update SUBJECT1 set MAJ=3 where S1=?"

Fabriquer un programme d'envoi des mises à jour vers le site.

  1. Sélection des enregistrements à synchroniser dans un lot XML.
  2. Utilisation de l'objet WebClient d'ASP.NET pour effectuer un HTTP POST du lot XML.
  3. Comparaison entre nombre d'enregistrements envoyés et traités.
  4. Prise en compte de la synchronisation dans la base locale

  »  WebClient WC = new WebClient();
1)
  »  String SQL =
  »  »  "select" +
  »  »  " S1," +
  »  »  " SUBJECT," +
  »  »  " MAJ " +
  »  »  "from" +
  »  »  " SUBJECT1 " +
  »  »  "where" +
  »  »  " MAJ=0 or MAJ=2 or MAJ=3";

  »  XmlDocument DOM = IT.ADO2DOM(MDB,SQL,0);
  »  int I = DOM.DocumentElement.ChildNodes.Count;
  »  if (I==0)
  »  {

  »  »  Response.Write("<td align='center' width='20%'>-</td>");

  »  }
  »  else
  »  {
2)
  »  »  try
  »  »  {
  »  »  »  byte[] DS = Encoding.GetEncoding(1252).GetBytes(DOM.InnerXml);
  »  »  »  byte[] DR = WC.UploadData("http://guimberteau.name/????????.aspx?table=subject1",DS);
  »  »  »  S = Encoding.GetEncoding(1252).GetString(DR);
  »  »  }
  »  »  catch (Exception E)
  »  »  {
  »  »  »  S = E.Message;
  »  »  }
3)
  »  »  if (S==I.ToString())
  »  »  {

  »  »  »  Response.Write("<td align='center' width='20%'>"+S+"</td>");

4)
  »  »  »  ODCom.CommandText = "update SUBJECT1 set MAJ=1 where MAJ=0 or MAJ=2";
  »  »  »  ODCom.ExecuteNonQuery();
  »  »  »  ODCom.CommandText = "delete from SUBJECT1 where MAJ=3";
  »  »  »  ODCom.ExecuteNonQuery();

  »  »  }
  »  »  else
  »  »  {

  »  »  »  Response.Write("<td width='20%'>"+S+"</td>");

  »  »  }

  »  }

ADO2DOM est une procédure maison pour convertir un RecordSet ADO en XML.

Fabriquer un programme de réception pour le site.

  1. Chargement du lot XML.
  2. Traitement des enregistrements reçus.
  3. Prise en compte des ajouts / modification.
  4. Prise en compte des suppressions
  5. Envoi nombre d'enregistrements
1)
  »  DOM.Load(Request.InputStream)

2)
  »  For Each Record In DOM.DocumentElement.ChildNodes
  »  »  MajSubject1(Record)
  »  Next

  .
  .
  .

  »  Sub MajSubject1(Record)

  »  »  Dim S1 As String = Record.ChildNodes.Item(0).InnerText
  »  »  Dim SUBJECT As String = Record.ChildNodes.Item(1).InnerText
  »  »  Dim MAJ As String = Record.ChildNodes.Item(2).InnerText

  »  »  SQL = _
  »  »  »  "select" & _
  »  »  »  " * " & _
  »  »  »  "from" & _
  »  »  »  " SUBJECT1 " & _
  »  »  »  "where" & _
  »  »  »  " S1=?"

  »  »  ODDA.SelectCommand = New OleDbCommand(SQL,ODCon)
  »  »  ODDA.SelectCommand.Parameters.Add("@S1",OleDbType.Smallint,2,"S1").Value = S1

  »  »  DS = New DataSet
  »  »  ODDA.Fill(DS)

  »  »  If DS.Tables(0).Rows.Count=0 Then

  »  »  »  ODCom.CommandText = "insert into SUBJECT1(S1,I) values(" & S1 & ",0)"
  »  »  »  ODCom.ExecuteNonQuery

  »  »  »  DS = New DataSet
  »  »  »  ODDA.Fill(DS)

  »  »  End If

  »  »  With DS.Tables(0).Rows(0)
  »  »  »  .Item("SUBJECT") = SUBJECT
  »  »  »  .Item("MAJ") = MAJ
  »  »  End With

  »  »  SQL = _
  »  »  »  "update" & _
  »  »  »  " SUBJECT1 " & _
  »  »  »  "set" & _
  »  »  »  " SUBJECT=?," & _
  »  »  »  " MAJ=? " & _
  »  »  »  "where" & _
  »  »  »  " S1=?"

  »  »  ODDA.UpdateCommand = New OleDbCommand(SQL,ODCon)
  »  »  ODDA.UpdateCommand.Parameters.Add("@Subject",OleDbType.VarChar,20,"Subject")
  »  »  ODDA.UpdateCommand.Parameters.Add("@Maj",OleDbType.TinyInt,1,"Maj")
  »  »  ODDA.UpdateCommand.Parameters.Add("@S1",OleDbType.Smallint,2,"S1")

  »  »  ODDA.Update(DS)

  »  End Sub

  .
  .
  .

3)
  »  ODCom.CommandText = "update SUBJECT1 set MAJ=1 where MAJ=0 or MAJ=2"
  »  ODCom.ExecuteNonQuery

4)
  »  ODCom.CommandText = "delete from SUBJECT1 where MAJ=3"
  »  ODCom.ExecuteNonQuery

5)
  »  Response.Write(DOM.DocumentElement.ChildNodes.Count)

La sécurité dans tout ça

Avant de commencer à traiter la demande, vérification de l'adresse IP du demandeur ;-)


  <%@ Import Namespace="System.Net" %>

  <%

  »  Dim RH As String = Request.ServerVariables("REMOTE_HOST")
  »  Dim IPHE As IPHostEntry = Dns.GetHostByName("????????.???")
  »  If RH<>IPHE.AddressList(0).ToString Then
  »  »  Response.End
  »  End If

  %>

© Alain Guimberteau