none
Mise à jour de donnée vers SQL RRS feed

  • Question

  • Bonjour,

    Cela fait quelques jours que je cherche une solution à mon problème.

    Je suis sous Visual Studio 2005, en VB.net

    Explications :

    J'ai beaucoup d'enregistrements à mettre à jour vers mon SQL à l'origine issu de base Access. Pour le moment je me suis concentré sur une seule table (client) car c'est la plus simple (différent des reservations par exemple qui elle implique des relations à d'autre tables).

    Sachant qu'au final j'aurais 12 autre mise à jour, n'incluant pas forcément qu'une table à mettre à jour (exemple les reservations). ceci pour une agence sachant que j'ai 13 agences à faire et que cette procédure globale sera effectué tout les 15 jours.

    J'essai de faire ses mises à jour le plus rapidement possible car j'aurais au final plusieurs tables pour plusieurs agences. Donc dans un premier temps j'ai chargé ma table de client Access (pour 1 agence), puis j'ai chargé ma table de "relation" (la table correspondante à la table client dans SQL s'appelle particulier) qui fait le lien entre 1 identifiant client et 1 identifiant particulier. Dans le but de retrouver le plus rapidement l'identifiant particulier pour un client, j'ai créer un dictionnaire.

    J'ai ensuite récupéré dans un datatable mes particuliers (filtré sur l'agence), j'ai créé un dictionnaire basé sur le numéro de ligne dans le datatable et l'identifiant particulier pour m'éviter de passé par le rowfilter (trop couteux en temps) quand je dois aller mettre à jour mon enregistrement dans le datatable.

    Dim dtableParticulier As DataTable = New DataTable
    Dim dicoIdx_dtableParticulier As Generic.Dictionary(Of Long, Long) = New Generic.Dictionary(Of Long, Long)
    
    Dim reqUpd As String = "SELECT * FROM tParticulier WHERE idAgence=" & idAgence
    Dim SDATempo As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(reqUpd, WUCtParticulier.ChaineCnx)
    SDATempo.Fill(dtableParticulier)
    
    Dim nbEnrParticulier As Integer = dtableParticulier.Rows.Count
    If nbEnrParticulier > 0 Then
    For i As Integer = 0 To nbEnrParticulier - 1
        dicoIdx_dtableParticulier.Add(dtableParticulier.Rows(i)("idParticulier"), i)
    Next
    End If

    Ensuite je parcours mon datatable client issus d'access, je regarde via mon dico si j'ai l'équivalent au client côté SQL, je fais des contrôles sur les données (type,contenu, etc) et :
    1- Soit je créé directement l'enregistrement dans ma base SQL, récupére l'identifiant créé, ajoute la relation entre client et particulier en base
    2- Soit je retrouve ma ligne à mettre à jour dans mon datatable de particulier, et j'y insére les nouvelles valeurs.

    Puis au final, je "tente" de mettre le plus rapidement ma table particulier à jour, c'est ici que je perds le maximum de temps (sur 5 min 29 de traitement global je prends 5 min 11 pour mettre à jour 7897 enregistrement.

    SDATempo.UpdateCommand = New SqlClient.SqlCommandBuilder(SDATempo).GetUpdateCommand
    SDATempo.Update(dtableParticulier)
    SDATempo.Dispose()
    Comment puis-je accéléré ce traitement pour la mise à jour des données contenu dans mon datatable dtableParticulier.
    Merci
    vendredi 6 novembre 2009 11:04

Réponses

  • Bonjour,

    Je ne vois pas d'autres solutions pour améliorer la rapidité de votre application.
    Si vous exécutez 7897 UPDATE, c'est normal que cela vous prennent du temps. Vous pouvez améliorer un peu les performances en utilisant une procédure stockée.

    Cordialement
    Gilles TOURREAU - MVP C# - Architecte .NET/Consultant/Formateur
    mercredi 11 novembre 2009 21:03
    Modérateur