none
(V.S.2008) RESOLU Travailler avec les noms des champs à la place des indices des champs. Table d'une base SQL SERVER (.mdf) RRS feed

  • Discussion générale

  • Bonjour,

    Avec ACCESS, je travaille avec le nom du champ d'une table.

    Exemple

    wDateDece = dttAnalyse.Rows(Me.wCptLuAnalyse).Item("DateDeces")

    dttAnalyse est le DataTable de la table Analyse

    Me.wCptLuAnalyse est l'indice de la ligne (enregistrement lu) dans DataTable de la table Analyse

    "DateDeces" est le nom du champ

    Avec SQL SERVER, je n'ne sais pas faire la même chose

    Voici comment je traite l'enregistrement lu

                'execut le select

                cmd = New SqlCommand(req_verifi, con)

                dr = cmd.ExecuteReader

                ' traitement des enregistrements

                Do While dr.Read

                    Dim NumCli As String = dr.GetName(0)

                Loop

    (req_verifi  est "select * from client")

    Je sais "récupérer" le nom du champs

    Mais il faut que je connaisse l'indice du champs dns la ligne, ce qui n'est pas pratique

    En effet, en cas de mise à jour des champs de la table …

    Comment faut-il faire ?


    Cordialement Sauveur CONSALVI


    vendredi 9 novembre 2012 14:54

Toutes les réponses

  • Bonjour,

    dr["nomChamp"] pour accéder directement au champ.

    dr.GetOrdinal("nomChamp") permet de récupérer la position du champ.


    Cordialement, Thierry

    vendredi 9 novembre 2012 15:11
  • Merci baucoup !

    Voici mon test pour mettre en pratique

    Public Sub Lecture(ByVal Recherche As String)
            Try
                wNbrENRG = 0
                cmd = New SqlCommand(Recherche, con)
                dr = cmd.ExecuteReader
                Do While dr.Read
                    Dim NomCli As String = CStr(dr("NomCli"))
                    Dim NomChamps As String = dr.GetName(0)
                    Dim NumCli As Integer = CInt(dr.GetSqlInt32(0))
                    Dim NumCli1 As String = CStr(dr("NumCli"))
                    Dim PosChamp As Integer = dr.GetOrdinal("NumCli")
                    wNbrENRG += 1   '   Calcul du nombre d'enregistrements
                Loop
                dr.Close()
            Catch ex As SqlException
                For wModBaseDonne.wCptERR = 0 To ex.Errors.Count - 1
                    MsgErreur = "Index #" & wModBaseDonne.wCptERR.ToString() & ControlChars.NewLine _
                        & "Message: " & ex.Errors(wModBaseDonne.wCptERR).Message & ControlChars.NewLine _
                        & "LineNumber: " & ex.Errors(wModBaseDonne.wCptERR).LineNumber & ControlChars.NewLine _
                        & "Source: " & ex.Errors(wModBaseDonne.wCptERR).Source & ControlChars.NewLine _
                        & "Procedure: " & ex.Errors(wModBaseDonne.wCptERR).Procedure & ControlChars.NewLine
                    MessageBox.Show(MsgErreur)
                Next wModBaseDonne.wCptERR
            End Try
        End Sub

    Je peux travailler maintenant avec le nom ou l'indice du champs

    J'ai eut un peut de mal avec les conversions de type

    Où avez-vous trové ces informations ?


    Cordialement Sauveur CONSALVI

    vendredi 9 novembre 2012 16:05
  • Simplement dans la doc MSDN : http://msdn.microsoft.com/fr-fr/library/system.data.sqlclient.sqldatareader.aspx

    Merci de marquer la question comme traitée.


    Cordialement, Thierry

    vendredi 9 novembre 2012 17:35
  • Bonjour,

    Un grand merci pour le lien. Grace à lui, j'ai résolu mon problème de nombre d'enregistrement.

    A ma décharge, j'ai Visual Studio 2008, qui n'autorise pas une version de FRAMWORK supérieur à 3.5, et j'opte pour la version 2.0 par souci de compatibilité avec des déploiements sur des postes clients.

    (Cela évite qu'ils soient obligés d'installer la version supérieure)

    Voici le code

        Public MaBase As String = My.Application.Info.DirectoryPath & "\" & NomBase
        Public wNbrENRG As Integer  '   Nombre enregistrements ou ligne trouvé
        Public wIndERR As Integer   '   Indice pour faire une boucle sur type des erreurs
        Public wDataTable As New DataTable
        Public SqlDR As SqlDataReader
        Dim strcon As String = "Data Source=.\SQLEXPRESS;AttachDbFilename=" & MaBase & ";Integrated Security=True;User Instance=True"
        Public SqlConx As New SqlConnection(strcon)
        Public SqlCmd As SqlCommand
        Public sqlRequete As String
        Public Sub ConnectionBase()
            Try
                If SqlConx.State = ConnectionState.Closed Then
                    SqlConx.Open()
                End If
            Catch ex As SqlException
                For wModBaseDonne.wIndERR = 0 To ex.Errors.Count - 1
                    MsgErreur = "Index #" & wModBaseDonne.wIndERR.ToString() & ControlChars.NewLine _
                        & "Message: " & ex.Errors(wModBaseDonne.wIndERR).Message & ControlChars.NewLine _
                        & "LineNumber: " & ex.Errors(wModBaseDonne.wIndERR).LineNumber & ControlChars.NewLine _
                        & "Source: " & ex.Errors(wModBaseDonne.wIndERR).Source & ControlChars.NewLine _
                        & "Procedure: " & ex.Errors(wModBaseDonne.wIndERR).Procedure & ControlChars.NewLine
                    MessageBox.Show(MsgErreur)
                Next wModBaseDonne.wIndERR
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub
        Private Sub butChercherNom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butChercherNom.Click
            Try
                If Me.txtNom.Text <> "" Then
                    sqlRequete = "select * from Client where NomCli like '%" & Me.txtNom.Text & "%'"
                    SqlCmd = New SqlCommand(sqlRequete, SqlConx)
                    SqlDR = SqlCmd.ExecuteReader
                    Dim schemaTable As DataTable = SqlDR.GetSchemaTable()
                    wNbrENRG = schemaTable.Rows.Count
                    Select Case wNbrENRG
                        Case 0
                            MessageBox.Show("Client non trouvé")
                        Case 1
                            MessageBox.Show("1 Client trouvé")
                        Case Else
                            MessageBox.Show(wNbrENRG & " Client trouvés")
                    End Select
                    If SqlDR.HasRows Then
                        Do While SqlDR.Read()
                            Dim NomCli As String = CStr(SqlDR("NomCli"))
                            Dim NomChamps As String = SqlDR.GetName(0)
                            Dim NumCli As Integer = CInt(SqlDR.GetSqlInt32(0))
                            Dim NumCli1 As String = CStr(SqlDR("NumCli"))
                            Dim PosChamp As Integer = SqlDR.GetOrdinal("NumCli")
                            MessageBox.Show("NomCli = " & NomCli & vbCrLf & _
                                            "NomChamps = " & NomChamps & vbCrLf & _
                                            "NumCli = " & NumCli & vbCrLf & _
                                            "NumCli1 = " & NumCli1 & vbCrLf & _
                                            "PosChamp = " & PosChamp)
                        Loop
                    Else
                        MessageBox.Show("Client NON trouvé")
                    End If
                    SqlDR.Close()
                Else
                    MessageBox.Show("vérifier votre saisie")
                End If
            Catch ex As SqlException
                For wModBaseDonne.wIndERR = 0 To ex.Errors.Count - 1
                    MsgErreur = "Index #" & wModBaseDonne.wIndERR.ToString() & ControlChars.NewLine _
                        & "Message: " & ex.Errors(wModBaseDonne.wIndERR).Message & ControlChars.NewLine _
                        & "LineNumber: " & ex.Errors(wModBaseDonne.wIndERR).LineNumber & ControlChars.NewLine _
                        & "Source: " & ex.Errors(wModBaseDonne.wIndERR).Source & ControlChars.NewLine _
                        & "Procedure: " & ex.Errors(wModBaseDonne.wIndERR).Procedure & ControlChars.NewLine
                    MessageBox.Show(MsgErreur)
                Next wModBaseDonne.wIndERR
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
        End Sub


    Je pense avoir correctement passé ma question en "traitée"

    Mais je ne sais pas changer l'icône Je ne vois pas comment faire


    Cordialement Sauveur CONSALVI


    samedi 10 novembre 2012 07:25