DataAdapter’dan bir DataSet Doldurma

ADO.NET DataSet , veri kaynağından bağımsız tutarlı bir ilişkisel programlama modeli sağlayan verilerin bellekte yerleşik bir gösterimidir. , DataSet tablolar arasındaki tabloları, kısıtlamaları ve ilişkileri içeren eksiksiz bir veri kümesini temsil eder. DataSet veri kaynağından bağımsız olduğundan, uygulamasına DataSet yerel verileri ve birden çok veri kaynağından verileri içerebilir. Mevcut veri kaynaklarıyla etkileşim, aracılığıyla DataAdapterdenetlenmektedir.

SelectCommand özelliğiDataAdapter, veri kaynağından veri alan bir Command nesnedir. InsertCommand' nin DataAdapter , UpdateCommandve DeleteCommand özellikleri, içindeki verilerde yapılan değişikliklere göre veri kaynağındaki verilerde yapılan güncelleştirmeleri yöneten nesnelerdir CommandDataSet. Bu özellikler DataAdapters ile Veri Kaynaklarını Güncelleştirme bölümünde daha ayrıntılı olarak ele alınmıştır.

Fill yöntemiDataAdapter, öğesinin DataSet sonuçlarıyla SelectCommandDataAdapterdoldurmak için kullanılır. Fillbağımsız değişkenleri DataSet olarak a, DataTable doldurulacak bir nesne veya öğesinden döndürülen satırlarla doldurulacak öğesinin SelectCommandadını DataTable alır.

Not

DataAdapter Tablonun tümünü almak için öğesinin kullanılması, özellikle de tabloda çok fazla satır varsa zaman alır. Bunun nedeni veritabanına erişme, verileri bulup işleme ve ardından verileri istemciye aktarmanın zaman alıcı olmasıdır. Tablonun tümünü istemciye çekmek, sunucudaki tüm satırları da kilitler. Performansı geliştirmek için yan tümcesini WHERE kullanarak istemciye döndürülen satır sayısını büyük ölçüde azaltabilirsiniz. Ayrıca, yalnızca deyimdeki gerekli sütunları SELECT açıkça listeleyerek istemciye döndürülen veri miktarını azaltabilirsiniz. Bir diğer iyi geçici çözüm de satırları toplu olarak (bir kerede birkaç yüz satır gibi) almak ve yalnızca istemci geçerli toplu işlemi tamamladığında bir sonraki toplu işlemi almaktır.

yöntemi, Fill içindeki tabloları oluşturmak için kullanılan sütun adlarını ve türlerini ve içindeki DataSettabloların satırlarını DataSetdoldurmak için verileri döndürmek için nesnesini örtük olarak kullanırDataReader. Tablolar ve sütunlar yalnızca henüz mevcut değilse oluşturulur; aksi takdirde Fill mevcut DataSet şemayı kullanır. Sütun türleri, ADO.NET Veri Türü Eşlemeleri'ndeki tablolara göre .NET Framework türleri olarak oluşturulur. Birincil anahtarlar, veri kaynağında mevcut olmadığı ve DataAdapterolarakMissingSchemaAction ayarlanmadığıMissingSchemaActionAddWithKey sürece oluşturulmaz. Bir tablo için birincil anahtar bulunduğunu bulursa Fill , birincil anahtar sütun değerlerinin DataSet veri kaynağından döndürülen satırlarla eşleştiği satırlar için veri kaynağındaki verilerle içindeki verilerin üzerine yazar. Birincil anahtar bulunmazsa, veriler içindeki DataSettablolara eklenir. FillDataSet , (bkz. DataAdapter DataTable ve DataColumn Eşlemeleri).

Not

SelectCommand bir OUTER JOIN sonucunu döndürürse, DataAdapter sonucu DataTableiçin bir PrimaryKey değer ayarlamaz. Yinelenen satırların PrimaryKey doğru çözümlenmiş olduğundan emin olmak için kendinizi tanımlamanız gerekir. Daha fazla bilgi için bkz . Birincil Anahtarları Tanımlama.

Aşağıdaki kod örneği, Microsoft SQL Server Northwind veritabanı için kullanan bir örneğini SqlDataAdapterSqlConnection oluşturur ve içindekini DataTableDataSet müşteri listesiyle doldurur. oluşturucuya SqlDataAdapter geçirilen SQL deyimi ve SqlConnection bağımsız değişkenleri, özelliğini SqlDataAdapteroluşturmak SelectCommand için kullanılır.

Örnek

' Assumes that connection is a valid SqlConnection object.  
Dim queryString As String = _  
  "SELECT CustomerID, CompanyName FROM dbo.Customers"  
Dim adapter As SqlDataAdapter = New SqlDataAdapter( _  
  queryString, connection)  
  
Dim customers As DataSet = New DataSet  
adapter.Fill(customers, "Customers")  
// Assumes that connection is a valid SqlConnection object.  
string queryString =
  "SELECT CustomerID, CompanyName FROM dbo.Customers";  
SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);  
  
DataSet customers = new DataSet();  
adapter.Fill(customers, "Customers");  

Not

Bu örnekte gösterilen kod açıkça öğesini açmaz ve kapatmaz Connection. yöntemi, Fill bağlantının ConnectionDataAdapter henüz açık olmadığını bulursa örtük olarak öğesinin kullandığı öğesini açar. Bağlantı açılırsa Fill , bittiğinde bağlantıyı Fill da kapatır. Bu, veya Updategibi Fill tek bir işlemle uğraşırken kodunuzu basitleştirebilir. Ancak, açık bağlantı gerektiren birden çok işlem gerçekleştiriyorsanız, yöntemini açıkça çağırarak OpenConnection, veri kaynağında işlemleri gerçekleştirip yöntemini çağırarak Close uygulamanızın Connectionperformansını geliştirebilirsiniz. Kaynakları diğer istemci uygulamaları tarafından kullanılmak üzere boşaltmak için veri kaynağı bağlantılarını mümkün olduğunca kısa bir süre açık tutmaya çalışmanız gerekir.

Birden Fazla Sonuç Kümesi

DataAdapter birden çok sonuç kümesiyle karşılaşırsa, içinde DataSetbirden çok tablo oluşturur. Tablolara Tablo0 için "Tablo" ile başlayan artımlı varsayılan Tablo N adı verilir. Bir tablo adı yöntemine bağımsız değişken olarak geçirilirse tablolara Fill TableName0 için "TableName" ile başlayarak TableNameN artımlı varsayılan adı verilir.

Birden Çok DataAdapter'dan DataSet Doldurma

ile herhangi bir DataAdapter sayıda nesne kullanılabilir DataSet. Her DataAdapter biri bir veya daha fazla DataTable nesneyi doldurmak ve güncelleştirmeleri ilgili veri kaynağına geri çözümlemek için kullanılabilir. DataRelation ve Constraint nesneleri yerel olarak eklenebilir DataSet ve bu sayede farklı veri kaynaklarından verileri ilişkilendirebilirsiniz. Örneğin, bir DataSet Microsoft SQL Server veritabanından, OLE DB aracılığıyla kullanıma sunulan bir IBM DB2 veritabanından ve XML akışı sağlayan bir veri kaynağından veri içerebilir. Bir veya daha fazla DataAdapter nesne her veri kaynağıyla iletişimi işleyebilir.

Örnek

Aşağıdaki kod örneği, Microsoft SQL Server'daki veritabanındaki Northwind müşterilerin listesini ve Microsoft Access 2000'de depolanan veritabanındaki Northwind siparişlerin listesini doldurur. Doldurulan tablolar bir DataRelationile ilişkilidir ve müşteri listesi bu müşterinin siparişleriyle birlikte görüntülenir. Nesneler hakkında DataRelation daha fazla bilgi için bkz . DataRelations Ekleme ve DataRelations'ta Gezinme.

' Assumes that customerConnection is a valid SqlConnection object.  
' Assumes that orderConnection is a valid OleDbConnection object.  
Dim custAdapter As SqlDataAdapter = New SqlDataAdapter( _  
  "SELECT * FROM dbo.Customers", customerConnection)  
  
Dim ordAdapter As OleDbDataAdapter = New OleDbDataAdapter( _  
  "SELECT * FROM Orders", orderConnection)  
  
Dim customerOrders As DataSet = New DataSet()  
custAdapter.Fill(customerOrders, "Customers")  
ordAdapter.Fill(customerOrders, "Orders")  
  
Dim relation As DataRelation = _  
  customerOrders.Relations.Add("CustOrders", _  
  customerOrders.Tables("Customers").Columns("CustomerID"), _
  customerOrders.Tables("Orders").Columns("CustomerID"))  
  
Dim pRow, cRow As DataRow  
For Each pRow In customerOrders.Tables("Customers").Rows  
  Console.WriteLine(pRow("CustomerID").ToString())  
  
  For Each cRow In pRow.GetChildRows(relation)  
    Console.WriteLine(vbTab & cRow("OrderID").ToString())  
  Next  
Next  
// Assumes that customerConnection is a valid SqlConnection object.  
// Assumes that orderConnection is a valid OleDbConnection object.  
SqlDataAdapter custAdapter = new SqlDataAdapter(  
  "SELECT * FROM dbo.Customers", customerConnection);  
OleDbDataAdapter ordAdapter = new OleDbDataAdapter(  
  "SELECT * FROM Orders", orderConnection);  
  
DataSet customerOrders = new DataSet();  
  
custAdapter.Fill(customerOrders, "Customers");  
ordAdapter.Fill(customerOrders, "Orders");  
  
DataRelation relation = customerOrders.Relations.Add("CustOrders",  
  customerOrders.Tables["Customers"].Columns["CustomerID"],  
  customerOrders.Tables["Orders"].Columns["CustomerID"]);  
  
foreach (DataRow pRow in customerOrders.Tables["Customers"].Rows)  
{  
  Console.WriteLine(pRow["CustomerID"]);  
   foreach (DataRow cRow in pRow.GetChildRows(relation))  
    Console.WriteLine("\t" + cRow["OrderID"]);  
}  

SQL Server Ondalık Türü

Varsayılan olarak, DataSet .NET Framework veri türlerini kullanarak verileri depolar. Çoğu uygulama için bunlar veri kaynağı bilgilerinin kullanışlı bir gösterimini sağlar. Ancak, veri kaynağındaki veri türü bir SQL Server ondalık veya sayısal veri türü olduğunda bu gösterim bir soruna neden olabilir. .NET Framework decimal veri türü en fazla 28 anlamlı basamağı sağlarken, SQL Server decimal veri türü 38 önemli basamağı izin verir. SqlDataAdapter bir işlem sırasında bir Fill SQL Server decimal alanının duyarlığı 28 karakterden büyük olduğunu belirlerse, geçerli satır öğesine DataTableeklenmez. FillError Bunun yerine olay gerçekleşir ve bu da duyarlık kaybı yaşanıp gerçekleşmeyeceğini belirlemenize ve uygun şekilde yanıt vermenizi sağlar. Olay hakkında FillError daha fazla bilgi için bkz . DataAdapter Olaylarını İşleme. SQL Server decimal değerini almak için bir SqlDataReader nesnesi kullanabilir ve yöntemini çağırabilirsiniz GetSqlDecimal .

ADO.NET 2.0, içinde için System.Data.SqlTypes gelişmiş destek kullanıma sunulmuştur DataSet. Daha fazla bilgi için bkz . SqlTypes ve DataSet.

OLE DB Bölümleri

Hiyerarşik satır kümeleri veya bölümler (OLE DB türü DBTYPE_HCHAPTER, ADO türü adChapter) bir DataSetiçeriğini doldurmak için kullanılabilir. OleDbDataAdapter bir işlem sırasında bölümlenmiş sütunla karşılaştığındaFill, bölümlenmiş sütun için bir DataTable oluşturulur ve bu tablo bölümdeki sütun ve satırlarla doldurulur. Bölümlenmiş sütun için oluşturulan tablo, hem üst tablo adı hem de "ParentTableNameChapteredColumnName" biçiminde bölümlenmiş sütun adı kullanılarak adlandırılır. içinde DataSet bölümlenmiş sütunun adıyla eşleşen bir tablo zaten varsa, geçerli tablo bölüm verileriyle doldurulur. Varolan bir tabloda bölümde bulunan bir sütunla eşleşen sütun yoksa, yeni bir sütun eklenir.

içindeki DataSet tablolar bölümlenmiş sütunlardaki verilerle doldurulmadan önce, hem üst hem de alt tabloya bir tamsayı sütunu eklenerek, üst sütun otomatik artırma olarak ayarlanarak ve her iki tablodan eklenen sütunlar kullanılarak bir oluşturularak hiyerarşik satır kümesinin üst ve alt tabloları arasında bir DataRelation ilişki oluşturulur. Eklenen ilişki, "ParentTableNameChapterColumnName" biçimindeki üst tablo ve bölüm sütun adları kullanılarak adlandırılır.

İlgili sütunun yalnızca içinde DataSetvar olduğuna dikkat edin. Veri kaynağından gelen sonraki dolgular, değişikliklerin varolan satırlarla birleştirilmesi yerine tablolara yeni satırların eklenmesine neden olabilir.

Ayrıca, kullanan aşırı yüklemeyi DataTablekullanırsanız DataAdapter.Fill yalnızca o tablonun doldurulacağını unutmayın. Tabloya otomatik olarak artan bir tamsayı sütunu eklenir, ancak hiçbir alt tablo oluşturulmaz veya doldurulmaz ve hiçbir ilişki oluşturulmaz.

Aşağıdaki örnek, bir müşteri listesindeki her müşteri için siparişlerin bölüm sütununu oluşturmak için MSDataShape Sağlayıcısı'nı kullanır. Ardından A DataSet , verilerle doldurulur.

Using connection As OleDbConnection = New OleDbConnection( _  
  "Provider=MSDataShape;Data Provider=SQLOLEDB;" & _  
  "Data Source=(local);Integrated " & _  
  "Security=SSPI;Initial Catalog=northwind")  
  
Dim adapter As OleDbDataAdapter = New OleDbDataAdapter( _  
  "SHAPE {SELECT CustomerID, CompanyName FROM Customers} " & _  
  "APPEND ({SELECT CustomerID, OrderID FROM Orders} AS Orders " & _  
  "RELATE CustomerID TO CustomerID)", connection)  
  
Dim customers As DataSet = New DataSet()  
  
adapter.Fill(customers, "Customers")  
End Using  
using (OleDbConnection connection = new OleDbConnection("Provider=MSDataShape;Data Provider=SQLOLEDB;" +  
  "Data Source=(local);Integrated Security=SSPI;Initial Catalog=northwind"))  
{  
OleDbDataAdapter adapter = new OleDbDataAdapter("SHAPE {SELECT CustomerID, CompanyName FROM Customers} " +  
  "APPEND ({SELECT CustomerID, OrderID FROM Orders} AS Orders " +  
  "RELATE CustomerID TO CustomerID)", connection);  
  
DataSet customers = new DataSet();  
adapter.Fill(customers, "Customers");  
}  

Fill İşlem tamamlandığında, DataSet iki tablo içerir: Customers ve CustomersOrdersburada CustomersOrders bölümlenmiş sütunu temsil eder. Tabloya Customers adlı Orders ek bir sütun ve tabloya CustomersOrders adlı CustomersOrders ek bir sütun eklenir. Orders Tablodaki Customers sütun otomatik artırma olarak ayarlanır. DataRelation, , CustomersOrdersile tablolara Customers eklenen sütunlar üst tablo olarak kullanılarak oluşturulur. Aşağıdaki tablolarda bazı örnek sonuçlar gösterilmektedir.

TableName: Müşteriler

CustomerID CompanyName Siparişler
ALFKI Alfreds Futterkiste 0
ANATR Ana Trujillo Emparedados y helados 1

TableName: CustomersOrders

CustomerID OrderID CustomersOrders
ALFKI 10643 0
ALFKI 10692 0
ANATR 10308 1
ANATR 10625 1

Ayrıca bkz.