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

VB.NET Discussion :

ADODB avec méthode .Seek


Sujet :

VB.NET

  1. #1
    Membre régulier Avatar de Tchicken
    Homme Profil pro
    Responsable d'exploitation informatique
    Inscrit en
    Août 2017
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Responsable d'exploitation informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 108
    Points : 85
    Points
    85
    Par défaut ADODB avec méthode .Seek
    Bonjour à tous, je tourne en rond, cette méthode fonctionnait bien en VBA, mais j'ai un soucis en VB.Net :

    Comment définir l'IndexKey de la méthode .Seek ?

    Voici la clef unique de ma table :
    Nom, type=null, pos=1 (nvarchar(50))
    DatePerf, type=null, pos=2 (datetime2(0))
    Discipline, type=null, pos=11 (nvarchar(50))

    Voici l'erreur que j'obtiens :
    Erreur N° 13 : Type 'System.ValueTuple`3' cannot be marshalled to a Variant. Type library is not registered.

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
        Public Shared Sub EnregPerformance()
            Dim strErrMsg As String
            Dim DBEngine As Object
            Dim ErrX As Object
            Dim MaCle1 As String
            Dim MaCle2 As Date
            Dim MaCle3 As String
            On Error GoTo ErrADO
            '***
            '*** ACCESS
            '***
            '*** Nom, DatePerf, Lieu, Dist, GainPerf, PartPerf, CordPerf, CordagePerf, FerPerf, Poid, DiscPerf, TypePerf, AlloPerf, Place, Cote, RedKDist
            Gestion.RPerformances = New ADODB.Recordset
            MaCle1 = TabCheval(1)
            MaCle2 = CDate(TabCheval(2) & " 00:00:00.000")
            MaCle3 = TabCourses(2)
            With Gestion.RPerformances
                .Index = "PrimaryKey"
                .CursorLocation = ADODB.CursorLocationEnum.adUseServer
                .Open("Performances", Gestion.Cn, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockOptimistic, ADODB.CommandTypeEnum.adCmdTableDirect)
                '.Seek(MaCle, ADODB.SeekEnum.adSeekFirstEQ)
                .Seek((MaCle1, MaCle2, MaCle3), ADODB.SeekEnum.adSeekFirstEQ)
                If Gestion.RPerformances.EOF Then
                    .AddNew()
                    .Fields("Nom").Value = TabCheval(1)
                    .Fields("DatePerf").Value = CDate(TabCheval(2) & " 00:00:00.000")
                End If
            End With
            Gestion.RPerformances.Fields("Lieu").Value = LCase(TabCheval(3))
            Gestion.RPerformances.Fields("Dist").Value = CInt("0" & TabCheval(4))
            Gestion.RPerformances.Fields("Gains").Value = CLng("0" & TabCheval(5))
            Gestion.RPerformances.Fields("Partants").Value = CInt("0" & TabCheval(6))
            Gestion.RPerformances.Fields("Corde").Value = TabCheval(7)
            Gestion.RPerformances.Fields("Cordage").Value = TabCheval(8)
            Gestion.RPerformances.Fields("Deferre").Value = TabCheval(9)
            Gestion.RPerformances.Fields("Poid").Value = CSng("0" & TabCheval(10))
            Gestion.RPerformances.Fields("Discipline").Value = TabCheval(11)
            Gestion.RPerformances.Fields("TypeCourse").Value = TabCheval(12)
            Gestion.RPerformances.Fields("Allocation").Value = CLng("0" & TabCheval(13))
            Gestion.RPerformances.Fields("Place").Value = TabCheval(14)
            Gestion.RPerformances.Fields("Cote").Value = CSng("0" & TabCheval(15))
            Gestion.RPerformances.Fields("RedKDist").Value = TabCheval(16)
            Gestion.RPerformances.Fields("DateModif").Value = Format(Now, "dd/mm/yyyy hh:mm")
            Gestion.RPerformances.Update()
            Gestion.RPerformances.Close()
            Gestion.RPerformances = Nothing
            '***
            '*** SQLServer
            '***
            Gestion.RPerformances = New ADODB.Recordset
            With Gestion.RPerformances
                .Index = "PrimaryKey"
                .CursorLocation = ADODB.CursorLocationEnum.adUseServer
                .Open("Performances", Gestion.CnSQLS, ADODB.CursorTypeEnum.adOpenKeyset, ADODB.LockTypeEnum.adLockOptimistic, ADODB.CommandTypeEnum.adCmdTableDirect)
                '.Seek((TabCheval(1), TabCheval(2)), ADODB.SeekEnum.adSeekFirstEQ)
                '.Seek(MaCle, ADODB.SeekEnum.adSeekFirstEQ)
                .Seek((MaCle1, MaCle2, MaCle3), ADODB.SeekEnum.adSeekFirstEQ)
                If Gestion.RPerformances.EOF Then
                    .AddNew()
                    .Fields("Nom").Value = TabCheval(1)
                    .Fields("DatePerf").Value = CDate(TabCheval(2) & " 00:00:00.000")
                End If
            End With
            Gestion.RPerformances.Fields("Lieu").Value = LCase(TabCheval(3))
            Gestion.RPerformances.Fields("Dist").Value = CInt("0" & TabCheval(4))
            Gestion.RPerformances.Fields("Gains").Value = CLng("0" & TabCheval(5))
            Gestion.RPerformances.Fields("Partants").Value = CInt("0" & TabCheval(6))
            Gestion.RPerformances.Fields("Corde").Value = TabCheval(7)
            Gestion.RPerformances.Fields("Cordage").Value = TabCheval(8)
            Gestion.RPerformances.Fields("Deferre").Value = TabCheval(9)
            Gestion.RPerformances.Fields("Poid").Value = CSng("0" & TabCheval(10))
            Gestion.RPerformances.Fields("Discipline").Value = TabCheval(11)
            Gestion.RPerformances.Fields("TypeCourse").Value = TabCheval(12)
            Gestion.RPerformances.Fields("Allocation").Value = CLng("0" & TabCheval(13))
            Gestion.RPerformances.Fields("Place").Value = TabCheval(14)
            Gestion.RPerformances.Fields("Cote").Value = CSng("0" & TabCheval(15))
            Gestion.RPerformances.Fields("RedKDist").Value = TabCheval(16)
            Gestion.RPerformances.Fields("DateModif").Value = Format(Now, "dd/mm/yyyy hh:mm")
            Gestion.RPerformances.Update()
            Gestion.RPerformances.Close()
            Gestion.RPerformances = Nothing
            Exit Sub
    ErrADO:
            strErrMsg = "Erreur N° " & CStr(Err.Number) & " : " & Err.Description
            Select Case Err.Number
            ' principaux codes d'erreurs impliquant ODBC
                Case 3146, 3151, 3154, 3155, 3156, 3157, 3231, 3232, 3234, 3225, 3238, 3247, 3254
                    strErrMsg = strErrMsg & vbCrLf & vbCrLf &
                   ">>> Erreurs complémentaires DAO :" & vbCrLf &
                   "======================"
                    'Récupération Erreur(s) driver ODBC via DAO
    #Disable Warning BC42104 ' La variable est utilisée avant de se voir attribuer une valeur
                    For Each ErrX In DBEngine.Errors
    #Enable Warning BC42104 ' La variable est utilisée avant de se voir attribuer une valeur
                        strErrMsg = strErrMsg & vbCrLf & Format(ErrX.Number, "00000") & " : " & ErrX.Description
                    Next
            End Select
            Console.WriteLine(strErrMsg)
            Gestion.LogSQL += vbCrLf & " - EnregPerformance - Erreur N° " & CStr(Err.Number) & " : " & Err.Description
        End Sub
    D'avance merci de votre aide, Tchicken.

  2. #2
    Membre régulier Avatar de Tchicken
    Homme Profil pro
    Responsable d'exploitation informatique
    Inscrit en
    Août 2017
    Messages
    108
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Responsable d'exploitation informatique

    Informations forums :
    Inscription : Août 2017
    Messages : 108
    Points : 85
    Points
    85
    Par défaut
    Déjà en définissant la clé en tant qu'objet, c'est nettement mieux :

    le numéro d'erreur diminue

    Erreur N° 9 : Index was outside the bounds of the array.

    je me rapproche de la solution

    Et avec une bonne gestion de l'index de l'objet Cles, le soucis disparait

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 667
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 667
    Points : 5 235
    Points
    5 235
    Par défaut
    Tu ne précise pas sur quelle ligne tu plantes.
    Mais puisque tu parles de la méthode Seek, j'en déduit qu'il s'agit de la ligne 22.


    En premier lieu, il faut bien comprendre que VB.Net n'est pas une évolution de VB6.
    C'est un autre langage avec des paradigmes différents même si beaucoup d'éléments de syntaxe ont été repris.

    Rien que sur les tableaux puisque Seek prend en paramètre un Array de Variant.
    Ceci Dim Infos(5) As Stringaura un comportement différent sur VB6 et VB.Net.
    En VB6, cela va créer un tableau avec 6 emplacements de 0 à 5.
    En VB.Net cela va créer un tableau avec 5 emplacements de 0 à 4.

    Et déjà en VB6, ce n'est pas ainsi qu'on initialisait un tableau.
    Mais en VB.Net cette syntaxe va créer un Tuple (d'où le message d'erreur).

    Essai ceci : Seek(Array(MaCle1, MaCle2, MaCle3), ADODB.SeekEnum.adSeekFirstEQ).

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

Discussions similaires

  1. [AC-2003] Méthode .seek avec listes sharepoint
    Par frevol dans le forum VBA Access
    Réponses: 4
    Dernier message: 09/03/2012, 21h20
  2. Recherche d'un enregistrement avec méthode .Seek
    Par vuong1 dans le forum Access
    Réponses: 4
    Dernier message: 18/12/2006, 07h23
  3. Réponses: 6
    Dernier message: 27/07/2005, 09h06
  4. Réponses: 3
    Dernier message: 07/03/2005, 15h08
  5. [Singleton] Différences avec méthodes statiques
    Par Franche dans le forum Design Patterns
    Réponses: 1
    Dernier message: 26/02/2003, 17h10

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