none
Problème avec un champ uniqueidentifier RRS feed

  • Question

  • Bonjour,

    Je code en vb.net sous visual basic express 2005. Je fais une connexion entre deux base de donnée Sql Server 2005, mon but est de faire un transfert de donnée d'une base vers l'autre. Tous marche sauf avec un champ uniqueidentifier que je dois inséré voici mon code :

     

     

      Dim i As Integer, j As Integer
    
    
    
            cnn1.ConnectionString = "SERVER=(local);Database=CRMbvsi_MSCRM;integrated Security=SSPI"
    
            cnn1.Open()
    
            'Solution àdévelloper pour enlevé l'insertion manuelle et rendre possible les mise à jours automatique. on sélection dans la table des propriétaire de CRM leur nom et prenom et on les compare à ceux obtenuu à parti de SAGE afficher dans la grille, le problème est que le champs "SystemeUserId" est un type que l'on ne peut pas récupérer.
    
            cmd.CommandText = "select * from  SystemUserBase where LastName <> 'INTEGRATION' and LastName <> 'SYSTEM'"
    
            cmd.Connection = cnn1
    
            curs2 = cmd.ExecuteReader()
    
            uneligne1 = curs2.Read
    
            While uneligne1
    
                Grd2.Rows.Add(curs2("SystemUserId"), curs2("FirstName"), curs2("LastName"))
    
                uneligne1 = curs2.Read
    
            End While
    
            curs2.Close()
    
            For i = 0 To Grd1.Rows.Count - 1
    
    
    
                For j = 0 To Grd2.Rows.Count - 1
    
    
    
                    If Grd1.Item(9, i).Value = Grd2.Item(2, j).Value Then
    
    
    
    
    
                        cmd1.CommandText = "INSERT INTO AccountBase (AccountID, DeletionStateCode, StateCode, OwningUser) VALUES (NEWID(), 0, 0, '" & Grd2.Item(0, j).Value & "'"
    
                        cmd1.Connection = cnn1
    
                        cmd1.ExecuteScalar()
    
    
    
                    End If
    
                Next
    
            Next
    
            cnn1.Close()

     

    Le champs de type uniqueidentifier à inséré est le champ OwningUser.

    Je vous remercie de votre aide.

    mardi 30 mars 2010 07:20

Réponses

  • Mieux vaut utiliser une syntaxe de type using comme indiqué pour gérer le dispose de l'objet SqlCommand.

    Néanmoins l'erreur porte sur cmd1 sur cmd1.Parameters ou Grd2 ? Peut être n'y a t-il pas d'item ? Pouvez vous utiliser le débugger pour préciser l'erreur ?

    Cordialement

    • Marqué comme réponse gregjondot mardi 30 mars 2010 14:21
    mardi 30 mars 2010 13:25
    Modérateur

Toutes les réponses

  • Bonjour,

    il semble qu'une parenthèse soit manquante à la fin de ton insert.

    Par ailleurs plutot que de concaténer des chaines mieux vaudrait utiliser des paramètres sur la commande. Par exemple :

     

    'déclaration avant la boucle
    cmd1.CommandText = "INSERT INTO AccountBase (AccountID, DeletionStateCode, StateCode, OwningUser) VALUES (NEWID(), 0, 0, @GridValue)"
    cmd1.Parameters.Add("@GridValue", SqlDbType.VarChar)
    
    ...
        ...
    
    'dans la boucle seul le paramètre change
    cmd1.Parameters("@GridValue").Value = Grd2.Item(0, j).Value.ToString()
    
    
    Cordialement

    Edit : modification du code pour éviter de déclarer la commande à chaque itération

     

     

    • Modifié nikhoModerator mardi 30 mars 2010 12:14
    • Marqué comme réponse gregjondot mardi 30 mars 2010 12:22
    • Non marqué comme réponse gregjondot mardi 30 mars 2010 12:29
    mardi 30 mars 2010 11:57
    Modérateur
  • J'obtient le code suivant :

            Dim i As Integer, j As Integer
            cnn1.ConnectionString = "SERVER=(local);Database=CRMbvsi_MSCRM;integrated Security=SSPI"
            cnn1.Open()
    
            cmd.CommandText = "select * from  SystemUserBase where LastName <> 'INTEGRATION' and LastName <> 'SYSTEM'"
            cmd.Connection = cnn1
            curs2 = cmd.ExecuteReader()
            uneligne1 = curs2.Read
    
            While uneligne1
                Grd2.Rows.Add(curs2("SystemUserId"), curs2("FirstName"), curs2("LastName"))
                uneligne1 = curs2.Read
            End While
    
            curs2.Close()
    
            cmd1.CommandText = "INSERT INTO AccountBase (AccountID, DeletionStateCode, StateCode, OwningUser) VALUES (NEWID(), 0, 0, @GridValue)"
            cmd1.Parameters.Add("@GridValue", SqlDbType.VarChar)
    
    
            For i = 0 To Grd1.Rows.Count - 1
    
                For j = 0 To Grd2.Rows.Count - 1
    
                    If Grd1.Item(9, i).Value = Grd2.Item(2, j).Value Then
                        cmd1.Connection = cnn1
                        cmd1.Parameters("@GridValue").Value = Grd2.Item(0, j).Value.ToString()
                        cmd1.ExecuteScalar()
                    End If
                Next
            Next
            cnn1.Close()
     

    Mais un message d'erreurs'affiche : "La référence d'objet n'est pas définie à une instance d'un objet."

    Merci de votre réponse.

     

    Cordialement

     

    mardi 30 mars 2010 12:31
  • Sur quelle ligne est reporté ce problème ? Peut être sur une ligne utilisant cmd1 car je ne vois pas d'initialisation de cmd1.

    ...
    Using cmd1 As New SqlCommand()
    
        cmd1.CommandText = "INSERT INTO AccountBase (AccountID, DeletionStateCode, StateCode, OwningUser) VALUES (NEWID(), 0, 0, @GridValue)"
        cmd1.Parameters.Add("@GridValue", SqlDbType.VarChar)
        cmd1.Connection = cnn1
    
        For i = 0 To Grd1.Rows.Count - 1
    
            For j = 0 To Grd2.Rows.Count - 1
    
                If Grd1.Item(9, i).Value = Grd2.Item(2, j).Value Then
                    cmd1.Parameters("@GridValue").Value = Grd2.Item(0, j).Value.ToString()
                    cmd1.ExecuteScalar()
                End If
            Next
        Next
    End Using
    

    mardi 30 mars 2010 13:13
    Modérateur
  • Sur quelle ligne est reporté ce problème ? Peut être sur une ligne utilisant cmd1 car je ne vois pas d'initialisation de cmd1

     

    L'initialisation du cmd1 est sur le form_load et l'erreur st reporté sur la ligne :

    cmd1.Parameters("@GridValue").Value = Grd2.Item(0, j).Value.ToString()

    mardi 30 mars 2010 13:19
  • Mieux vaut utiliser une syntaxe de type using comme indiqué pour gérer le dispose de l'objet SqlCommand.

    Néanmoins l'erreur porte sur cmd1 sur cmd1.Parameters ou Grd2 ? Peut être n'y a t-il pas d'item ? Pouvez vous utiliser le débugger pour préciser l'erreur ?

    Cordialement

    • Marqué comme réponse gregjondot mardi 30 mars 2010 14:21
    mardi 30 mars 2010 13:25
    Modérateur
  • Merci beaucoup l'insertion marche le souci était que la boucle se terminé a rows .count -1 mais en mettant -2 cela fonctionne.

    Je ne comprend pas bien pourquoi mais cela marche.

     

    Cordialement

    mardi 30 mars 2010 14:23