Visual C++ içinde SqlDataAdapter nesnesini kullanarak bir SQL Server veritabanını güncelleştirme

Bu makalede, Microsoft Visual C++'da bir SQL Server veritabanını güncelleştirmek için nesnesinin nasıl kullanılacağı SqlDataAdapter anlat güncelleştirilir.

Orijinal ürün sürümü: Visual C++
Özgün KB numarası: 308510

Özet

nesnesi, SqlDataAdapter bir ADO.NET nesnesi ile SQL Server DataSet veritabanı arasında köprü görevi görür. Bu, aşağıdakileri yapmak için kullanabileceğiniz bir aracı nesnedir:

  • bir ADO.NET DataSet SQL Server veritabanından alınan verilerle doldurun.
  • kullanarak veritabanında yapılan değişiklikleri (ekler, güncelleştirmeler, silmeler) yansıtacak şekilde veritabanını güncelleştirinDataSet. Bu makalede, nesnenin veritabanındaki bir tablodan SqlDataAdapter alınan verilerle doldurulmuş bir nesnede DataSet yürütülen veri değişiklikleriyle SQL Server veritabanını güncelleştirmek için nasıl kullanılabileceğini gösteren Visual C++ .NET kod örnekleri sağlanır.

Bu makale, .NET Framework Sınıf Kitaplığı ad alanını System::Data::SqlClientifade eder.

SqlDataAdapter nesnesi ve özellikleri

nesnesinin InsertCommandSqlDataAdapter , UpdateCommandve DeleteCommand özellikleri, veritabanını bir DataSet nesne üzerinde yürütülen veri değişiklikleriyle güncelleştirmek için kullanılır. Bu özelliklerin her biri, değişiklikleri hedef veritabanına göndermek DataSet için kullanılan ilgili INSERT, UPDATEve DELETE TSQL komutlarını belirten nesnelerdirSqlCommand. SqlCommand Bu özelliklere atanan nesneler kod içinde el ile oluşturulabilir veya nesnesi kullanılarak SqlCommandBuilder otomatik olarak oluşturulabilir.

Bu makaledeki ilk kod örneği, nesnenin SqlCommandBuilder özelliğini otomatik olarak oluşturmak için nesnenin UpdateCommandSqlDataAdapter nasıl kullanılabileceğini gösterir. İkinci örnek, otomatik komut oluşturmanın kullanılamadığı bir senaryo kullanır ve bu nedenle bir nesneyi el ile oluşturup bir SqlCommand nesnenin SqlDataAdapter özelliği olarak UpdateCommand kullanabileceğiniz işlemi gösterir.

Örnek SQL Server tablosunu oluşturma

Bu makalede belgelenen Visual C++ .NET kod örneklerinde kullanılacak örnek bir SQL Server tablosu oluşturmak için şu adımları izleyin:

  1. SQL Server Sorgu Çözümleyicisi'ni açın ve örnek tabloyu oluşturmak istediğiniz veritabanına bağlanın. Bu makaledeki kod örnekleri, SQL Server ile birlikte gelen Northwind veritabanını kullanır.

  2. Aşağıdaki T-SQL deyimlerini yürüterek CustTest adlı bir örnek tablo oluşturun ve sonra bu tabloya bir kayıt ekleyin.

    Create Table CustTest
    (
        CustID int primary key,
        CustName varchar(20)
    )
    Insert into CustTest values(1,'John')
    

Kod örneği 1: Otomatik olarak oluşturulan komutlar

SELECT'yi doldurmak DataSet için kullanılan verileri almak için kullanılan deyim tek bir veritabanı tablosunu temel alıyorsa, nesnesinin CommandBuilder , InsertCommandve UpdateCommand özelliklerini otomatik olarak oluşturmak DeleteCommandiçin nesnesinden DataAdapteryararlanabilirsiniz. Bu, , UPDATEve işlemlerini gerçekleştirmek INSERTiçin gereken kodu basitleştirir ve DELETE azaltır.

En düşük gereksinim olarak, otomatik komut oluşturma özelliğinin SelectCommand çalışması için ayarlamanız gerekir. tarafından SelectCommand alınan tablo şeması, otomatik olarak oluşturulan INSERT, UPDATEve DELETE deyimlerinin söz dizimini belirler.

ayrıca SelectCommand en az bir birincil anahtar veya benzersiz sütun döndürmelidir. Hiçbiri yoksa, bir InvalidOperation özel durum oluşturulur ve komutlar oluşturulmaz.

Bir nesnenin , DeleteCommandve UpdateCommand SqlCommand nesne özelliklerini otomatik olarak oluşturmak InsertCommandüzere nesnesinin nasıl kullanılacağını SqlCommandBuilder gösteren örnek bir SqlDataAdapter Visual C++ .NET konsol uygulaması oluşturmak için şu adımları izleyin:

  1. Visual Studio .NET'i başlatın ve ardından yeni bir Yönetilen C++ uygulaması oluşturun. updateSQL olarak adlandır.

  2. Aşağıdaki kodu kopyalayıp updateSQL.cpp yapıştırın (varsayılan içeriğini değiştirerek):

    #include "stdafx.h"
    
    #using < mscorlib.dll>
    #using < System.dll>
    #using < System.Data.dll>
    #using < System.Xml.dll>
    
    using namespace System;
    using namespace System::Data;
    using namespace System::Data::SqlClient;
    
    #ifdef _UNICODE
        int wmain(void)
    #else
        int main(void)
    #endif
    {
        SqlConnection *cn = new SqlConnection();
        DataSet *CustomersDataSet = new DataSet();
        SqlDataAdapter *da;
        SqlCommandBuilder *cmdBuilder;
    
        //Set the connection string of the SqlConnection object to connect
        //to the SQL Server database in which you created the sample
        //table in Section 1.0
        cn->ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
        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 executing 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
        DataRow *rowCust = CustomersDataSet->Tables->Item["Customers"]->Rows->Item[0];
        Console::WriteLine("Customer Name before Update : {0} ", rowCust->Item["CustName"]);
    
        //Modify the value of the CustName field
        String *newStrVal = new String("Jack");
        rowCust->set_Item("CustName", newStrVal);
    
        //Modify the value of the CustName field again
        String *newStrVal2 = new String("Jack2");
        rowCust->set_Item("CustName", newStrVal2);
    
        //Post the data modification to the database
        da->Update(CustomersDataSet, "Customers");
    
        Console::WriteLine("Customer Name after Update : {0} ", rowCust->Item["CustName"]);
    
        //Close the database connection
        cn->Close();
    
        //Pause
        Console::ReadLine();
        return 0;
    }
    
  3. 2. adımda kopyalayıp yapıştırdığınız kodda, SQL Server bilgisayarınıza düzgün bir şekilde bağlanmak için bağlantı dizesi kodunun satırını aşağıdaki gibi değiştirin:

    cn.ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
    

    Bu kodu çalıştırdıktan sonra SQL Server yüklemenize bağlanabilir ve sonra oturum açabilirsiniz.

  4. Uygulamayı kaydedin ve yürütin. Bir konsol penceresi açılır ve aşağıdaki çıkış görüntülenir:

    Update command generated by the Command Builder:
    ==================================================
    UPDATE CustTest SET CustID = @p1 , CustName = @p2 WHERE ( (CustID = @p3)
    AND ((CustName IS NULL AND @p4 IS NULL)
    OR (CustName = @p5)))
    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 IS NULL AND @p2 IS NULL)
    OR (CustName = @p3)))
    Customer Name before Update : John
    Customer Name after Update : Jack2
    
  5. Konsol penceresini kapatmak ve uygulamayı durdurmak için herhangi bir tuşa basın.

Kod örneği 2: UpdateCommand özelliğini el ile oluşturma ve başlatma

Kod örneği 1 tarafından oluşturulan çıkış, deyimler için UPDATE otomatik olarak komut oluşturma mantığının iyimser eşzamanlılığa dayandığını gösterir. Başka bir deyişle, kayıtlar düzenleme için kilitlenmez ve herhangi bir zamanda diğer kullanıcılar veya işlemler tarafından değiştirilebilir. Bir kayıt, deyiminden döndürüldükten sonra ancak deyimi verilmeden önce değiştirilmiş olabileceğindenSELECT, otomatik olarak oluşturulan UPDATE deyim bir WHERE yan tümce içerir, böylece bir satır yalnızca tüm özgün değerleri içeriyorsa ve silinmemişse güncelleştirilir.UPDATE Bu, yeni verilerin üzerine yazılmamasını sağlamak için yapılır. Otomatik olarak oluşturulan bir güncelleştirmenin silinmiş olan veya içinde DataSetbulunan özgün değerleri içermeyen bir satırı güncelleştirmeyi denediği durumlarda, komut hiçbir kaydı etkilemez ve bir DBConcurrencyException oluşturulur.

öğesinin UPDATE özgün değerlerden bağımsız olarak tamamlanmasını istiyorsanız, otomatik komut oluşturmayı kullanmak yerine için DataAdapter öğesini açıkça ayarlamanız UpdateCommand gerekir.

Kod örneği 1'de kullanılan nesnenin SqlDataAdapter özelliğini el ile oluşturmak ve başlatmak UpdateCommand için şu adımları izleyin:

  1. Kod örneği 1'de Main() oluşturulan C++ uygulamasındaki UpdateSQL.cpp dosyasındaki işleve aşağıdaki kodu kopyalayıp yapıştırın (var olan kodun üzerine yazma):

    SqlConnection *cn = new SqlConnection();
    DataSet *CustomersDataSet = new DataSet();
    SqlDataAdapter *da;
    SqlCommand *DAUpdateCmd;
    cn->ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
    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
    //Notice that the WHERE clause uses only the CustId field to locate the record 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->Item["@pCustName"]->SourceVersion = DataRowVersion::Current;
    DAUpdateCmd->Parameters->Item["@pCustName"]->SourceColumn = "CustName";
    
    DAUpdateCmd->Parameters->Add(new SqlParameter("@pCustId", SqlDbType::Int));
    DAUpdateCmd->Parameters->Item["@pCustId"]->SourceVersion = DataRowVersion::Original;
    DAUpdateCmd->Parameters->Item["@pCustId"]->SourceColumn = "CustId";
    
    //Assign the SqlCommand to the UpdateCommand property of the SqlDataAdapter
    da->UpdateCommand = DAUpdateCmd;
    da->Fill(CustomersDataSet, "Customers");
    
    DataRow *rowCust = CustomersDataSet->Tables->Item["Customers"]->Rows->Item[0];
    Console::WriteLine("Customer Name before Update : {0} ", rowCust->Item["CustName"]);
    
    //Modify the value of the CustName field
    String *newStrVal = new String("Jack");
    rowCust->set_Item("CustName", newStrVal);
    
    //Modify the value of the CustName field again
    String *newStrVal2 = new String("Jack2");
    rowCust->set_Item("CustName", newStrVal2);
    
    da->Update(CustomersDataSet, "Customers");
    Console::WriteLine("Customer Name after Update : {0} ", rowCust->Item["CustName"]);
    cn->Close();
    Console::ReadLine();
    return 0;
    
  2. Yukarıdaki kod örneğindeki bağlantı dizesi kodu satırını aşağıdaki gibi değiştirin:

    cn.ConnectionString = "Server=server;Database=northwind;UID=login;PWD=password;";
    
  3. Bu makalenin kod örneği 1 bölümünde kodu zaten çalıştırdıysanız, CustTesttablonuzu SQL Server'de açın ve ilk kayıttaki CustName değerini Yeniden John olarak değiştirin.

  4. Uygulamayı kaydedin ve yürütin. Bir konsol penceresi açılır ve aşağıdaki çıkış görüntülenir:

    Customer Name before Update : John
    Customer Name after Update : Jack2