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

Développement SQL Server Discussion :

Pofiler et SET FMTONLY, SET NO_BROWSETABLE etc


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut Pofiler et SET FMTONLY, SET NO_BROWSETABLE etc
    Bonjour,

    J'ai une application qui se connecte à une base de données SQL SERVER 2000 pour exécuter différentes procédures stockées présentes sur dans ma base. Mon problème est le suivant lorsque je trace l'activité de cette application sur le serveur avec le profiler, je vois une multitude de lignes qui viennent se rajouter à l'exécution de la requête :

    - SET FMTONLY ON EXEC SET FMTONLY OFF  (ce caractère est bien présent sur la trace mais sous la forme d'un carré blanc)
    - IF @@TRANCOUNT > 0 COMMIT TRAN
    - SET NO_BROWSETABLE OFF
    - SET NO_BROWSETABLE ON

    Cette application utilise le provider "SQLOLEDB.1" et se connecte grâce au code VB suivant :
    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
    Dim cnn As New ADODB.Connection
    Dim RSt As New ADODB.Recordset
        strSQL = "Execute " & pstrStoredProcedure & " " & pstrParameters
        With cnn
            .ConnectionString = STRConnectionString
            .CursorLocation = adUseClient
            .Open
        End With
     
        With RSt
            .ActiveConnection = cnn
            .CursorType = adOpenStatic
            .LockType = adLockBatchOptimistic
            Call .Open(strSQL)
            Set .ActiveConnection = Nothing
        End With
    Je ne comprends pas pourquoi je vois ces lignes apparaître même si je suspecte le provider ou le ADODB.Recordset.

    Connaissez-vous un moyen d'empêcher l'exécution de ces lignes par le client ?

    Cordialement
    Dens19

  2. #2
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonsoir,

    Je crois qu'il faudrait plutôt poster dans un forum .net. De mémoire, la classe command possède un attribut commandbehavior qui permet de gérer ce genre de choses. Ici, l'instance de command est sans doute construite de façon implicite.

    @+

  3. #3
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonsoir

    Il faudrait passer par l'objet command et non recordset. (De mémoire ....)

    L'objet Command possède une propriété "prepared" qu'il faut initialiser à FALSE pour désactiver cette fonctionnalité (SET FMTONLY ...)

    Pouvez essayer et nous dire si cela fonctionne ?

    ++

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    Par défaut
    Ces commandes sont nécessaire pour le pilotage des curseurs de manière générique.

    Chaque ligne lue d'un curseur a besoin des méta données de chaque ligne : type de données, nom des colonnes. En effet : entre deux browse, la table peut évoluer (rajout de colonne, changement de nom de colonne, de type de données).

    C'est pour interroger la base que le client envoi les commandes SET FMTONLY (méta données). Pour NO_BROWSETABLE c'est lié aux curseur "misajourables" :
    SET NO_BROWSETABLE ON is an undocumented option performed for Remote Data Service (RDS) ActiveX Data Connector (ADC) connections to SQL Server. Enabling this option makes every SELECT statement act as though FOR BROWSE had been appended to the statement, but bypasses the temporary table that FOR BROWSE normally pipes the results through. The net effect is to add keys and timestamps to the query as hidden output columns so the client can update specific rows (updateable cursors) without separate trips to the server to pick up the meta-data and munging the query to get the appropriate columns.

    Le seul moyen d'éradiquer tout cela est de supprimer tous les curseurs... Je doute que cela soit évident !!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Merci SQLPro, c'est très instructif

  6. #6
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Merci de vos réponses et désolé de mon retard.

    L'objet Command possède une propriété "prepared" qu'il faut initialiser à FALSE pour désactiver cette fonctionnalité
    Vous avez raison en passant par l'objet command (avec l'option prepared à false) plutôt que par l'objet recordset, ces lignes supplémentaires sont ignorées.

    Malheureusement le morceau de code que j'ai posté plus haut n'est utilisé que pour un nombre de cas limité d'accès à la base de données.

    Pour le reste l'application en VB utilise un concepteur pour créer une connexion à la base de données. Dans ce concepteur, il y a les définitions des procédures stockées de ma base (avec entrées et sorties définies) sous forme "d'objets", je peux définir les propriétés de chaque procédure et notamment la propriété "Prepared" qui est à false pour toutes mes procédures.

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    BeginProperty Recordset1 
          CommandName     =   "psTypeProduit"
          CommDispId      =   1002
          RsDispId        =   6794
          CommandText     =   "dbo.psTYPEPRODUIT"
          ActiveConnectionName=   "connGen"
          CallSyntax      =   "{? = CALL dbo.psTYPEPRODUIT( ?) }"
          IsRSReturning   =   -1  'True
          NumFields       =   2
          BeginProperty Field1 
             Precision       =   3
             Size            =   1
             Scale           =   0
             Type            =   17
             Name            =   "TypeProduit"
             Caption         =   "TypeProduit"
          EndProperty
          BeginProperty Field2 
             Precision       =   0
             Size            =   15
             Scale           =   0
             Type            =   200
             Name            =   "Ressource"
             Caption         =   "Ressource"
          EndProperty
          NumGroups       =   0
          ParamCount      =   2
          BeginProperty P1 
             RealName        =   "RETURN_VALUE"
             Direction       =   4
             Precision       =   10
             Scale           =   0
             Size            =   0
             DataType        =   3
             HostType        =   3
             Required        =   0   'False
          EndProperty
          BeginProperty P2 
             RealName        =   "@TYPEPRODUIT"
             Direction       =   1
             Precision       =   3
             Scale           =   0
             Size            =   0
             DataType        =   17
             HostType        =   17
             Required        =   -1  'True
          EndProperty
          RelationCount   =   0
          AggregateCount  =   0
       EndProperty
    Mon problème est le suivant, en traçant l'activité de mon server et en regroupant par SPID et ClientProcessID, l'introduction de ces lignes (set fmt only ...) ne se fait pas tout le temps pour les clients. Parfois les requêtes sont exécutées normalement et suivies par un sp_reset_connection.

    J'y perd mon latin, l'apparition de ces lignes supplémentaires est un vrai casse-tête (vive le vb6)

    Je vous tiendrais au courant si j'arrive à résoudre ce problème.

    Encore merci pour vos réponses

    Cdlt
    Dens19

  7. #7
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    73
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 73
    Points : 48
    Points
    48
    Par défaut
    Juste pour avancer un peu plus :

    SET FMTONLY ON EXEC SET FMTONLY OFF 
    La ligne suivante ne devrait-elle pas générer une erreur étant donné qu'aucun nom de procédure stockée n'est mentionné après le EXEC. Tout ceci est vraiment étrange ...

    Cdlt
    Dens19

Discussions similaires

  1. Set covering/ set partitionning
    Par laureat dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/11/2010, 11h21
  2. [AC-2007] ADP sous 2007: performance des requêtes SET FMTONLY
    Par Mafix dans le forum Projets ADP
    Réponses: 7
    Dernier message: 28/05/2010, 14h34
  3. set term ^
    Par tux dans le forum Débuter
    Réponses: 8
    Dernier message: 12/10/2004, 20h42
  4. Query data set
    Par Sandra dans le forum JBuilder
    Réponses: 3
    Dernier message: 20/01/2003, 10h08
  5. character set // Nls_lang
    Par fopicht dans le forum Oracle
    Réponses: 2
    Dernier message: 23/05/2002, 12h04

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