L'objet CommandBuilder peut reconstruire une commande que vous essayez de modifier pendant l'appel suivant à la méthode DataAdapter.Update et votre les modifications apportées à la commande risquent d'être perdues

Traductions disponibles Traductions disponibles
Numéro d'article: 310366 - Voir les produits auxquels s'applique cet article
Cet article a été archivé. Il est proposé « en l'état » et ne sera plus mis à jour.
Cet article se réfère à l'espace de noms bibliothèque de classes Microsoft .NET Framework suivant :
  • System.Data.SqlClient
Agrandir tout | Réduire tout

Sommaire

Symptômes

L'objet CommandBuilder peut reconstruire une commande que vous essayez de modifier pendant l'appel suivant à la méthode DataAdapter.Update , et les modifications apportées à la commande peuvent être perdues. Ce problème se produit dans les circonstances suivantes :
  • Si vous associez un objet CommandBuilder à un objet DataAdapter .
  • Si vous utilisez la méthode GetInsertCommand , GetUpdateCommand ou GetDeleteCommand de l'objet CommandBuilder pour affecter explicitement les commandes à l' objet DataAdapter .
  • Si vous modifiez une des commandes que CommandBuilder génère.
Lorsque vous essayez d'appeler la méthode Update du DataAdapter , le message d'erreur suivant peut s'afficher :
Une exception non gérée du type « System.Data.SqlClient.SqlException » s'est produite dans system.data.dll

Cause

Ce problème se produit car CommandBuilder modifie dynamiquement les commandes qu'il génère revenir à la commande d'origine.

Résolution

Utilisez une des méthodes suivantes pour résoudre ce problème :
  • Ne modifiez pas les commandes qui génère CommandBuilder . CommandBuilder ne modifie pas les objets Command que vous créez vous-même.
  • Copier les objets InsertCommand , DeleteCommand et UpdateCommand vers un nouvel objet DataAdapter (voir la section « Plus d'informations » pour un exemple). La nouvelle variable de DataAdapter doit avoir la même portée ou plus étroite que la variable objet DataAdapter ancienne.
  • Ne pas utiliser CommandBuilder du tout. Écrire vos propres objets Command , ou utilisez les outils de données Visual pour écrire les.

Statut

Ce comportement est voulu par la conception même du produit.

Plus d'informations

Procédure pour reproduire le comportement

  1. Créez un nouveau projet d'application de Windows de Visual Basic. Form1 est ajouté au projet par défaut.
  2. Double-cliquez sur le formulaire et ajoutez le code suivant en haut de la fenêtre Code :
    Imports System.Data.SqlClient
    					
  3. Ajoutez un contrôle bouton à Form1.
  4. Double-cliquez sur le bouton, puis ajoutez le code suivant à l'événement Click :
    Dim cn As New SqlConnection()
            Dim custDS As New DataSet()
            Dim da1 As New SqlDataAdapter()
            Dim da2 As New SqlDataAdapter()
            Dim dr As DataRow
            Dim cb As SqlCommandBuilder
    
            cn.ConnectionString = "server=servername;database=northwind;uid=sa;pwd=password;"
            cn.Open()
            da1 = New SqlDataAdapter("select * from Customers", cn)
            cb = New SqlCommandBuilder(da1)
    
            da1.Fill(custDS, "Customers")
    
            'Get the original commands.
    
            da1.InsertCommand = cb.GetInsertCommand
            da1.DeleteCommand = cb.GetDeleteCommand
            da1.UpdateCommand = cb.GetUpdateCommand
    
            Debug.WriteLine("Original command length: " & da1.InsertCommand.CommandText.Length)
    
            'Modify the Insert command.
    
            da1.InsertCommand.CommandText = "select * from customers where customerid=@@identity"
    
            da1.InsertCommand.UpdatedRowSource = UpdateRowSource.FirstReturnedRecord
    
            da2.InsertCommand = da1.InsertCommand
            da2.DeleteCommand = da1.DeleteCommand
            da2.UpdateCommand = da1.UpdateCommand
    
            'Add a record to the table.
    
            Dim tblCust As DataTable
            tblCust = custDS.Tables("Customers")
    
            Dim drCust As DataRow
    
            drCust = tblCust.NewRow()
            drCust("CustomerID") = "ZYYYY"
            drCust("CompanyName") = "Zora's Yummies"
            drCust("ContactName") = "Christophe Namby"
            drCust("ContactTitle") = "Assistant Manager"
    
            tblCust.Rows.Add(drCust)
    
            'Update the backend.
    
            Debug.WriteLine("Length da1 before insert: " & da1.InsertCommand.CommandText.Length)
    
            da1.Update(custDS, "Customers")
    
            Debug.WriteLine("Length da1 after insert: " & da1.InsertCommand.CommandText.Length)
            Debug.WriteLine("length da2 before insert: " & da2.InsertCommand.CommandText.Length)
    
            da2.Update(custDS, "Customers")
    
            Debug.WriteLine("Length da2 after insert: " & da2.InsertCommand.CommandText.Length)
    					
  5. Modifiez la chaîne de connexion pour vous connecter à votre ordinateur Microsoft SQL Server.
  6. Appuyez sur la touche F5 pour exécuter le code.
  7. Commentaire la ligne suivante pour résoudre ce problème :
            da1.Update(custDS, "Customers")
    					
Cette résolution fonctionne car CommandBuilder intercepte l'événement RowUpdating sur DataAdapter (« da1) qu'il sait où générer les commandes. Lorsque vous copiez les commandes dans un autre DataAdapter (« da2), CommandBuilder est plus associé à ses événements et ne modifie pas les.

Variable étendue est importante car si « da1 » et SqlCommandBuilder (« cb) sont hors de portée, et si garbage collection se produit, CommandBuilder définit ses commandes Nothing (environ pour null dans C#). Par conséquent, vous ne pouvez pas utiliser ces commandes dans da2. Étant donné que garbage collection peut se produire à heures aléatoires, l'appel de méthode da2.Update peut générer erreurs de l'exception NullReferenceException par intermittence.

Propriétés

Numéro d'article: 310366 - Dernière mise à jour: lundi 24 février 2014 - Version: 1.7
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ADO.NET 2.0
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft Visual Basic .NET 2002 Initiation
  • Microsoft Visual Basic .NET 2003 Initiation
  • Microsoft Visual Basic 2005
Mots-clés : 
kbnosurvey kbarchive kbmt kbtshoot kberrmsg kbprb kbsqlclient kbsystemdata KB310366 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 310366
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com