Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir: .NET Framework
.NET
.NET Standard
Update yöntemi, DataAdapter'den DataSet veri kaynağına yapılan değişiklikleri çözmek için çağrılır.
Update yöntemi, tıpkı Fill yöntemi gibi, bağımsız değişken olarak bir DataSet örneğini ve isteğe bağlı bir DataTable nesnesi veya DataTable adı alır. Örnek DataSet , yapılan değişiklikleri içeren örnektir DataSet ve DataTable değişikliklerin alındığı tabloyu tanımlar.
DataTable belirtilmezse, DataSet içindeki ilk DataTable kullanılır.
yöntemini çağırdığınızda Update , DataAdapter yöntemi yapılan değişiklikleri analiz eder ve uygun komutu yürütür (INSERT, UPDATE veya DELETE). Bir değişiklikle karşılaştığında DataAdapter, değişikliği işlemek için DataRow, InsertCommand veya UpdateCommand kullanır. DeleteCommand
Bu özellikler, tasarım zamanında komut söz dizimi belirterek ve mümkün olduğunda saklı yordamları kullanarak ADO.NET uygulamanızın performansını en üst düzeye çıkarmanızı sağlar. komutunu çağırmadan Updateönce komutları açıkça ayarlamanız gerekir. Eğer Update çağrılır ve belirli bir güncelleştirme için uygun komut yoksa (örneğin, silinen satırlar için DeleteCommand yoksa), bir istisna fırlatılır.
Önemli
SQL Server saklı yordamlarını kullanarak DataAdapter ile verileri düzenliyor veya siliyorsanız, saklı yordam tanımında SET NOCOUNT ON kullanılmadığından emin olun. Bu durum, etkilenen satır sayısının sıfır olmasına yol açar ve DataAdapter bunu bir eşzamanlılık çakışması olarak yorumlar. Bu olayda bir DBConcurrencyException fırlatılır.
Komut parametreleri, bir SQL deyiminin veya saklı yordamın giriş ve çıkış değerlerini, DataSet içindeki her bir değiştirilen satır için belirtmek amacıyla kullanılabilir. Daha fazla bilgi için bkz. DataAdapter parametreleri.
Uyarı
Bir satır silme ile satırı DataTable kaldırma arasındaki farkı anlamak önemlidir.
Remove veya RemoveAt yöntemini çağırdığınızda, satır hemen kaldırılır. Arka uç veri kaynağındaki karşılık gelen satırlar, DataTable veya DataSet bir DataAdapter'e geçirir ve Update çağrısını yaparsanız etkilenmeyecektir. yöntemini kullandığınızda, satır DataTable içinde kalır ve silinmek için işaretlenir. Eğer DataTable veya DataSet bir DataAdapter'a geçirir ve Update çağrısı yaparsanız, arka plan veri kaynağındaki karşılık gelen satır silinir.
DataTable ile eşleşiyorsa veya tek bir veritabanı tablosundan oluşturulduysa, DbCommandBuilder nesnesinden yararlanarak DeleteCommand, InsertCommand ve UpdateCommand nesnelerini, DataAdapter için otomatik olarak oluşturabilirsiniz. Daha fazla bilgi için bkz. CommandBuilders ile komut oluşturma.
Değerleri DataSet ile eşlemek için UpdatedRowSource kullanma
Bir DataAdapter metodunun Update çağrısını takiben, SqlCommand nesnesinin UpdatedRowSource özelliğini kullanarak, veri kaynağından döndürülen değerlerin DataTable ile nasıl eşleneceğini kontrol edebilirsiniz. Özelliği UpdatedRowSource, numaralandırma değerlerinden birine ayarlayarak, UpdateRowSource komutları tarafından döndürülen çıkış parametrelerinin yok sayılıp sayılmayacağını veya DataAdapter içindeki değiştirilmiş satıra uygulanıp uygulanmayacağını kontrol edebilirsiniz.DataSet Ayrıca, döndürülen ilk satırın (varsa) içindeki DataTabledeğiştirilen satıra uygulanıp uygulanmayacağını da belirtebilirsiniz.
Aşağıdaki tabloda, UpdateRowSource sıralamasının farklı değerlerinin DataAdapter ile kullanılan bir komutun davranışını nasıl etkilediği açıklanmaktadır.
| UpdatedRowSource Numaralandırması | Description |
|---|---|
| Both | Hem çıkış parametreleri hem de döndürülen sonuç kümesinin ilk satırı içindeki DataSetdeğiştirilen satıra eşlenebilir. |
| FirstReturnedRecord | Yalnızca döndürülen sonuç kümesinin ilk satırındaki veriler içindeki DataSetdeğiştirilen satıra eşlenebilir. |
| None | Döndürülen sonuç kümesinin sonuç parametreleri veya satırları göz ardı edilir. |
| OutputParameters | Yalnızca çıkış parametreleri DataSet içindeki değiştirilen satıra eşlenebilir. |
Update yöntemi, veri kaynağındaki değişikliklerinizi çözer; ancak diğer istemciler son doldurduğunuzdan bu yana veri kaynağındaki DataSetverileri değiştirmiş olabilir. Geçerli verilerle DataSet yenilemek için DataAdapter ve Fill yöntemlerini kullanın. Tabloya yeni satırlar eklenir ve güncelleştirilmiş bilgiler mevcut satırlara eklenir.
Fill yöntemi, DataSet içindeki satırların ve SelectCommand tarafından döndürülen satırların birincil anahtar değerlerini inceleyerek yeni bir satır eklenip eklenmeyeceğini veya mevcut bir satırın güncellenip güncellenmeyeceğini belirler. yöntemi, Fill tarafından döndürülen sonuçlardaki bir satırın birincil anahtar değeri DataSet'deki birincil anahtar değeriyle eşleşirse, mevcut satırı SelectCommand tarafından döndürülen satırdaki bilgilerle günceller ve mevcut satırın RowState değerini Unchanged'e ayarlar.
SelectCommand tarafından döndürülen bir satırın, DataSet içindeki satırların birincil anahtar değerlerinden hiçbiriyle eşleşmeyen bir birincil anahtar değeri varsa, Fill yöntemi RowStateUnchanged değerine sahip yeni bir satır ekler.
Uyarı
Eğer SelectCommand, bir OUTER JOIN sonucunu döndürürse, DataAdapter, elde edilen DataTable için bir PrimaryKey değeri ayarlamaz. Yinelenen satırların doğru çözümlenmesi için PrimaryKey adresini kendiniz tanımlamalısınız.
yöntemini çağırırken Update oluşabilecek özel durumları işlemek için, RowUpdated olayını kullanarak satır güncelleştirme hatalarına oluştukları sırada yanıt verebilir (bkz. DataAdapter olaylarını işleme) veya ContinueUpdateOnError öğesini, Update çağrısından önce true olarak ayarlayabilir ve güncelleştirme tamamlandığında belirli bir satırın RowError özelliğinde depolanan hata bilgilerine yanıt verebilirsiniz.
Uyarı
AcceptChanges
DataSet, DataTable veya DataRow çağrılması, bir DataRow için tüm Original değerlerinin Current değerleriyle üzerine yazılmasına neden olur DataRow. Satırı benzersiz olarak tanımlayan alan değerleri değiştirilmişse, değerler çağrıldıktan AcceptChangesOriginal sonra veri kaynağındaki değerlerle eşleşmez.
AcceptChanges bir `DataAdapter`'nin `Update` yöntemine yapılan çağrı sırasında her satır için otomatik olarak çağrılır. Update yöntemine yapılan bir çağrıda özgün değerleri korumak için önce AcceptChangesDuringUpdate özelliğini DataAdapter içindeki false olarak ayarlayabilir veya RowUpdated olayı için bir olay işleyicisi oluşturup Status'i SkipCurrentRow olarak ayarlayabilirsiniz. Daha fazla bilgi için bkz . DataAdapter Olaylarını İşleme.
Aşağıdaki örneklerde, bir DataAdapter öğesini açıkça belirleyerek UpdateCommand ve Update yöntemini çağırarak değiştirilen satırlarda güncelleştirme işlemlerinin nasıl gerçekleştirildiği gösterilmektedir.
Uyarı
WHERE clause içindeki UPDATE statement'de belirtilen parametre, Original değerini kullanacak şekilde SourceColumn ayarlanmıştır. Bu önemlidir çünkü Current değer değiştirilmiş olabilir ve veri kaynağındaki değerle eşleşmeyebilir.
Original değeri, veri kaynağından DataTable öğesini doldurmak için kullanılan değerdir.
private static void AdapterUpdate(string connectionString)
{
using (SqlConnection connection =
new SqlConnection(connectionString))
{
SqlDataAdapter dataAdpater = new SqlDataAdapter(
"SELECT CategoryID, CategoryName FROM Categories",
connection);
dataAdpater.UpdateCommand = new SqlCommand(
"UPDATE Categories SET CategoryName = @CategoryName " +
"WHERE CategoryID = @CategoryID", connection);
dataAdpater.UpdateCommand.Parameters.Add(
"@CategoryName", SqlDbType.NVarChar, 15, "CategoryName");
SqlParameter parameter = dataAdpater.UpdateCommand.Parameters.Add(
"@CategoryID", SqlDbType.Int);
parameter.SourceColumn = "CategoryID";
parameter.SourceVersion = DataRowVersion.Original;
DataTable categoryTable = new DataTable();
dataAdpater.Fill(categoryTable);
DataRow categoryRow = categoryTable.Rows[0];
categoryRow["CategoryName"] = "New Beverages";
dataAdpater.Update(categoryTable);
Console.WriteLine("Rows after update.");
foreach (DataRow row in categoryTable.Rows)
{
{
Console.WriteLine("{0}: {1}", row[0], row[1]);
}
}
}
}
AutoIncrement sütunları
Veri kaynağınızdaki tablolarda otomatik artış sütunları varsa, sütunları şu yöntemlerle doldurabilirsiniz: saklı yordamın çıkış parametresi olarak otomatik artış değerini döndürüp bunu tablodaki bir sütuna eşleyerek; saklı yordam veya SQL deyimi ile döndürülen sonuç kümesinin ilk satırındaki otomatik artış değerini döndürerek; veya DataAdapter öğesinin RowUpdated olayını kullanarak ek bir SELECT deyimi yürütmek. Daha fazla bilgi ve örnek için bkz. Kimlik veya otomatik sayı değerlerini alma.
Eklemelerin, güncelleştirmelerin ve silmelerin sıralanması
Çoğu durumda, aracılığıyla DataSet yapılan değişikliklerin veri kaynağına gönderilme sırası önemlidir. Örneğin, var olan bir satır için birincil anahtar değeri güncelleştirilir ve yeni birincil anahtar değeri yabancı anahtar olarak yeni bir satır eklenirse, ekleme işleminden önce güncelleştirmeyi işlemek önemlidir.
Select yöntemini DataTable kullanarak belirli bir RowState ile satırlara başvuran bir DataRow dizisini döndürebilirsiniz. Daha sonra döndürülen DataRow diziyi Update yöntemine DataAdapter geçirerek değiştirilen satırları işleyebilirsiniz. Güncelleştirilecek satırların bir alt kümesini belirterek, eklemelerin, güncelleştirmelerin ve silmelerin işlenme sırasını denetleyebilirsiniz.
Example
Örneğin, aşağıdaki kod önce tablonun silinen satırlarının, ardından güncelleştirilmiş satırların ve ardından eklenen satırların işlenmesini sağlar.
// Assumes that dataSet and adapter are valid objects.
DataTable table = dataSet.Tables["Customers"];
// First process deletes.
adapter.Update(table.Select(null, null, DataViewRowState.Deleted));
// Next process updates.
adapter.Update(table.Select(null, null,
DataViewRowState.ModifiedCurrent));
// Finally, process inserts.
adapter.Update(table.Select(null, null, DataViewRowState.Added));
Veri almak ve güncelleştirmek için DataAdapter kullanma
Verileri almak ve güncelleştirmek için DataAdapter kullanabilirsiniz.
Örnek, veritabanındaki verileri kopyalamak için kullanır
DataAdapter.AcceptChangesDuringFill. Özellik false olarak ayarlanırsa, tablo doldurulurken AcceptChanges çağrılmaz ve yeni eklenen satırlar eklenen satırlar olarak kabul edilir. Bu nedenle örnek, yeni satırları veritabanına eklemek için bu satırları kullanır.Örnekler, kaynak tablo ile DataTable arasındaki eşlemeyi tanımlamak için
DataAdapter.TableMappings'yi kullanır.Örnek,
DataAdapter.FillLoadOption'yı kullanarak bağlıcıyı DbDataReader'dan DataTable'ı nasıl doldurduğunu belirlemek için kullanır. DataTable oluşturduğunuzda, yalnızca özelliği LoadOption.Upsert veya LoadOption.PreserveChanges olarak ayarlayarak veritabanından geçerli sürüme veya özgün sürüme veri yazabilirsiniz.Örnek,
DbDataAdapter.UpdateBatchSizekullanarak toplu işlemler gerçekleştirip tabloyu güncelleştirir.
Örneği derleyip çalıştırmadan önce örnek veritabanını oluşturmanız gerekir:
USE [master]
GO
CREATE DATABASE [MySchool]
GO
USE [MySchool]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Course]([CourseID] [nvarchar](10) NOT NULL,
[Year] [smallint] NOT NULL,
[Title] [nvarchar](100) NOT NULL,
[Credits] [int] NOT NULL,
[DepartmentID] [int] NOT NULL,
CONSTRAINT [PK_Course] PRIMARY KEY CLUSTERED
(
[CourseID] ASC,
[Year] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Department]([DepartmentID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
[Budget] [money] NOT NULL,
[StartDate] [datetime] NOT NULL,
[Administrator] [int] NULL,
CONSTRAINT [PK_Department] PRIMARY KEY CLUSTERED
(
[DepartmentID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
GO
INSERT [dbo].[Course] ([CourseID], [Year], [Title], [Credits], [DepartmentID]) VALUES (N'C1045', 2012, N'Calculus', 4, 7)
INSERT [dbo].[Course] ([CourseID], [Year], [Title], [Credits], [DepartmentID]) VALUES (N'C1061', 2012, N'Physics', 4, 1)
INSERT [dbo].[Course] ([CourseID], [Year], [Title], [Credits], [DepartmentID]) VALUES (N'C2021', 2012, N'Composition', 3, 2)
INSERT [dbo].[Course] ([CourseID], [Year], [Title], [Credits], [DepartmentID]) VALUES (N'C2042', 2012, N'Literature', 4, 2)
SET IDENTITY_INSERT [dbo].[Department] ON
INSERT [dbo].[Department] ([DepartmentID], [Name], [Budget], [StartDate], [Administrator]) VALUES (1, N'Engineering', 350000.0000, CAST(0x0000999C00000000 AS DateTime), 2)
INSERT [dbo].[Department] ([DepartmentID], [Name], [Budget], [StartDate], [Administrator]) VALUES (2, N'English', 120000.0000, CAST(0x0000999C00000000 AS DateTime), 6)
INSERT [dbo].[Department] ([DepartmentID], [Name], [Budget], [StartDate], [Administrator]) VALUES (4, N'Economics', 200000.0000, CAST(0x0000999C00000000 AS DateTime), 4)
INSERT [dbo].[Department] ([DepartmentID], [Name], [Budget], [StartDate], [Administrator]) VALUES (7, N'Mathematics', 250024.0000, CAST(0x0000999C00000000 AS DateTime), 3)
SET IDENTITY_INSERT [dbo].[Department] OFF
ALTER TABLE [dbo].[Course] WITH CHECK ADD CONSTRAINT [FK_Course_Department] FOREIGN KEY([DepartmentID])
REFERENCES [dbo].[Department] ([DepartmentID])
GO
ALTER TABLE [dbo].[Course] CHECK CONSTRAINT [FK_Course_Department]
GO
using System;
using System.Data;
using System.Data.Common;
using Microsoft.Data.SqlClient;
using System.Linq;
using CSDataAdapterOperations.Properties;
class Program
{
static void Main(string[] args)
{
Settings settings = new Settings();
// Copy the data from the database. Get the table Department and Course from the database.
String selectString = @"SELECT [DepartmentID],[Name],[Budget],[StartDate],[Administrator]
FROM [MySchool].[dbo].[Department];
SELECT [CourseID],@Year as [Year],Max([Title]) as [Title],
Max([Credits]) as [Credits],Max([DepartmentID]) as [DepartmentID]
FROM [MySchool].[dbo].[Course]
Group by [CourseID]";
DataSet mySchool = new DataSet();
SqlCommand selectCommand = new SqlCommand(selectString);
SqlParameter parameter = selectCommand.Parameters.Add("@Year", SqlDbType.SmallInt, 2);
parameter.Value = new Random(DateTime.Now.Millisecond).Next(9999);
// Use DataTableMapping to map the source tables and the destination tables.
DataTableMapping[] tableMappings = { new DataTableMapping("Table", "Department"), new DataTableMapping("Table1", "Course") };
CopyData(mySchool, settings.MySchoolConnectionString, selectCommand, tableMappings);
Console.WriteLine("The following tables are from the database.");
foreach (DataTable table in mySchool.Tables)
{
Console.WriteLine(table.TableName);
ShowDataTable(table);
}
// Roll back the changes
DataTable department = mySchool.Tables["Department"];
DataTable course = mySchool.Tables["Course"];
department.Rows[0]["Name"] = "New" + department.Rows[0][1];
course.Rows[0]["Title"] = "New" + course.Rows[0]["Title"];
course.Rows[0]["Credits"] = 10;
Console.WriteLine("After we changed the tables:");
foreach (DataTable table in mySchool.Tables)
{
Console.WriteLine(table.TableName);
ShowDataTable(table);
}
department.RejectChanges();
Console.WriteLine("After use the RejectChanges method in Department table to roll back the changes:");
ShowDataTable(department);
DataColumn[] primaryColumns = { course.Columns["CourseID"] };
DataColumn[] resetColumns = { course.Columns["Title"] };
ResetCourse(course, settings.MySchoolConnectionString, primaryColumns, resetColumns);
Console.WriteLine("After use the ResetCourse method in Course table to roll back the changes:");
ShowDataTable(course);
// Batch update the table.
String insertString = @"Insert into [MySchool].[dbo].[Course]([CourseID],[Year],[Title],
[Credits],[DepartmentID])
values (@CourseID,@Year,@Title,@Credits,@DepartmentID)";
SqlCommand insertCommand = new SqlCommand(insertString);
insertCommand.Parameters.Add("@CourseID", SqlDbType.NVarChar, 10, "CourseID");
insertCommand.Parameters.Add("@Year", SqlDbType.SmallInt, 2, "Year");
insertCommand.Parameters.Add("@Title", SqlDbType.NVarChar, 100, "Title");
insertCommand.Parameters.Add("@Credits", SqlDbType.Int, 4, "Credits");
insertCommand.Parameters.Add("@DepartmentID", SqlDbType.Int, 4, "DepartmentID");
const Int32 batchSize = 10;
BatchInsertUpdate(course, settings.MySchoolConnectionString, insertCommand, batchSize);
}
private static void CopyData(DataSet dataSet, String connectionString, SqlCommand selectCommand, DataTableMapping[] tableMappings)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
selectCommand.Connection = connection;
connection.Open();
using (SqlDataAdapter adapter = new SqlDataAdapter(selectCommand))
{
adapter.TableMappings.AddRange(tableMappings);
// If set the AcceptChangesDuringFill as the false, AcceptChanges will not be called on a
// DataRow after it is added to the DataTable during any of the Fill operations.
adapter.AcceptChangesDuringFill = false;
adapter.Fill(dataSet);
}
}
}
// Roll back only one column or several columns data of the Course table by call ResetDataTable method.
private static void ResetCourse(DataTable table, String connectionString,
DataColumn[] primaryColumns, DataColumn[] resetColumns)
{
table.PrimaryKey = primaryColumns;
// Build the query string
String primaryCols = String.Join(",", primaryColumns.Select(col => col.ColumnName));
String resetCols = String.Join(",", resetColumns.Select(col => $"Max({col.ColumnName}) as {col.ColumnName}"));
String selectString = $"Select {primaryCols},{resetCols} from Course Group by {primaryCols}";
SqlCommand selectCommand = new SqlCommand(selectString);
ResetDataTable(table, connectionString, selectCommand);
}
// RejectChanges will roll back all changes made to the table since it was loaded, or the last time AcceptChanges
// was called. When you copy from the database, you can lose all the data after calling RejectChanges
// The ResetDataTable method rolls back one or more columns of data.
private static void ResetDataTable(DataTable table, String connectionString,
SqlCommand selectCommand)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
selectCommand.Connection = connection;
connection.Open();
using (SqlDataAdapter adapter = new SqlDataAdapter(selectCommand))
{
// The incoming values for this row will be written to the current version of each
// column. The original version of each column's data will not be changed.
adapter.FillLoadOption = LoadOption.Upsert;
adapter.Fill(table);
}
}
}
private static void BatchInsertUpdate(DataTable table, String connectionString,
SqlCommand insertCommand, Int32 batchSize)
{
using (SqlConnection connection = new SqlConnection(connectionString))
{
insertCommand.Connection = connection;
// When setting UpdateBatchSize to a value other than 1, all the commands
// associated with the SqlDataAdapter have to have their UpdatedRowSource
// property set to None or OutputParameters. An exception is thrown otherwise.
insertCommand.UpdatedRowSource = UpdateRowSource.None;
connection.Open();
using (SqlDataAdapter adapter = new SqlDataAdapter())
{
adapter.InsertCommand = insertCommand;
// Gets or sets the number of rows that are processed in each round-trip to the server.
// Setting it to 1 disables batch updates, as rows are sent one at a time.
adapter.UpdateBatchSize = batchSize;
adapter.Update(table);
Console.WriteLine("Successfully to update the table.");
}
}
}
private static void ShowDataTable(DataTable table)
{
foreach (DataColumn col in table.Columns)
{
Console.Write("{0,-14}", col.ColumnName);
}
Console.WriteLine("{0,-14}", "RowState");
foreach (DataRow row in table.Rows)
{
foreach (DataColumn col in table.Columns)
{
if (col.DataType.Equals(typeof(DateTime)))
Console.Write("{0,-14:d}", row[col]);
else if (col.DataType.Equals(typeof(Decimal)))
Console.Write("{0,-14:C}", row[col]);
else
Console.Write("{0,-14}", row[col]);
}
Console.WriteLine("{0,-14}", row.RowState);
}
}
}
namespace CSDataAdapterOperations.Properties
{
internal sealed partial class Settings : System.Configuration.ApplicationSettingsBase
{
private static readonly Settings defaultInstance =
((Settings)(System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default => defaultInstance;
[System.Configuration.ApplicationScopedSetting()]
[System.Configuration.DefaultSettingValue("Data Source=(local);Initial Catalog=MySchool;Integrated Security=True")]
public string MySchoolConnectionString => ((string)(this["MySchoolConnectionString"]));
}
}
Ayrıca bakınız
- Veri Adaptörleri (DataAdapters) ve Veri Okuyucular (DataReaders)
- Kimlik veya otomatik sayı değerlerini alma
- SQL Server için Microsoft ADO.NET