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 DataAdapter
denetlenmektedir.
SelectCommand
özelliğiDataAdapter
, veri kaynağından veri alan bir Command
nesnedir. InsertCommand
' nin DataAdapter
, UpdateCommand
ve DeleteCommand
özellikleri, içindeki verilerde yapılan değişikliklere göre veri kaynağındaki verilerde yapılan güncelleştirmeleri yöneten nesnelerdir Command
DataSet
. 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 SelectCommand
DataAdapter
doldurmak için kullanılır. Fill
bağımsız değişkenleri DataSet
olarak a, DataTable
doldurulacak bir nesne veya öğesinden döndürülen satırlarla doldurulacak öğesinin SelectCommand
adı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 DataSet
tabloların satırlarını DataSet
doldurmak 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 DataAdapter
olarakMissingSchemaAction
ayarlanmadığıMissingSchemaAction
AddWithKey
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 DataSet
tablolara eklenir. Fill
DataSet
, (bkz. DataAdapter DataTable ve DataColumn Eşlemeleri).
Not
SelectCommand
bir OUTER JOIN sonucunu döndürürse, DataAdapter
sonucu DataTable
iç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 SqlDataAdapter SqlConnection oluşturur ve içindekini DataTable DataSet
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 Connection
DataAdapter
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 Update
gibi 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 Open
Connection
, veri kaynağında işlemleri gerçekleştirip yöntemini çağırarak Close
uygulamanızın Connection
performansı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 DataSet
birden ç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 DataRelation
ile 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 DataTable
eklenmez. 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 DataSet
iç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 DataSet
var 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 DataTable
kullanı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 CustomersOrders
burada 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
, , CustomersOrders
ile 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 |