Sie sind zurzeit offline. Es wird auf die erneute Herstellung einer Internetverbindung gewartet.

SO WIRD'S GEMACHT: Aktualisieren einer SQL Server-Datenbank mit dem SqlDataAdapter-Objekt in Visual Basic .NET

Dieser Artikel wurde zuvor veröffentlicht unter D308055
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
308055 HOW TO: Update a SQL Server Database Using the SqlDataAdapter Object in Visual Basic .NET
In Artikel 308507 wird dieses Thema für Microsoft Visual C# .NET behandelt.
In Artikel 320633 wird dieses Thema für Microsoft Visual J# .NET behandelt.
Hinweis: Die Verwendung der hier aufgeführten Informationen sowie Makro- oder Programmcodes geschieht auf Ihre eigene Verantwortung. Microsoft stellt Ihnen diese Informationen sowie Makro- und Programmlistings ohne Gewähr auf Richtigkeit, Vollständigkeit und/oder Funktionalität sowie ohne Anspruch auf Support zur Verfügung. Die zur Verfügung gestellten Makro- und Programmierungsbeispiele sollen lediglich exemplarisch die Funktionsweise des Beispiels aufzeigen.

Weitere Informationen zu den von Microsoft angebotenen Supportoptionen finden Sie unter folgender Internetadresse:
Zusammenfassung
Dieser Artikel enthält Microsoft Visual Basic .NET-Codebeispiele, die zeigen, wie man das Objekt SqlDataAdapter dazu verwenden kann, eine SQL Server-Datenbank mit Änderungen eines DataSet-Objekts zu aktualisieren, das mit Daten aus einer Tabelle in der Datenbank gefüllt wird.

Zurück zum Anfang

Voraussetzungen

In der folgenden Liste sind die empfohlene Hardware, Software, Netzwerkinfrastruktur und Kenntnisse sowie erforderliche Service Packs aufgeführt:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server oder Windows NT 4.0 Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server Version 7.0 oder höher
Dieser Artikel geht davon aus, dass Sie mit folgenden Themen vertraut sind:
  • Visual Basic .NET
  • ADO.NET-Grundlagen und -Syntax
Zurück zum Anfang

Beschreibung der Technik

Das Objekt SqlDataAdapter dient als Brücke zwischen einem ADO .NET-DataSet-Objekt (ADO = ActiveX Data Objects) und einer SQL Server-Datenbank. Es handelt sich um ein Zwischenobjekt, das ein ADO .NET-Dataset mit Daten aus einer SQL Server-Datenbank füllt und die Datenbank dann mit den Änderungen aktualisiert, die über das DataSet-Objekt an den Daten vorgenommen werden (Einfüge-, Aktualisierungs- und Löschoperationen).

Die Eigenschaften InsertCommand, UpdateCommand und DeleteCommand des Objekts SqlDataAdapter aktualisieren die Datenbank mit den Datenänderungen, die für ein DataSet-Objekt ausgeführt wurden. Diese Eigenschaften sind SqlCommand-Objekte, die die Transact-SQL-Befehle INSERT, UPDATE und DELETE spezifizieren, die die Änderungen für die Zieldatenbank bereitstellen. Die SqlCommand-Objekte, die diesen Eigenschaften zugeordnet sind, können manuell im Code erstellt werden oder automatisch über das Objekt SqlCommandBuilder generiert werden.

Das erste Codebeispiel in diesem Artikel zeigt, wie das Objekt SqlCommandBuilder dazu verwendet werden kann, die Eigenschaft UpdateCommand des Objekts SqlDataAdapter automatisch zu generieren. Im zweiten Beispiel wird ein Szenario verwendet, in dem die automatische Befehlsgenerierung nicht möglich ist. Es zeigt, wie man ein SqlCommand-Objekt manuell erstellt und als Eigenschaft UpdateCommand eines SqlDataAdapter-Objekts verwendet.

Zurück zum Anfang

Erstellen einer SQL Server-Beispieltabelle

So erstellen Sie eine SQL Server-Beispieltabelle, die Sie in den Visual Basic .NET-Codebeispielen in diesem Artikel verwenden können:
  1. Öffnen Sie den SQL Server Query Analyzer und stellen Sie eine Verbindung zu der Datenbank her, in der Sie die Beispieltabelle anlegen möchten. In den Codebeispielen in diesem Artikel wird die Datenbank "Northwind" verwendet, die mit SQL Server ausgeliefert wird.

    Achtung: Die hier aufgeführten Codebeispiele basieren auf den Beispieldatenbanken der englischsprachigen Versionen von Microsoft SQL Server oder Microsoft Access. Sie können diese Beispiele nicht mit den deutschsprachigen Beispieldatenbanken von SQL Server oder Access verwenden. Verwenden Sie entweder die englischsprachigen Versionen dieser Datenbanken, oder passen Sie die Codebeispiele so an, dass sie auf die deutschen Beispieldatenbanken und die deutschsprachigen Datenbankobjekte verweisen.

  2. Führen Sie folgende Transact-SQL-Anweisungen aus, um eine Beispieltabelle namens "CustTest" zu erstellen und einen Datensatz in der Tabelle einzufügen:
    Create Table CustTest( CustID int primary key, CustName varchar(20))Insert into CustTest values(1,'John')
Zurück zum Anfang

Codebeispiel 1 - Automatisch generierte Befehle

Wenn die SELECT-Anweisung, die Sie zum Abrufen der Daten zum Füllen eines DataSet-Objekts verwenden, auf einer einzigen Datenbanktabelle basiert, können Sie das Objekt CommandBuilder dazu verwenden, automatisch die Eigenschaften DeleteCommand, InsertCommand und UpdateCommand des DataAdapter-Objekts zu generieren. Dies vereinfacht und reduziert den Code, der für Einfüge-, Aktualisierungs- und Löschoperationen benötigt wird.

Als Minimalanforderung müssen Sie die Eigenschaft SelectCommand setzen, damit die automatische Befehlsgenerierung funktioniert. Das Tabellenschema, das von SelectCommand abgerufen wird, bestimmt die Syntax der automatisch generierten INSERT-, UPDATE- und DELETE-Anweisungen.

SelectCommand muss außerdem mindestens einen Primärschlüssel oder eine eindeutige Spalte zurückliefern. Wenn es keine gibt, wird ein Ausnahmefehler InvalidOperation generiert, und die Befehle werden nicht erzeugt.

So erstellen Sie eine Beispiel-Konsolenanwendung in Visual Basic .NET, die zeigt, wie man das Objekt SqlCommandBuilder zur automatischen Generierung der Objekteigenschaften DeleteCommand, InsertCommand, und UpdateCommandSqlCommand für ein SqlDataAdapter-Objekt verwenden kann:
  1. Erstellen Sie eine neue Visual Basic .NET-Konsolenanwendung.
  2. Ersetzen Sie den Standardinhalt von Module1 durch folgenden Code:
    Imports System.Data.SqlClientImports Console = System.ConsoleModule 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 SubEnd Module
  3. Speichern Sie die Anwendung und führen Sie sie aus. Ein Konsolenfenster wird geöffnet und zeigt folgende Ausgabedaten an:
    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 : JohnCustomer Name updated successfully
  4. Drücken Sie eine beliebige Taste, um das Konsolenfenster zu schließen und die Anwendung zu beenden.
Zurück zum Anfang

Codebeispiel 2 - Manuelles Erstellen und Initialisieren der UpdateCommand-Eigenschaft

Die von Codebeispiel 1 generierten Ausgabedaten zeigen, dass die Logik der automatischen Generierung von Befehlen für UPDATE-Anweisungen auf vollständiger Parallelität basiert. Das bedeutet, dass Datensätze nicht zur Bearbeitung gesperrt werden und jederzeit von anderen Benutzern oder Prozessen geändert werden können. Da ein Datensatz geändert werden kann, bevor er von der SELECT-Anweisung zurückgegeben wird, aber nachdem die UPDATE-Anweisung ausgegeben wird, enthält die automatisch generierte UPDATE-Anweisung eine WHERE-Klausel, damit eine Zeile nur dann aktualisiert wird, wenn sie alle Originalwerte enthält und nicht gelöscht wurde. Dadurch soll das Überschreiben neuer Daten verhindert werden. Wenn eine automatisch generierte Update-Anweisung versucht, eine Zeile zu aktualisieren, die gelöscht wurde oder nicht die im DataSet-Objekt vorhandenen Originalwerte enthält, hat der Befehl keinerlei Auswirkungen auf die Datensätze, und es wird eine DBConcurrencyException-Ausnahme erzeugt.

Wenn Sie möchten, dass die UPDATE-Anweisung ohne Berücksichtigung der Originalwerte ausgeführt wird, müssen Sie die Eigenschaft UpdateCommand für das Objekt DataAdapter explizit setzen, statt die automatische Befehlsgenerierung zu verwenden.

So erstellen und initialisieren Sie die Eigenschaft UpdateCommand des in Codebeispiel 1 verwendeten Objekts SqlDataAdapter manuell:
  1. Ersetzen Sie den Code im Abschnitt "Sub Main" von Module1 in der Visual Basic .NET-Konsolenanwendung, die Sie in Codebeispiel 1 erstellt haben, durch folgenden Code:
    Dim cn As New SqlConnection()Dim CustomersDataSet As New DataSet()Dim da As SqlDataAdapterDim dr As DataRow        Dim DAUpdateCmd As SqlCommandcn.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.CurrentDAUpdateCmd.Parameters("@pCustName").SourceColumn = "CustName"DAUpdateCmd.Parameters.Add(New SqlParameter("@pCustId", SqlDbType.Int))DAUpdateCmd.Parameters("@pCustId").SourceVersion = DataRowVersion.OriginalDAUpdateCmd.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. Führen Sie die Schritte 1 bis 4 im Abschnitt "Codebeispiel 1 - Automatisch generierte Befehle" durch. Jetzt wird keine DBConcurrencyException-Fehlermeldung mehr erzeugt.
Zurück zum Anfang
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.
Eigenschaften

Artikelnummer: 308055 – Letzte Überarbeitung: 09/26/2003 13:00:00 – Revision: 1.0

  • Microsoft ADO.NET 1.0
  • Microsoft ADO.NET 1.1
  • Microsoft Visual Basic .NET 2002 Standard Edition
  • Microsoft Visual Basic .NET 2003 Standard Edition
  • kbhowtomaster kbgrpdsvbdb KB308055
Feedback
ps://c.microsoft.com/ms.js" '="">