Comment faire pour mettre à jour une base de données SQL Server à l'aide de l'objet SqlDataAdapter dans Visual Basic .NET

Traductions disponibles Traductions disponibles
Numéro d'article: 308055 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article contient des exemples de code Microsoft Visual Basic .NET qui montrent comment utiliser l'objet SqlDataAdapter pour mettre à jour une base de données SQL Server avec modifications de données qui sont exécutées sur un objet DataSet qui est rempli avec des données d'une table dans la base de données.

Configuration requise

Met en la liste suivante évidence le matériel recommandé, logiciels, infrastructure réseau, compétences et connaissances et service packs sont requis les :
  • Microsoft Windows 2000 Professionnel, Windows 2000 Server, Windows 2000 Advanced Server ou Windows NT 4.0 Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server version 7.0 ou version ultérieure
Cet article suppose que vous êtes familiarisé avec les sujets suivants :
  • Visual Basic .NET
  • Notions fondamentales ADO.NET et la syntaxe

Description de la technique

L'objet SqlDataAdapter sert de pont entre un objet ADO.NET DataSet et une base de données SQL Server. SqlDataAdapter est un objet intermédiaire qui remplit un objet ADO.NET DataSet par les données qui sont extraite d'une base de données SQL Server et puis met à jour la base de données pour refléter les modifications apportées aux données à l'aide de l'objet DataSet (comme insertions, mises à jour et suppressions).

Le InsertCommand , le UpdateCommand et les propriétés DeleteCommand de l'objet SqlDataAdapter à jour la base de données avec les modifications de données qui sont exécutées sur un objet DataSet . Ces propriétés sont des objets SqlCommand qui spécifient la INSERT, UPDATE et les commandes Transact-SQL DELETE qui sont utilisées pour valider les modifications dataset à la base de données cible. Les objets SqlCommand qui sont affectés à ces propriétés peuvent être créés manuellement dans le code ou générés automatiquement à l'aide de l'objet SqlCommandBuilder .

Le premier exemple de code dans cet article montre comment utiliser l'objet SqlCommandBuilder pour générer automatiquement la propriété UpdateCommand de l'objet SqlDataAdapter . Le deuxième exemple utilise un scénario dans lesquels vous ne pouvez pas utiliser génération commande automatique. Le deuxième exemple montre comment manuellement créer et utiliser un objet SqlCommand en tant que la propriété UpdateCommand d'un objet SqlDataAdapter .

Créer la table exemple SQL Server

Pour créer un exemple de table SQL Server que vous pouvez utiliser dans les exemples de code Visual Basic .NET qui sont documentées dans cet article, procédez comme suit :
  1. Ouvrez l'Analyseur de requêtes SQL et puis connectez-vous à la base de données dans laquelle vous voulez créer la table d'exemple. Les exemples de code de cette utilisation article la base de données les Comptoirs fourni avec SQL Server.
  2. Pour créer une table d'exemple qui est nommée CustTest et à insérer un enregistrement dans la table, exécutez les instructions Transact-SQL suivantes :
    Create Table CustTest
    (
     CustID int primary key,
     CustName varchar(20)
    )
    
    Insert into CustTest values(1,'John')
    					

Exemple de code 1: générées automatiquement les commandes

Si l'instruction SELECT qui vous permet de récupérer les données qui alimente un DataSet est basée sur une table de base de données unique, vous pouvez utiliser l'objet CommandBuilder pour générer automatiquement le DeleteCommand , le InsertCommand et les propriétés UpdateCommand du DataAdapter . Ceci simplifie et réduit le code qui est nécessaire pour effectuer des opérations INSERT, UDPATE et DELETE.

Comme un besoin minimal, vous devez définir la propriété SelectCommand pour générer automatiquement des commandes. Le schéma de table qui extrait le SelectCommand détermine la syntaxe de L'INSERT, UPDATE et les instructions de suppression qui sont automatiquement générées.

Le SelectCommand doit aussi renvoyer au moins une clé primaire ou colonne unique. Si aucune n'est présent, une exception InvalidOperation est générée et les commandes ne sont pas générées.

Pour créer une application console Visual Basic .NET exemple qui illustre comment utiliser l'objet SqlCommandBuilder pour générer automatiquement le DeleteCommand , le InsertCommand et les propriétés UpdateCommand de l'objet SqlCommand pour un objet SqlDataAdapter , procédez comme suit :
  1. Pour créer une nouvelle application de console Visual Basic .NET, procédez comme suit :
    1. Démarrez Microsoft Visual Studio .NET.
    2. Dans le menu Fichier , pointez sur Nouveau , puis cliquez sur projet .
    3. Cliquez sur projets Visual Basic sous types de projet , puis cliquez sur application console sous modèles .
  2. Remplacez la valeur par défaut de Module1 par le code suivant :
    Imports System.Data.SqlClient
    Imports Console = System.Console
    
    Module Module1
    
        Sub Main()
    
            Dim cn As New SqlConnection()
            Dim CustomersDataSet As New DataSet()
            Dim da As SqlDataAdapter
            Dim dr As DataRow
            Dim cmdBuilder As SqlCommandBuilder  
      
            'Set the connection string of the SqlConnection object to connect to the
            'SQL Server database in which you created the sample table.
    
            cn.ConnectionString = "Server=.;Database=northwind;UID=sa;PWD=;"
            cn.Open()      
    
            
            'Initialize the SqlDataAdapter object by specifying a Select command 
            'that retrieves data from the sample table.
    
            da = New SqlDataAdapter("select * from CustTest order by CustId", cn)
    
    
            'Initialize the SqlCommandBuilder object to automatically generate and initialize
            'the UpdateCommand, InsertCommand and DeleteCommand properties of the SqlDataAdapter.
    
            cmdBuilder = New SqlCommandBuilder(da)
    
            'Populate the dataset by running the Fill method of the SqlDataAdapter.
            da.Fill(CustomersDataSet, "Customers")
    
           
            'Display the Update, Insert and Delete commands that were automatically generated
            'by the SqlCommandBuilder object. 
    
            Console.WriteLine("Update command Generated by the Command Builder : ")
            Console.WriteLine("==================================================")
            Console.WriteLine(cmdBuilder.GetUpdateCommand.CommandText)
            Console.WriteLine("         ")
    
            Console.WriteLine("Insert command Generated by the Command Builder : ")
            Console.WriteLine("==================================================")
            Console.WriteLine(cmdBuilder.GetInsertCommand.CommandText)
            Console.WriteLine("         ")        
    
            Console.WriteLine("Delete command Generated by the Command Builder : ")
            Console.WriteLine("==================================================")
            Console.WriteLine(cmdBuilder.GetDeleteCommand.CommandText)
            Console.WriteLine("         ")
    
            'Write out the value in the CustName field before updating the data using the DataSet.
            Console.WriteLine("Customer Name before Update : " & CustomersDataSet.Tables("Customers").Rows(0)("CustName"))
    
            'Modify the value of the CustName field.
            CustomersDataSet.Tables("Customers").Rows(0)("CustName") = "Jack"
    
            'Post the data modification to the database.
            da.Update(CustomersDataSet, "Customers")        
    
            Console.WriteLine("Customer Name updated successfully")
    
            'Close the database connection.
            cn.Close()
    
            Console.ReadLine()
    
        End Sub
    
    End Module
  3. Enregistrer, puis exécutez l'application. Une fenêtre de console s'ouvre et affiche la sortie suivante :
    Update command Generated by the Command Builder : 
    ==================================================
    UPDATE CustTest SET CustID = @p1 , CustName = @p2 WHERE ( CustID = @p3 AND CustName = @p4 )
             
    Insert command Generated by the Command Builder : 
    ==================================================
    INSERT INTO CustTest( CustID , CustName ) VALUES ( @p1 , @p2 )
             
    Delete command Generated by the Command Builder : 
    ==================================================
    DELETE FROM  CustTest WHERE ( CustID = @p1 AND CustName = @p2 )   
          
    Customer Name before Update : John
    Customer Name updated successfully
    						
  4. Appuyez sur n'importe quel touche pour fermer la fenêtre de console et arrêter l'application.

Exemple de code 2: créer manuellement et initialiser la propriété UpdateCommand

La sortie qui génère du code exemple 1 indique que la logique pour générer des commandes automatiquement pour des instructions UPDATE est basée sur accès concurrentiel optimiste. C'est-à-dire enregistrements ne sont pas verrouillés pour la modification et autres utilisateurs ou les processus peuvent modifier enregistrements chaque fois que.

Parce qu'un enregistrement peut être modifié après elle est renvoyée à partir de l'instruction SELECT, mais avant la mise à jour relevé est émis, l'instruction UPDATE qui est automatiquement générée contient une clause WHERE de sorte qu'une ligne est mise à jour uniquement si elle contient toutes les valeurs d'origine. Ceci est à éviter d'écraser nouvelles données. Si une instruction de mise à jour qui est automatiquement générée essaie de mettre à jour une ligne qui a été supprimée ou ne contient pas les valeurs d'origine qui se trouvent dans le DataSet , la commande n'affecte pas les enregistrements et une DBConcurrencyException exception est générée. Pour tester avec le code dans le code exemple 1, exécutez le code dans le débogueur Visual Studio, définissez un point d'arrêt après que le DataSet a été complété mais avant que la base de données est mise à jour, puis supprimer la ligne un dans la table à partir de l'Analyseur de requêtes SQL. L'appel de Update puis lève l'exception.

Si vous souhaitez que l'instruction UPDATE pour terminer indépendamment des valeurs d'origine, vous devez affecter explicitement la UpdateCommand de DataAdapter , vous fiez pas à génération commande automatique.

Pour créez manuellement et initialiser la propriété UpdateCommand de l'objet SqlDataAdapter utilisé dans le code exemple 1, procédez comme suit :
  1. Remplacez le code existant de Sub Main de Module1 dans l'application de console Visual Basic .NET que vous avez créé dans le Code Sample 1: Automatically Generated Commands section avec le code suivant :
    Dim cn As New SqlConnection()
    Dim CustomersDataSet As New DataSet()
    Dim da As SqlDataAdapter
    Dim dr As DataRow        
    Dim DAUpdateCmd As SqlCommand
    
    
    cn.ConnectionString = "Server=.;Database=northwind;UID=sa;PWD=;"
    cn.Open()
    
    da = New SqlDataAdapter("select * from CustTest order by CustId", cn)
    
    'Initialize the SqlCommand object that will be used as the DataAdapter's UpdateCommand.
    'Note that the WHERE clause uses only the CustId field to locate the record that is to be updated.
    
    DAUpdateCmd = New SqlCommand("Update CustTest set CustName = @pCustName where CustId = @pCustId", da.SelectCommand.Connection)
    
    
    'Create and append the parameters for the Update command.
    
    DAUpdateCmd.Parameters.Add(New SqlParameter("@pCustName", SqlDbType.VarChar))
    DAUpdateCmd.Parameters("@pCustName").SourceVersion = DataRowVersion.Current
    DAUpdateCmd.Parameters("@pCustName").SourceColumn = "CustName"
    
    DAUpdateCmd.Parameters.Add(New SqlParameter("@pCustId", SqlDbType.Int))
    DAUpdateCmd.Parameters("@pCustId").SourceVersion = DataRowVersion.Original
    DAUpdateCmd.Parameters("@pCustId").SourceColumn = "CustId"
    
    
    'Assign the SqlCommand to the UpdateCommand property of the SqlDataAdapter.
    da.UpdateCommand = DAUpdateCmd        
    
    da.Fill(CustomersDataSet, "Customers")        
    
    Console.WriteLine("Customer Name before Update : " & CustomersDataSet.Tables("Customers").Rows(0)("CustName"))
    
    CustomersDataSet.Tables("Customers").Rows(0)("CustName") = "Jack"
    da.Update(CustomersDataSet, "Customers")        
    
    Console.WriteLine("Customer Name updated successfully")
    
    cn.Close()
    Console.ReadLine()
    
    					
  2. Répétez les étapes 1 à 4 de la Code Sample 1: Automatically Generated Commands section. Notez qu'une exception DBConcurrencyException est plus générée.

Propriétés

Numéro d'article: 308055 - Dernière mise à jour: jeudi 15 juillet 2004 - Version: 2.3
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft ADO.NET (included with the .NET Framework)
  • Microsoft ADO.NET 1.1
  • Microsoft Visual Basic .NET 2002 Initiation
  • Microsoft Visual Basic .NET 2003 Initiation
Mots-clés : 
kbmt kbhowtomaster kbsqlclient kbsystemdata KB308055 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: 308055
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