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ştirin
DataSet
. Bu makalede, nesnenin veritabanındaki bir tablodanSqlDataAdapter
alınan verilerle doldurulmuş bir nesnedeDataSet
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::SqlClient
ifade eder.
SqlDataAdapter nesnesi ve özellikleri
nesnesinin InsertCommand
SqlDataAdapter
, UpdateCommand
ve 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
, UPDATE
ve 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 UpdateCommand
SqlDataAdapter
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:
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.
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
, InsertCommand
ve UpdateCommand
özelliklerini otomatik olarak oluşturmak DeleteCommand
için nesnesinden DataAdapter
yararlanabilirsiniz. Bu, , UPDATE
ve işlemlerini gerçekleştirmek INSERT
iç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
, UPDATE
ve 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 , DeleteCommand
ve 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:
Visual Studio .NET'i başlatın ve ardından yeni bir Yönetilen C++ uygulaması oluşturun. updateSQL olarak adlandır.
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; }
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.
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
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 DataSet
bulunan ö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:
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;
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;";
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.
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
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin