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 :

SQL et VB.NET


Sujet :

VB.NET

  1. #21
    Membre éclairé
    Homme Profil pro
    Technical Team Leader
    Inscrit en
    Avril 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technical Team Leader
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 235
    Par défaut
    c'est correct comment je l'ai mis? le .location ok, mais le body... mais bon j'ai l'erreur dès qu'il passe sur le .location

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nom = .Location.Substring("'", " ") ' Nom
    de = .Organizer ' De
    body = Replace(.Body.Substring("'", " "), "&0A", vbCrLf) 'Contenu
    en faite, il ne doit pas aimer la conversion ?

  2. #22
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    Il s'agit de guillemets simple qui font planter ta requête (car il détermine la fin d'une zone de texte sous une requête Access). Il faut pour ceci échapper chaque variable qui sert pour un champ texte de la façon suivante:

    Replacer tout les guillement simple par 2 guillemets simple (ce qui écrira un guillement dans votre champs.

    Le replace doit être un reflexe si vous écrivez des requêtes à la main avec des champs string car c'est une porte ouverte au injection SQL!

  3. #23
    Membre éclairé
    Homme Profil pro
    Technical Team Leader
    Inscrit en
    Avril 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technical Team Leader
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 235
    Par défaut
    voici mon code c'est tordu quand même....

    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
    With objItem
                        début = .Start 'Format(.Start, "dd/MM/yyyy H:mm") 'Début
                        fin = .End 'Format(.End, "dd/MM/yyyy H:mm") ' Fin
                        date1 = Format(.End, "dd/M/yyyy") ' Date
                        duree = Format((.Duration / 1440) / 1, "H:mm") ' Durée
                        objet = .Subject ' Objet
                        Try
                            objet = .Subject.Replace("'", "''")
                        Catch
                        End Try
                        nom = .Location ' Nom
                        Try
                            nom = .Location.Replace("'", "''")
                        Catch
                        End Try
                        de = .Organizer ' De
                        Try
                            body = .Body.Replace("'", "''")
                        Catch
                        End Try
     
                        body = Replace(.Body, "&0A", vbCrLf) 'Contenu
                        Try
                            categories = .Categories.Replace("'", "''")
                        Catch
                        End Try
                        categories = .Categories ' Categories
                    End With

  4. #24
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Bonsoir,
    je suis pas d'accord sur le fait d'appliquer des replaces partout car ca ne gère pas tous les problème, la bonne méthode a déjà été donnée par sevyc64, c'est les requêtes paramétrée :

    Citation Envoyé par sevyc64 Voir le message
    Ces 3 lignes là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
                ObjetCommand = New OleDbCommand
                ObjetCommand.Connection = ObjetConnection
                ObjetCommand.CommandType = CommandType.Text
    sont à mettre en dehors de la boucle For.

    Dans ton cas, la ligne suivante (avec la requete) pourrait elle-aussi être mise en dehors de la boucle si tu utilisait une requete paramétrée.

    Et indique le message d'erreur que tu obtiens que l'on y voie plus clair.

    Et supprime aussi les 2 "On Error ...". On utilise plus ça en .Net
    Quand un membre expert qui à 1 618 Messages et 2 419 Points intervient dans ton post, essaye de l'écouter car on apprend beaucoup de ces personnes...

    Donc sort de ta routine la création de la commande, tjs en dehors, crées les paramètres et dans ta routine il te suffira de remplir les paramètre et de faire un ExecuteNonQuery.

    C'est bien plus propre et performant...

  5. #25
    Membre éclairé
    Homme Profil pro
    Technical Team Leader
    Inscrit en
    Avril 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technical Team Leader
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 235
    Par défaut
    voici le code que j'utilise:

    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
     Sub Import_Outlook()
     
            Timer1.Enabled = False
     
            ' Create Outlook Application
            Dim oApp As Outlook.Application = New Outlook.Application()
     
            ' Get Mapi NameSpace and Logon
            Dim oNS As Outlook.NameSpace = oApp.GetNamespace("MAPI")
            oNS.Logon("", "", False, True) ' TODO:
     
            ' Get all the appointments from Calendar folder
            Dim oCal As Outlook.MAPIFolder = oNS.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderCalendar)
            Dim oItems As Outlook.Items = oCal.Items
            MsgBox("Totall : " & oItems.Count)
     
            Dim sSearch As String
            ' Use Restrict method
            sSearch = "[Start] >= '" & Fdate & " 08:00 AM' and [Start] <= '01/12/3000 08:00 AM'" 'Cherche tous les enregistrement depuis la dernière mis à jour
            oItems = oItems.Restrict(sSearch)
            MsgBox("Totall Restricted : " & oItems.Count)
     
            tmp = 0
            ProgressBar1.Minimum = 0
            ProgressBar1.Maximum = oItems.Count
     
            Dim oAppointment As Outlook.AppointmentItem
            Dim i As Integer
     
            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= C:\data\Calendar_net.mdb;"
            ObjetConnection = New OleDbConnection
     
            'Donner à la propriété ConnectionString les paramètres de connexion
            ObjetConnection.ConnectionString = strConn
     
            'Ouvrir la connexion
            ObjetConnection.Open()
     
            'Instancier un objet Commande
            ObjetCommand = New OleDbCommand
            ObjetCommand.Connection = ObjetConnection
            ObjetCommand.CommandType = CommandType.Text
     
            ' Loop each item under Restrict
            For i = 1 To oItems.Count
                oAppointment = oItems.Item(i)
     
                If Not oAppointment Is Nothing Then ' this is an appointment item
     
                    With oAppointment
                        début = .Start 'Format(.Start, "dd/MM/yyyy H:mm") 'Début
                        fin = .End 'Format(.End, "dd/MM/yyyy H:mm") ' Fin
                        date1 = Format(.End, "dd/M/yyyy") ' Date
                        duree = Format((.Duration / 1440) / 1, "H:mm") ' Durée
                        objet = .Subject ' Objet
                        Try
                            objet = .Subject.Replace("'", "''")
                        Catch
                        End Try
                        nom = .Location ' Nom
                        Try
                            nom = .Location.Replace("'", "''")
                        Catch
                        End Try
                        de = .Organizer ' De
     
                        Try
                            body = .Body.Replace("'", "''")
                        Catch
                        End Try
     
                        body = Replace(.Body, "&0A", vbCrLf) 'Contenu
                        Try
                            categories = .Categories.Replace("'", "''")
                        Catch
                        End Try
                        categories = .Categories ' Categories
                    End With
                    oAppointment = Nothing
                End If
     
                'Instancier un objet Commande
                ObjetCommand.CommandText = "INSERT INTO Calendar_net ( [Date], [début], [Fin], [Durée], [Objet], [Nom], [De], [Contenu], [Categories] ) VALUES ('" & date1 & "', '" & début & "', '" & fin & "', '" & duree & "', '" & objet & "', '" & nom & "', '" & de & "', '" & body & "', '" & categories & "')"
                ObjetCommand.ExecuteNonQuery()
     
                tmp = tmp + 1
                ProgressBar1.Value = tmp
     
            Next i 'TODO pause
     
            ' Logoff
            oNS.Logoff()
     
            ' Clean Up
            oApp = Nothing
            oNS = Nothing
            oItems = Nothing
            oAppointment = Nothing
        End Sub
    dans ma boucle For il y a l'attribution des valeurs aux variables et l'exécution de la commande !!!
    J'ai encor des erreurs sur des messages !!!

    [IMG][/IMG]

    Je pige pas trop car j'ai .replace de ca ' et là dans mon cas c'est le ' de " l'atelier " qui merde....

  6. #26
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    Citation Envoyé par sinople Voir le message
    Il s'agit de guillemets simple qui font planter ta requête (car il détermine la fin d'une zone de texte sous une requête Access). Il faut pour ceci échapper chaque variable qui sert pour un champ texte de la façon suivante:

    Replacer tout les guillement simple par 2 guillemets simple (ce qui écrira un guillement dans votre champs.

    Le replace doit être un reflexe si vous écrivez des requêtes à la main avec des champs string car c'est une porte ouverte au injection SQL!
    Je me corrige moi même ce que j'ai donné comme code c'est pour une base de donnée Access et non pas SQL SERVER ou dans ce cas il est conseillé d'utiliser les requêtes paramétrées.

  7. #27
    Membre éclairé
    Homme Profil pro
    Technical Team Leader
    Inscrit en
    Avril 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technical Team Leader
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 235
    Par défaut
    Je crois savoir pourquoi ca deconne:

    dans mon .body j'ai plusieurs lignes donc en fait je crois que le .body.Replace("'","''") marche uniquement sur la première ligne et non sur la 2eme, 3eme, etc...

    en fait je fais ca et ca a l'air de marcher j'ai inverser les deux:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                        body = Replace(.Body, "&0A", vbCrLf) 'Contenu
                        Try
                            body = .Body.Replace("'", "''")
                        Catch
                        End Try

  8. #28
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2009
    Messages : 10
    Par défaut
    Bonjour,

    Tu devrais essayer d'utiliser des requêtes paramétrées. Tu ne devrait plus avoir de problèmes avec les quotes et les champs de type date.

    tu devrais avoir un truc de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
     
    ObjetCommand.CommandText = "INSERT INTO Calendar_net ( [Date], [début], [Fin], [Durée], [Objet], [Nom], [De], [Contenu], [Categories] ) VALUES ( @Date, @debut, @Fin, @Durée, @Objet, @Nom, @De, @Contenu, @Categories)"
     
    ObjetCommand.Parameters.Add("@date",OleDbType.Date ).Value = date 
    ObjetCommand.Parameters.Add("@debut",OleDbType.varchar ).Value = debut
    ...
     
    ObjetCommand.executenonquery()
    faudra initialiser tous les paramètres avant de faire la executenonquery()
    Voila un tuto contenant les requetes paramétrées
    http://faqvbnet.developpez.com/?page=adonet

  9. #29
    Membre éclairé
    Homme Profil pro
    Technical Team Leader
    Inscrit en
    Avril 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technical Team Leader
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 235
    Par défaut
    ok merci, c'est cool je ne connaissais pas,

    sinon vers le debut de mon code j'ai ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sSearch = "[End] >= '" & Fdate & "' and [End] <= '01/12/3000 08:00 AM'"
    ce qui me permet de trier les item par date ".End"...

    Fdate = "01/01/2000 08:00 AM"

    j'aimerais recureper si c'est possible dans une variable la valeur de la date la plus recente que je filtre avec search?

  10. #30
    Membre habitué
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2009
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2009
    Messages : 10
    Par défaut
    Je comprend pas bien... tu as besoin de recupérer la date du jour courant? si c'est le cas alors tu devrais essayer Date.now

  11. #31
    Membre éclairé
    Homme Profil pro
    Technical Team Leader
    Inscrit en
    Avril 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technical Team Leader
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 235
    Par défaut
    J'ai créé une key registre où je rentre la date d'éxécution de mon application.

    Au lancement de mon application je fais un test pour savoir si ma key existe...si non je crais donc une key avec une date anterieur...:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     Private Sub LireReG()
     
            key = Microsoft.Win32.Registry.CurrentUser.OpenSubKey("Software\JVI\Outlook into Access\")
     
            If key Is Nothing Then
                key = Microsoft.Win32.Registry.CurrentUser.CreateSubKey("Software\JVI\Outlook into Access\")
                key.SetValue("date", "01/01/2000 08:00 AM")
                Fdate = CType(key.GetValue("date"), String)
            Else
                Fdate = CType(key.GetValue("date"), String)
            End If
     
        End Sub
    ma valeur par default au tout premier lancement est :"01/01/2000 08:00 AM" que j'attribu à "Fdate"

    donc le but est que je tris les entrées entre "Fdate" et "dateofYesterday" qui elle est egal à aujourd'hui moins 1 jour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sSearch = "[End] >= '" & Fdate & "' and [End] <= '" & dateofYesterday & "'"
    une fois que mon application est lancer et fermer, ma Key prend la valeur de "dateofYesterday", donc si je lance deux fois mon application il devrait tout copier la première fois et la deuxième rien copier... car c'est la même date...

    le probleme c'est que, mon format de date est comme celui ci:"01/01/2000 08:00 AM", j'ai des données où il n'y a pas d'heures donc format comme celui ci "01/01/2000" et du coup quand je relance mon application il me recopi a chaque fois toutes ces données!!!

    ???

  12. #32
    Membre éclairé
    Homme Profil pro
    Technical Team Leader
    Inscrit en
    Avril 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Technical Team Leader
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2010
    Messages : 235
    Par défaut
    bon en fait c'est pas tres grave car les données qu'il me copie en double c'est uniquement ceux qui sont toute la journée...

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/05/2007, 10h35
  2. [VB.NET] Inventaire SQL sous VB.Net + SMO
    Par _n1n1_ dans le forum Accès aux données
    Réponses: 2
    Dernier message: 18/04/2007, 16h37
  3. [SQL 2005][ASP.net 2]Insertion de date dans une table
    Par skystef dans le forum Accès aux données
    Réponses: 2
    Dernier message: 29/12/2006, 09h26
  4. [SQL Server][ASP.net] clefs étrangères qui ne se propagent pas
    Par skystef dans le forum Accès aux données
    Réponses: 3
    Dernier message: 21/12/2006, 11h56

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