IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Access Discussion :

ADODB recordset editable à partir d’une procédure stockée SQL server [AC-2010]


Sujet :

Access

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut ADODB recordset editable à partir d’une procédure stockée SQL server
    Bonjour à tous.

    QUESTIONS:
    1. Peut-on ouvrir un recordset ADODB éditable fondé sur une procédure stockée SQL server ?
    2. Peut-on affecter ce recordset à la source d'un formulaire pour modifier les données résultantes ?


    MES ESSAIS:
    Mon environnement est un projet (.ADP) Access 2010 associé à une base de données SQL server 2008 R2.

    Ca fait un petit moment que je cherche à utiliser un ADODB.Recordset résultat de l’exécution d’un objet ADODB.command en mode édition (mise à jour, ajout et suppression des données).
    Je suis connecté en tant qu’administrateur et dispose des droits nécessaires.

    J’ai créé un formulaire destiné à me permettre de vérifier mes résultats. Ce formulaire comporte 3 zones de texte correspondant aux colonnes renvoyées par la procédure.

    Si je définis la source de mon formulaire sur ma procédure je peux éditer mes enregistrements (modification, ajout, suppression).

    Si je constitue un Recordset que j’attribue ensuite en tant que source de mon formulaire je ne peux pas éditer les données (je ne peux pas non plus modifier directement une valeur de l'enregistrement courant d'ailleurs).

    Je pense avoir essayé toutes les combinaisons de déclaration de mon Recordset ADO (CursorLocation, CursorType, LockType).

    Lorsque j’inspecte les attributs des jeux d’enregistrements ouverts (mon Recordset et le Recordset du formulaire) je constate que la propriété LockType du formulaire est à 3 (adLockOptimistic) alors que celle de mon Recordset est passée automatiquement à 1 (adLockReadOnly) bien que j’ai précisé la valeur adLockOptimistic lors de sa création.

    Voici le code de création du Recordset (RS) :

    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
    Dim Cnx As ADODB.Connection
    Dim Cmd As New ADODB.Command
    Dim Rs As New ADODB.Recordset
    Dim P As ADODB.Parameter
     
    Const NomProc As String = "ps_TEST_Liste"
     
    Set Cnx = CurrentProject.Connection	‘	utilise la connexion du projet ADP
    With Cmd	‘	Définition de l’objet ADODB.Command
       .ActiveConnection = Cnx
       .CommandType = adCmdStoredProc
       .CommandText = NomProc
       Set P = .Parameters("@Groupe") ' "TEST1")	‘	Il y a un paramètre
       P.Value = "TEST1"
    End With
     
    With Rs
       .CursorLocation = adUseClient
       .CursorType = adOpenKeyset
       .LockType = adLockOptimistic
    End With
     
    Set Rs = Cmd.Execute
    Set Cmd = Nothing
    Et voilà les propriétés de la source du formulaire:

    Nom : ADODB Proc Source.JPG
Affichages : 563
Taille : 43,8 Ko

    Désolé si j'ai été un peu long!

  2. #2
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Bonjour,
    Citation Envoyé par Depite Voir le message
    Lorsque j’inspecte les attributs des jeux d’enregistrements ouverts (mon Recordset et le Recordset du formulaire) je constate que la propriété LockType du formulaire est à 3 (adLockOptimistic) alors que celle de mon Recordset est passée automatiquement à 1 (adLockReadOnly) bien que j’ai précisé la valeur adLockOptimistic lors de sa création.
    Je pense que le cœur du problème vient du fait que l'objet Recorset est créé par la méthode Execute de l'objet Command.
    De ce fait, toute cette partie est ignorée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    With Rs
       .CursorLocation = adUseClient
       .CursorType = adOpenKeyset
       .LockType = adLockOptimistic
    End With
    Comme je ne sais pas comment influer sur le type de Recordset renvoyé par Command.Execute, je contourne le problème en utilisant une instruction SQL-Transac.
    Cela veut dire que je ne passe pas par un objet Command et que j'utilise la commande EXEC.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim Cnx As ADODB.Connection
    Dim Rs As New ADODB.Recordset, sRsSql As String
     
    Const NomProc As String = "ps_TEST_Liste"
     
    Set Cnx = CurrentProject.Connection    ‘    utilise la connexion du projet ADP
     
    Rs.CursorLocation = adUseClient
    Set Rs.ActiveConnection = Cnx
    sRsSql = "EXEC [" & NomProc & "] @Groupe='TEST1'"
    Rs.Open sRsSql, ,adOpenStatic ,adLockOptimistic , adCmdText
    A+

  3. #3
    Expert éminent
    Avatar de LedZeppII
    Homme Profil pro
    Maintenance données produits
    Inscrit en
    Décembre 2005
    Messages
    4 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Maintenance données produits
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2005
    Messages : 4 485
    Points : 7 759
    Points
    7 759
    Par défaut
    Citation Envoyé par LedZeppII Voir le message
    Comme je ne sais pas comment influer sur le type de Recordset renvoyé par Command.Execute, je contourne le problème en utilisant une instruction SQL-Transac.
    En fouillant un peu, je viens de trouver.

    Dans ton code, remplacer
    par
    De cette manière Rs est conservé car on n'utilise pas la méthode Exécute de l'objet Command.

    A+

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Janvier 2010
    Messages : 252
    Points : 145
    Points
    145
    Par défaut
    Evidemment, il y ceux qui savent fouiller!

    Excellente réponse LedZepII et un grand merci car la résolution de ce problème ouvre de nouvelles perspectives de développement.

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 18/12/2013, 15h33
  2. Procédures stockées SQL Server, récupération sous Delphi
    Par rophi dans le forum Bases de données
    Réponses: 10
    Dernier message: 03/12/2007, 14h48
  3. Réponses: 1
    Dernier message: 04/03/2007, 15h40
  4. [procédure stockée][SQL server]Extraction, réinsertion
    Par caelum dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 14/02/2006, 07h59
  5. Procédures stockées SQL Server compatibles avec MySQL ?
    Par Nen'S dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 24/01/2006, 19h18

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