Jak aktualizovat databázi serveru SQL pomocí objektu SqlDataAdapter v jazyce Visual Basic .NET

Microsoft Visual C# .NET verzi tohoto článku naleznete v tématu 308507 .

Microsoft Visual J# .NET verzi tohoto článku naleznete v tématu 320633 .


Tento článek se týká následujících oborů názvů knihovny tříd rozhraní.NET Framework společnosti Microsoft:

  • System.Data.SqlClient

V TOMTO ÚKOLU

Souhrn

Tento článek obsahuje ukázky kódu Microsoft Visual Basic .NET, které ukazují, jak lze aktualizovat data změny, které jsou v objektu DataSet , který je naplněn daty z tabulky v databázi databáze serveru SQL Server pomocí objektu SqlDataAdapter .


Požadavky

Následující seznam obsahuje doporučený hardware, software, síťovou infrastrukturu, dovednosti a knowledge a aktualizace service Pack, které jsou požadovány:

  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server nebo Windows NT 4.0 Server
  • Microsoft Visual Studio .NET
  • Microsoft SQL Server verze 7.0 nebo vyšší
Tento článek předpokládá, že jste obeznámeni s následující témata:

  • Visual Basic .NET
  • Základy technologie ADO.NET a syntaxe

Popis techniky

Objekt SqlDataAdapter slouží jako most mezi objekt ADO.NET DataSet a databáze serveru SQL Server. SqlDataAdapter je zprostředkující objekt, který naplní objekt ADO.NET DataSet s daty, která je načtena z databáze serveru SQL Server a poté aktualizuje databázi tak, aby odrážely změny (například vloží, aktualizace a odstranění) provedené dat pomocí objekt DataSet .

Událost InsertCommand, UpdateCommanda DeleteCommand vlastnosti SqlDataAdapter objekt aktualizovat data změny, které jsou spuštěny v objektu DataSet databáze. Tyto vlastnosti jsou SqlCommand objekty, které určují vkládání, aktualizace a odstranění Transact-SQL příkazy, které se používají k účtování změn datové sady do cílové databáze. SqlCommand objekty, které jsou přiřazeny tyto vlastnosti lze vytvořit ručně v kódu nebo pomocí SqlCommandBuilder objekt automaticky generovány.

První ukázka kódu v tomto článku demonstruje použití SqlCommandBuilder objekt automaticky generovat událost UpdateCommand vlastnost SqlDataAdapter objekt. Druhý vzorek používá scénář, kdy nelze použít příkaz Automatické generování. Druhý vzorek ukazuje, jak lze ručně vytvořit a použít SqlCommand objekt jako událost UpdateCommand vlastnost SqlDataAdapter objekt.

Vytvořit ukázkové tabulce serveru SQL


Chcete-li vytvořit ukázkovou tabulku SQL Server, který lze použít ve vzorcích kódu Visual Basic .NET, které jsou popsány v tomto článku, postupujte takto:

  1. Spusťte nástroj SQL Query Analyzer a připojte se k databázi, ve kterém chcete vytvořit ukázkovou tabulku. Ukázky kódu v tomto článku databáze Northwind , která je součástí serveru SQL Server.
  2. Chcete-li vytvořit ukázkovou tabulku s názvem CustTest a vložit záznam do tabulky, spusťte následující příkazy jazyka Transact-SQL:
    Create Table CustTest(
    CustID int primary key,
    CustName varchar(20)
    )

    Insert into CustTest values(1,'John')

Ukázka kódu 1: Automaticky generovány příkazy

Pokud příkaz SELECT, který použijete k načtení dat, který se naplní objekt DataSet je založena na jedné databázové tabulky, můžete použít CommandBuilder objekt automaticky generovat událost DeleteCommand, událost InsertCommanda událost UpdateCommand vlastnosti vlastnost DataAdapter. To zjednodušuje a snižuje množství kódu, který je povinen provádět operace INSERT, UDPATE a DELETE.

Jako minimální požadavek musíte nastavit SelectCommand vlastnost automaticky generovat příkazy. Schéma tabulky, který načte SelectCommand určuje syntaxe vkládání, aktualizace a odstranění příkazy, které jsou automaticky generovány.

SelectCommand musí také vrátit alespoň jeden primární klíč nebo jedinečný sloupec. Pokud nejsou přítomny, je vygenerována výjimka InvalidOperation a nejsou generovány příkazy.

Chcete-li vytvořit vzorové aplikace konzoly Visual Basic .NET, která demonstruje použití SqlCommandBuilder objekt automaticky generovat událost DeleteCommand, událost InsertCommanda událost UpdateCommand vlastnosti SqlCommand objekt pro SqlDataAdapter objekt, postupujte takto:

  1. Vytvořte novou konzolovou aplikaci Visual Basic .NET, postupujte takto:
    1. Spusťte aplikaci Visual Studio .NET.
    2. V nabídce soubor přejděte na příkaz Nový a klepněte na příkaz projekt.
    3. Klepněte na tlačítko Projekty jazyka Visual Basic v části Typy projektua potom klepněte na tlačítko Aplikace konzoly v části šablony.
  2. Výchozí obsah Module1 nahraďte následující kód:
    Imports System.Data.SqlClientImports 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. Uložte a spusťte aplikaci. Okna konzoly se otevře a zobrazí se následující výstup:
    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. Stisknutím libovolné klávesy zavřete okna konzoly a ukončit aplikace.

Ukázkový kód 2: Ruční vytvoření a inicializace událost UpdateCommand vlastnost

Výstup, který generuje kód vzorku 1 označuje, že logiku pro generování příkazů pro příkazy aktualizace automaticky vychází z optimistického řízení souběžnosti. Záznamy nejsou uzamčen pro úpravy, a jiní uživatelé nebo procesy můžete upravit záznamy kdykoli.

Protože záznam lze upravit po je vrácena z příkazu SELECT, ale před aktualizací je vydáno prohlášení, obsahuje příkaz UPDATE, která je automaticky generována klauzule WHERE takže řádek je aktualizován pouze v případě, že obsahuje všechny původní hodnoty. Toto je zabránit přepsání nová data. Pokud příkaz UPDATE, který je generován automaticky pokusí aktualizovat řádek, který byl odstraněn nebo neobsahuje původní hodnoty, které se nacházejí v objekt DataSet, příkaz nemá vliv na žádné záznamy a je vygenerována výjimka DBConcurrencyException. Otestovat pomocí kódu v kódu vzorek 1, spustit kód v Visual Studio Debugger nastavit zarážku po DataSet naplnil, ale před aktualizací databáze a potom odstraňte jeden řádek v tabulce z SQL Query Analyzer. Volání aktualizace potom vyvolá výjimku.

Pokud chcete příkaz UPDATE k dokončení bez ohledu na původní hodnoty, musíte explicitně nastavit pro vlastnost DataAdapter UpdateCommand a není závislý na příkaz Automatické generování.


Chcete-li ručně vytvořit a inicializace událost UpdateCommand vlastnost SqlDataAdapter objekt, který je používán 1 ukázkový kód, postupujte takto:

  1. Nahraďte existující kód v Sub Main Module1 v aplikaci Visual Basic .NET konzoly, kterou jste vytvořili v kód Příklad 1: automaticky generovány příkazy oddíl s následujícím kódem:
    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. Opakujte kroky 1 až 4 v kód Příklad 1: automaticky generovány příkazy oddílu. Poznámka: nebude vygenerována výjimka DBConcurrencyException.
Vlastnosti

ID článku: 308055 - Poslední kontrola: 20. 1. 2017 - Revize: 2

Váš názor