Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    janvier 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2008
    Messages : 18
    Points : 15
    Points
    15

    Par défaut Reconnecter SQL Serveur après déconnexion réseau

    Bonjour à tous,

    J'ai le problème suivant que je n'arrive pas à solutionner.


    Via VBA, je me connecte à SQL SERVER situé sur un SERVEUR_DISTANT grâce au code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Set Tbl = currentDb.CreateTableDef("MaTable")
        Tbl.connect = "ODBC;DRIVER={SQL Server};SERVER=SERVEUR_DISTANT\MSSQLSERVER;DATABASE=MaDatabase;UID=sa;PWD=MonPW;"
        Tbl.SourceTableName = "dbo.MaTable"
        CurrentDb.TableDefs.Append Tbl
        CurrentDb.TableDefs.Refresh

    Via VBA, je me déconnecte de SQL SERVER grâce au code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For Each Tbl In CurrentDb.TableDefs        
         If UCase(Tbl.Name) = "MaTable" Then CurrentDb.TableDefs.Delete Tbl.Name
    Next
    Tout ceci se passe très bien.


    Le problème arrive si je simule une déconnection réseau puis une reconnection réseau. (j'enlève puis je remets mon câble réseau, ou encore je coupe et puis réactive mon wifi)



    Dans ce cas, lorsque j'exécute une requete SQL sur MaTable => ERREUR DE LIAISON DE COMMUNICATION !!!!!!!!!!!!!
    Je suis obligé de quitter Access et de relancer Access pour faire disparaitre cette erreur de liaison de communication.
    De tout évidence, Access doit mémoriser quelque part une information qui l'empêche de faire un RESET correctement. Le faite de quitter Access et relancer Access génère ce RESET.


    Quelqu'un a-t 'il une idée ???

    Un grand merci d'avance à toute la communauté

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    mai 2008
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 2 580
    Points : 4 123
    Points
    4 123

    Par défaut

    Bonjour,

    Est-ce que MaTable est une table liée dans currentDB ? Et si oui pourquoi recréer la liaison à chaque fois ?
    Est-ce que currentDB doit pouvoir se connecter à plusieurs serveurs distants selon le cas ?
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    janvier 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2008
    Messages : 18
    Points : 15
    Points
    15

    Par défaut

    Bonjour Nico,

    et merci d'avance pour ton aide précieuse

    "MaTable" est effectivement une table liée provenant de sql server.

    J'aimerais faire fonctionner mon application sur des tablettes avec os Windows ; ces tablettes sont connectées via la 4G. Et donc des coupures de réseaux sont vraisemblable ....

    Il me faut donc pouvoir tester la connexion, et si pas de connexion, pouvoir fermer en beauté ....

    Pour répondre à ta deuxième question, currentdb ne se connecte qu'à un seul serveur.

    Pour info, mon application fonctionne avec DAO (ne fonctionne pas avec ADO qui gère mieux les connections réseaux).

    Bien à toi,
    Raoul

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    mai 2008
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 2 580
    Points : 4 123
    Points
    4 123

    Par défaut

    Citation Envoyé par montreal_1 Voir le message
    Pour info, mon application fonctionne avec DAO (ne fonctionne pas avec ADO qui gère mieux les connections réseaux).
    Effectivement ADO serait bien plus adapté mais surtout pour les temps de réponse, je pense que la gestion d'erreur peut aussi être bien faite en DAO

    J'ai aussi une base sql server avec :
    - une appli principale
    - une appli sur tablette en wifi
    - une appli web (dont je ne suis pas en charge)

    Pour la 1e, les tables sont liées une fois pour toutes - par défaut access les interroge donc en DAO je crois - mais j'ai aussi une connexion ADO à ma disposition sans cela les requetes multi-niveau sont catastrophiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public cnx As New adodb.Connection 'pour connexion directe à SQL server
    cnx.Open MaConnexionString 'une fois pour toutes, se déconnecte à la fin de l'appli
    ...
    cnx.execute MaRequete 'en ADO c'est bien plus rapide
    ...
    Dim rado As New adodb.Recordset
    rado.Open "SELECT * FROM BLC ORDER BY 1", cnx, adOpenStatic 'idem
    ...
    Pour la 2e je n'utilise que des connexions directes, sans aucune table liée, et avec une gestion d'erreur sur chaque requete afin d'éviter les problèmes en cas de perte de connexion

    Enfin quand vraiment je veux bétonner j'utilise une transaction transact sql (donc coté serveur) qui exécute tout ou rien

    Tout ça pour dire qu'en aucun cas je n'ai à gérer la connexion individuelle de chaque table. La seule connexion est à la base

    PS : je me rends compte que j'ai le même problème : en cas de perte de communication l'utilisateur doit fermer et rouvrir l'appli mais j'ai travaillé pour que cela soit rare et sans (trop) de conséquences. De plus je ne saurais dire si le problème vient des tables liées ou de la connexion directe
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    janvier 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2008
    Messages : 18
    Points : 15
    Points
    15

    Par défaut

    Bonjour Nico,

    Je crois effectivement qu'il faut passer par ADO.

    Mais est-il possible de copier facilement le contenu d'un recordset ado vers un recordset dao ?

    Raoul

  6. #6
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    mai 2008
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 2 580
    Points : 4 123
    Points
    4 123

    Par défaut

    Facilement c'est beaucoup dire...

    La procédure ci-dessous se connecte un recordset en ADO ou DAO selon le type de dorsale :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    Dim reca As adodb.Recordset
     
    Public Sub source(c, Optional tr As String = "date_in desc")
    If Not Mode_debug Then On Error GoTo err
    100 If IsNull(c) Then Exit Sub
     
    110 If msql Then
    112   Sr = "SELECT 0 as cas, code, date_in, Qin, adrs, iif(cd_cde='1', 'entrée main', cd_cde) as motif, lot, " & IIf(voir_prix, "pu_euro as masse", "masse") & ", qui, cd_bl_lg, lg, cd_bl as cd, qout" _
          & " FROM bl_lg WHERE code='" & c & "' " _
          & "UNION ALL SELECT [type], m.code, date_out, -m.Qout, adrs, l.cd_cde+'>'+motif, m.lot, null, m.qui, m.cd_bl_lg, lg, m.cd_mvt, 0" _
          & " FROM mvts m inner join bl_lg l on m.cd_bl_lg=l.cd_bl_lg WHERE m.code='" & c & "' " _
          & "UNION ALL SELECT -nature, b.code, date_out, -b.Qout, b.adrs, iif(b.cd_cde='1', 'BL '+cast(cd_blc as nvarchar), b.cd_cde), b.lot, null, b.qui, b.cd_bl_lg, b.lg, b.cd_blc_lg, 0" _
          & " FROM blc_lg b WHERE (b.nature=1 or (b.nature=3 and b.Qout<0) or b.nature=5) and b.code='" & c & "' " _
          & " ORDER BY " & tr
    114   Set reca = New adodb.Recordset
    116   reca.Open Sr, cnx, adOpenStatic, adLockReadOnly 'coté serveur, lecture seule
    118   Set Me.Recordset = reca 'ATTENTION cette méthode ne se met pas à jour par requery :(
          Set reca = Nothing
        Else
    120   Sr = "SELECT 0 as cas, code, date_in, Qin, adrs, iif(cd_cde='1', 'entrée main', cd_cde) as motif, lot, " & IIf(voir_prix, "pu_euro as masse", "masse") & ", qui, cd_bl_lg, lg, cd_bl as cd, qout" _
          & " FROM bl_lg WHERE code='" & c & "' " _
          & "UNION ALL SELECT [type], m.code, date_out, -m.Qout, adrs, l.cd_cde & '>' & motif, m.lot, null, m.qui, m.cd_bl_lg, lg, m.cd_mvt, 0" _
          & " FROM mvts m inner join bl_lg l on m.cd_bl_lg=l.cd_bl_lg WHERE m.code='" & c & "' " _
          & "UNION ALL SELECT -nature, b.code, date_out, -b.Qout, b.adrs, iif(b.cd_cde='1', 'BL ' & cstr(cd_blc), b.cd_cde), b.lot, null, b.qui, b.cd_bl_lg, b.lg, b.cd_blc_lg, 0" _
          & " FROM blc_lg b WHERE (b.nature=1 or (b.nature=3 and b.Qout<0) or b.nature=5) and b.code='" & c & "' " _
          & "ORDER BY " & tr
    122   Me.RecordSource = Sr
        End If
        Exit Sub
    err: Call message("Erreur " & err.Number & "/" & Erl & " dans stock_histo.source(" & c & ") : " & err.description)
    200 DoCmd.Close acForm, "stock_histo"
    End Sub
    Comme indiqué en commentaire, en ADO le recordset est en lecture seule et ne reconnait pas l'instruction requery. Je réserve donc cette méthode aux requetes les plus complexes comme celle-ci (historique de tous les mouvements de stock) et utilise encore des recordsets classiques chaque fois que possible.

    Il y a peut-être moyen de faire plus simple (par exemple avec une "table" access liée à une vue msql) mais je n'ai pas mieux pour l'instant
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    janvier 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2008
    Messages : 18
    Points : 15
    Points
    15

    Par défaut

    Bonsoir Nico,

    Merci pour ton bout de code ... J'ai poursuivi un peu mes recherches sur le net et je suis tombé sur un truc qui correspond précisément à ce que je recherche.

    Le lien url est le suivant :

    https://stackoverflow.com/questions/...bdecimal-issue


    Sur cette page, se trouve la fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Public Function ConvertDAORStoADORS(ByRef r1 As DAO.Recordset) As ADODb.Recordset
    Bien à toi,

    Raoul

  8. #8
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    mai 2008
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 2 580
    Points : 4 123
    Points
    4 123

    Par défaut

    J'avoue être en limite de compétence sur ce coup là mais je ne vois pas bien ce que cette procédure apporte sauf dans le cas bien particulier qu'il expose (différence de type).

    DAO utilise le moteur JET et exécute donc toutes les requêtes sur le client. S'il s'agit d'une requete complexe (par exemple avec des sous requetes), JET l'éclate en un grand nombre de requetes élémentaires et on voit coté serveur que cela génère une activité considérable (d'où le pb de temps de réponse)

    ADO au contraire ne cherche pas à interpréter la requete et l'envoie comme un tout au serveur qui répond en une seule fois. C'est donc bcp plus performant, par contre comme Access n'a plus le lien avec les tables d'origine il la considère en lecture seule

    Si le recordset sert à alimenter une fenêtre Access cela nous fait alors perdre une fonctionnalité très pratique d'access, la modif directe de la table à l'écran. Mais finalement cette fonctionnalité n'est pas très professionnelle et je ne crois pas qu'elle existe avec d'autres environnements de développement. Ce n'est donc pas une mauvaise chose de la perdre dès lors que l'application a pour objectif d'être délocalisée et/ou de manipuler un gros volume de données. 2 choses dont est incapable le moteur JET ce qui explique je crois son abandon progressif par MS

    Dis autrement une bd Access est à mi-chemin entre Excel et SQL server. Idem pour l'outil de développement Access qui est par nature mono-réseau
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    janvier 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : janvier 2008
    Messages : 18
    Points : 15
    Points
    15

    Par défaut

    Bonjour Nico,

    Me revoici après un WE un peu chargé ...

    Je suis finalement parvenu à trouver une solution qui répond à mes attentes ... Je te l'explique en 2 mots :

    Dans du script VBA (fonction), j'interroge ma base de données.
    Pour interroger ma base de données, je réalise une requete sql :

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim lcDbc as dao.database: Set lcDbc = currentdb
    Dim lodao as dao.recordset
    Dim lcSql as string: lcsql = "Select mes champs From MaTable Where MaCondition"
    Set lodao = lcDbc.openrecordset(lcSql,dbopensnapshot)
    Ca fonctionne très bien !

    Maintenant, si je passe en ADO, il me faut faire le remplacement suivant :

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim loado as adodb.recordset
    loADO.Open Source:=lcSql, ActiveConnection:=connDB, CursorType:=adOpenDynamic, LockType:=adLockOptimistic

    Or je ne souhaite pas faire ce changement ;
    Parce que je souhaite fonctionner aussi bien en DAO que en ADO !
    donc j'instancie une variable publique qui peut soit prendre comme valeur ADO ou DAO

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PUBLIC connType as string
    conntype = "ADO"
    Ensuite le code dans mes fonctions devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Dim lodao as dao.recordset
    Dim lcSql as string: lcsql = "Select mes champs From MaTable Where MaCondition"
    connAAA(conntype,lcSql,loDAO)

    Ma fonction connAAA me renvoit toujours un recordset au format DAO, peu importe que j'utilise un objet de connection de type DAO ou ADO.
    Donc je modifie à peine mon code

    Et dans ma fonction connAAA,
    lorsque je suis en mode ADO, je récupère un recordset type ADO que je transvase vers le recordset loDAO grâce à la fonction reprise dans notre conversation.


    Tout ceci te fait un peu de lecture ... si tu attrape un mal de crâne avec tout çà ... c'est normal

    Raoul

  10. #10
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    mai 2008
    Messages
    2 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 2 580
    Points : 4 123
    Points
    4 123

    Par défaut

    Citation Envoyé par montreal_1 Voir le message
    si tu attrape un mal de crâne avec tout çà ... c'est normal
    Oui j'avoue

    Citation Envoyé par montreal_1 Voir le message
    Parce que je souhaite fonctionner aussi bien en DAO que en ADO !
    Pourquoi ?

    Citation Envoyé par montreal_1 Voir le message
    Je suis finalement parvenu à trouver une solution qui répond à mes attentes ...
    C'est le principal
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/01/2013, 23h20
  2. Backup sur lecteur réseau avec sql serveur 2005 ou 2008
    Par Labienus dans le forum Administration
    Réponses: 3
    Dernier message: 25/03/2011, 11h32
  3. Récupérer une liste des serveurs SQL Server de votre réseau
    Par Thomas Lebrun dans le forum Contribuez
    Réponses: 0
    Dernier message: 29/12/2010, 11h42
  4. Récupérer une liste des serveurs SQL Server de votre réseau
    Par Thomas Lebrun dans le forum Contribuez
    Réponses: 0
    Dernier message: 28/12/2010, 23h58
  5. REPLICATION avec sql serveur 2000 - question réseau
    Par lorelei33 dans le forum MS SQL-Server
    Réponses: 1
    Dernier message: 24/01/2008, 23h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo