Veri Erişim Katmanını Oluşturma (VB)Creating a Data Access Layer (VB)

Scott Mitchell tarafındanby Scott Mitchell

Örnek uygulamayı indirin veya PDF 'yi indirinDownload Sample App or Download PDF

Bu öğreticide, bir veritabanındaki bilgilere erişmek için çok baştan başlayıp, yazılan veri kümelerini kullanarak veri erişim katmanını (DAL) oluşturacağız.In this tutorial we'll start from the very beginning and create the Data Access Layer (DAL), using typed DataSets, to access the information in a database.

GirişIntroduction

Web geliştiricileri olarak, yaşamımız verilerle çalışmaya yakın bir şekilde çalışır.As web developers, our lives revolve around working with data. Verileri depolamak için veritabanları, bu dosyayı alma ve değiştirme kodu ve toplanacak ve özetlenecek Web sayfaları oluşturacağız.We create databases to store the data, code to retrieve and modify it, and web pages to collect and summarize it. Bu, ASP.NET 2,0 ' de bu ortak desenleri uygulama tekniklerini keşfedebilir, uzun bir serinin ilk öğreticisidir.This is the first tutorial in a lengthy series that will explore techniques for implementing these common patterns in ASP.NET 2.0. Yazılan veri kümelerini kullanarak bir veri erişim katmanından (DAL) oluşan bir yazılım mimarisi , özel iş kurallarını zorlayan bir Iş mantığı katmanı (BLL) ve ortak bir sayfa düzeni paylaşan ASP.net sayfalarından oluşan bir sunum katmanı oluşturmaya başlayacağız.We'll start with creating a software architecture composed of a Data Access Layer (DAL) using Typed DataSets, a Business Logic Layer (BLL) that enforces custom business rules, and a presentation layer composed of ASP.NET pages that share a common page layout. Bu arka uç groundçalışma oluşturulduktan sonra, bir Web uygulamasındaki verileri görüntüleme, özetleme, toplama ve doğrulama işlemlerinin nasıl yapılacağını gösteren raporlamaya geçeceğiz.Once this backend groundwork has been laid, we'll move into reporting, showing how to display, summarize, collect, and validate data from a web application. Bu öğreticilerin kısa olması ve işlem boyunca görsel olarak size yol göstermek için çok sayıda ekran görüntüsü ile adım adım yönergeler sağlaması gerekir.These tutorials are geared to be concise and provide step-by-step instructions with plenty of screen shots to walk you through the process visually. Her öğretici, C# ve Visual Basic sürümlerde mevcuttur ve kullanılan kodun tamamını karşıdan yükleme içerir.Each tutorial is available in C# and Visual Basic versions and includes a download of the complete code used. (Bu ilk öğretici oldukça uzun, ancak Rest çok daha fazla digestible öbekte sunulmuştur.)(This first tutorial is quite lengthy, but the rest are presented in much more digestible chunks.)

Bu öğreticiler için App_Data dizinine yerleştirilmiş Northwind veritabanının Microsoft SQL Server 2005 Express Edition sürümünü kullanacağız.For these tutorials we'll be using a Microsoft SQL Server 2005 Express Edition version of the Northwind database placed in the App_Data directory. Veritabanı dosyasına ek olarak, App_Data klasörü, farklı bir veritabanı sürümü kullanmak istemeniz durumunda veritabanını oluşturmak için SQL komut dosyalarını da içerir.In addition to the database file, the App_Data folder also contains the SQL scripts for creating the database, in case you want to use a different database version. Bu betikler, tercih ediyorsanız doğrudan Microsoft 'tan da indirilebilir.These scripts can be also be downloaded directly from Microsoft, if you'd prefer. Northwind veritabanının farklı bir SQL Server sürümünü kullanırsanız, uygulamanın Web.config dosyasında NORTHWNDConnectionString ayarını güncelleştirmeniz gerekir.If you use a different SQL Server version of the Northwind database, you will need to update the NORTHWNDConnectionString setting in the application's Web.config file. Web uygulaması, dosya sistemi tabanlı bir Web sitesi projesi olarak Visual Studio 2005 Professional Edition kullanılarak oluşturulmuştur.The web application was built using Visual Studio 2005 Professional Edition as a file system-based Web site project. Ancak, tüm öğreticiler Visual Studio 2005, Visual Web Developer'ın ücretsiz sürümüyle eşit bir şekilde çalışacaktır.However, all of the tutorials will work equally well with the free version of Visual Studio 2005, Visual Web Developer.

Bu öğreticide, en baştan başlayacağız ve veri erişim katmanını (DAL) oluşturacak ve ikinci öğreticide Iş mantığı katmanını (BLL) oluşturarak ve sayfa düzeninde ve üçüncü katmandaki gezinmede çalışmaya başlayacağız.In this tutorial we'll start from the very beginning and create the Data Access Layer (DAL), followed by creating the Business Logic Layer (BLL) in the second tutorial, and working on page layout and navigation in the third. Üçüncü bir sürüm ile sonraki öğreticiler, birinci üçünde yer alan temel üzerinde oluşturulur.The tutorials after the third one will build upon the foundation laid in the first three. Bu ilk öğreticide yer almak için çok fazla sunuyoruz ve Visual Studio 'Yu kullanmaya başlayın!We've got a lot to cover in this first tutorial, so fire up Visual Studio and let's get started!

1. Adım: Web projesi oluşturma ve veritabanına bağlanmaStep 1: Creating a Web Project and Connecting to the Database

Veri erişim katmanımızı (DAL) oluşturabilmeniz için önce bir Web sitesi oluşturmanız ve veritabanınızı ayarlamanız gerekir.Before we can create our Data Access Layer (DAL), we first need to create a web site and setup our database. Yeni bir dosya sistemi tabanlı ASP.NET Web sitesi oluşturarak başlayın.Start by creating a new file system-based ASP.NET web site. Bunu gerçekleştirmek için Dosya menüsüne gidin ve yeni Web sitesi ' ni seçerek yeni Web sitesi iletişim kutusunu görüntüler.To accomplish this, go to the File menu and choose New Web Site, displaying the New Web Site dialog box. ASP.NET Web sitesi şablonunu seçin, Konum açılır listesini dosya sistemi olarak ayarlayın, Web sitesini yerleştirmek için bir klasör seçin ve dili Visual Basic olarak ayarlayın.Choose the ASP.NET Web Site template, set the Location drop-down list to File System, choose a folder to place the web site, and set the language to Visual Basic.

yeni bir dosya sistemi tabanlı Web sitesi oluşturmaCreate a New File System-Based Web Site

Şekil 1: yeni bir dosya sistemi tabanlı Web sitesi oluşturma (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 1: Create a New File System-Based Web Site (Click to view full-size image)

Bu, bir Default.aspx ASP.NET sayfası, bir App_Data klasörü ve bir Web.config dosyası ile yeni bir Web sitesi oluşturur.This will create a new web site with a Default.aspx ASP.NET page, an App_Data folder, and a Web.config file.

Web sitesi oluşturulduğunda, sonraki adım Visual Studio 'nun Sunucu Gezgini veritabanına bir başvuru eklemektir.With the web site created, the next step is to add a reference to the database in Visual Studio's Server Explorer. Sunucu Gezgini bir veritabanı ekleyerek, Visual Studio içinden tabloları, saklı yordamları, görünümleri ve benzeri işlemleri ekleyebilirsiniz.By adding a database to the Server Explorer you can add tables, stored procedures, views, and so on all from within Visual Studio. Ayrıca, Sorgu Tasarımcısı aracılığıyla tablo verilerini görüntüleyebilir veya kendi sorgularınızı oluşturabilirsiniz.You can also view table data or create your own queries either by hand or graphically via the Query Builder. Ayrıca, DAL için yazılan veri kümelerini oluşturduğumuz zaman, Visual Studio 'Nun yazılan veri kümelerinin oluşturulması gereken veritabanına işaret etmesi gerekir.Furthermore, when we build the Typed DataSets for the DAL we'll need to point Visual Studio to the database from which the Typed DataSets should be constructed. Bu bağlantı bilgilerini zaman içinde sağlayabilmemiz için, Visual Studio Sunucu Gezgini zaten kayıtlı olan veritabanlarının açılan listesini otomatik olarak doldurur.While we can provide this connection information at that point in time, Visual Studio automatically populates a drop-down list of the databases already registered in the Server Explorer.

Sunucu Gezgini Northwind veritabanını ekleme adımları App_Data klasöründe SQL Server 2005 Express Sürüm veritabanını kullanmak istediğinize veya bunun yerine kullanmak istediğiniz Microsoft SQL Server 2000 ya da 2005 veritabanı sunucu kurulumuna sahip olup olmadığına bağlıdır.The steps for adding the Northwind database to the Server Explorer depend on whether you want to use the SQL Server 2005 Express Edition database in the App_Data folder or if you have a Microsoft SQL Server 2000 or 2005 database server setup that you want to use instead.

App_Dataklasöründeki bir veritabanını kullanmaUsing a Database in theApp_DataFolder

Bağlanmak için bir SQL Server 2000 veya 2005 veritabanı sunucusu yoksa veya veritabanını bir veritabanı sunucusuna ekleme zorunluluğunu önlemek istiyorsanız, indirilen Web sitesinin App_Data klasöründe (NORTHWND.MDF) bulunan Northwind veritabanının SQL Server 2005 Express Sürüm sürümünü kullanabilirsiniz.If you do not have a SQL Server 2000 or 2005 database server to connect to, or you simply want to avoid having to add the database to a database server, you can use the SQL Server 2005 Express Edition version of the Northwind database that is located in the downloaded website's App_Data folder (NORTHWND.MDF).

App_Data klasöre yerleştirilmiş bir veritabanı Sunucu Gezgini otomatik olarak eklenir.A database placed in the App_Data folder is automatically added to the Server Explorer. Makinenizde SQL Server 2005 Express Sürüm yüklü olduğunu varsayarsak, kuzeydoğu adlı bir düğüm görmeniz gerekir. Sunucu Gezgini, tabloları, görünümleri, saklı yordamını ve benzerlerini genişletebileceğiniz ve keşfedebilir (bkz. Şekil 2).Assuming you have SQL Server 2005 Express Edition installed on your machine you should see a node named NORTHWND.MDF in the Server Explorer, which you can expand and explore its tables, views, stored procedure, and so on (see Figure 2).

App_Data klasörü, Microsoft Access .mdb dosyalarını da tutabilir ve bu da SQL Server karşılıkları gibi Sunucu Gezgini otomatik olarak eklenir.The App_Data folder can also hold Microsoft Access .mdb files, which, like their SQL Server counterparts, are automatically added to the Server Explorer. SQL Server seçeneklerden herhangi birini kullanmak istemiyorsanız, Northwind veritabanı dosyasının Microsoft Access sürümünü her zaman indirebilir ve App_Data dizinine bırakabilirsiniz.If you don't want to use any of the SQL Server options, you can always download a Microsoft Access version of the Northwind database file and drop into the App_Data directory. Ancak, Access veritabanlarının SQL Server olarak Özellik zengin olmadığı ve Web sitesi senaryolarında kullanılmak üzere tasarlanmadığı göz önünde bulundurun.Keep in mind, however, that Access databases aren't as feature-rich as SQL Server, and aren't designed to be used in web site scenarios. Ayrıca, 35 ' in birkaç öğreticimiz, erişim tarafından desteklenmeyen belirli veritabanı düzeyi özellikleri kullanır.Furthermore, a couple of the 35+ tutorials will utilize certain database-level features that aren't supported by Access.

Microsoft SQL Server 2000 veya 2005 veritabanı sunucusunda veritabanına bağlanmaConnecting to the Database in a Microsoft SQL Server 2000 or 2005 Database Server

Alternatif olarak, bir veritabanı sunucusunda yüklü olan Northwind veritabanına bağlanabilirsiniz.Alternatively, you may connect to a Northwind database installed on a database server. Veritabanı sunucusunda zaten Northwind veritabanı yüklü değilse, önce Bu öğreticinin indirileceği yükleme betiğini çalıştırarak veya Northwind ve Installation script SQL Server 2000 sürümünü doğrudan Microsoft 'un web sitesinden indirerek veritabanı sunucusuna eklemeniz gerekir.If the database server does not already have the Northwind database installed, you first must add it to database server by running the installation script included in this tutorial's download or by downloading the SQL Server 2000 version of Northwind and installation script directly from Microsoft's web site.

Veritabanını yükledikten sonra, Visual Studio 'daki Sunucu Gezgini gidin, veri bağlantıları düğümüne sağ tıklayın ve bağlantı Ekle ' yi seçin.Once you have the database installed, go to the Server Explorer in Visual Studio, right-click on the Data Connections node, and choose Add Connection. Sunucu Gezgini görmüyorsanız, görünüme/Sunucu Gezgini gidin veya CTRL + ALT + S tuşlarına basın.If you don't see the Server Explorer go to the View / Server Explorer, or hit Ctrl+Alt+S. Bu işlem, bağlanılacak sunucuyu, kimlik doğrulama bilgilerini ve veritabanı adını belirtebileceğiniz bağlantı Ekle iletişim kutusunu getirir.This will bring up the Add Connection dialog box, where you can specify the server to connect to, the authentication information, and the database name. Veritabanı bağlantı bilgilerini başarıyla yapılandırdıktan ve Tamam düğmesine tıkladıktan sonra, veritabanı veri bağlantıları düğümünün altına bir düğüm olarak eklenecektir.Once you have successfully configured the database connection information and clicked the OK button, the database will be added as a node underneath the Data Connections node. Tabloları, görünümleri, saklı yordamlarını ve benzerlerini araştırmak için veritabanı düğümünü genişletebilirsiniz.You can expand the database node to explore its tables, views, stored procedures, and so on.

Veritabanı sunucunuzun Northwind veritabanına bir bağlantı ekleyin

Şekil 2: veritabanı sunucunuzun Northwind veritabanına bağlantı eklemeFigure 2: Add a Connection to Your Database Server's Northwind Database

2. Adım: veri erişim katmanını oluşturmaStep 2: Creating the Data Access Layer

Verilerle çalışırken, verilere özgü mantığı doğrudan sunu katmanına (bir Web uygulamasında, ASP.NET sayfaları ise sunu katmanını yapar) katıştırmanız gerekir.When working with data one option is to embed the data-specific logic directly into the presentation layer (in a web application, the ASP.NET pages make up the presentation layer). Bu, ASP.NET sayfasının kod bölümünde ADO.NET kodu yazma veya biçimlendirme bölümünün SqlDataSource denetimini kullanma biçimini alabilir.This may take the form of writing ADO.NET code in the ASP.NET page's code portion or using the SqlDataSource control from the markup portion. Her iki durumda da bu yaklaşım, veri erişim mantığını sunum katmanıyla sıkı bir şekilde bağar.In either case, this approach tightly couples the data access logic with the presentation layer. Ancak önerilen yaklaşım, veri erişim mantığını sunum katmanından ayıramaktır.The recommended approach, however, is to separate the data access logic from the presentation layer. Bu ayrı katmana veri erişim katmanı, kısa için DAL adı verilir ve genellikle ayrı bir sınıf kitaplığı projesi olarak uygulanır.This separate layer is referred to as the Data Access Layer, DAL for short, and is typically implemented as a separate Class Library project. Bu katmanlı mimarinin avantajları iyi belgelenmiştir (Bu avantajlar hakkında bilgi edinmek için Bu öğreticinin sonundaki "daha fazla okuma" bölümüne bakın) ve bu seride gerçekleştirilecek yaklaşım vardır.The benefits of this layered architecture are well documented (see the "Further Readings" section at the end of this tutorial for information on these advantages) and is the approach we will take in this series.

Veritabanına bağlantı oluşturma, SELECT, INSERT, UPDATEve DELETE komutları gibi temel alınan veri kaynağına özgü tüm kod ve bu nedenle, DAL içinde bulunmalıdır.All code that is specific to the underlying data source such as creating a connection to the database, issuing SELECT, INSERT, UPDATE, and DELETE commands, and so on should be located in the DAL. Sunu katmanı, bu tür veri erişim koduna herhangi bir başvuru içermemelidir, ancak bunun yerine her türlü veri isteği için DAL çağrısı yapmamalıdır.The presentation layer should not contain any references to such data access code, but should instead make calls into the DAL for any and all data requests. Veri erişimi katmanları genellikle temel alınan veritabanı verilerine erişim yöntemlerini içerir.Data Access Layers typically contain methods for accessing the underlying database data. Örneğin, Northwind veritabanının, satışı için ürünleri ve ait oldukları kategorileri kaydeden Products ve Categories tabloları vardır.The Northwind database, for example, has Products and Categories tables that record the products for sale and the categories to which they belong. Bu şekilde, şu gibi yöntemlere sahip olduğumuz:In our DAL we will have methods like:

  • Tüm Kategoriler hakkındaki bilgileri döndüren GetCategories(),GetCategories(), which will return information about all of the categories
  • Tüm ürünlerle ilgili bilgileri döndüren GetProducts()GetProducts(), which will return information about all of the products
  • GetProductsByCategoryID(categoryID), belirtilen kategoriye ait tüm ürünleri döndürecekGetProductsByCategoryID(categoryID), which will return all products that belong to a specified category
  • belirli bir ürünle ilgili bilgileri döndüren GetProductByProductID(productID)GetProductByProductID(productID), which will return information about a particular product

Çağrıldığında, bu yöntemler veritabanına bağlanır, uygun sorguyu verir ve sonuçları döndürür.These methods, when invoked, will connect to the database, issue the appropriate query, and return the results. Bu sonuçların nasıl döndürültiğimiz önemlidir.How we return these results is important. Bu yöntemler veritabanı sorgusu tarafından doldurulan bir veri kümesi veya DataReader döndürebilir, ancak ideal olarak belirlenmiş nesnelerkullanılarak bu sonuçların döndürülmesi önerilir.These methods could simply return a DataSet or DataReader populated by the database query, but ideally these results should be returned using strongly-typed objects. Türü kesin belirlenmiş bir nesne, derleme zamanında rigidly tanımlanmış olan bir nesnedir, ancak gevşek olarak yazılmış bir nesne, bir şema çalışma zamanına kadar bilinmez.A strongly-typed object is one whose schema is rigidly defined at compile time, whereas the opposite, a loosely-typed object, is one whose schema is not known until runtime.

Örneğin, DataReader ve veri kümesi (varsayılan olarak), şemaları doldurmak için kullanılan veritabanı sorgusunun döndürdüğü sütunlar tarafından tanımlandığından, gevşek olarak yazılmış nesnelerdir.For example, the DataReader and the DataSet (by default) are loosely-typed objects since their schema is defined by the columns returned by the database query used to populate them. Gevşek yazılmış bir DataTable nesnesinden belirli bir sütuna erişmek için, şöyle bir sözdizimi kullanmanız gerekir: DataTable.Rows(index)("columnName").To access a particular column from a loosely-typed DataTable we need to use syntax like: DataTable.Rows(index)("columnName"). DataTable 'ın bu örnekteki gevşek olarak yazılması, bir dize veya sıralı dizin kullanarak sütun adına erişmesi gereken olgu tarafından belirlenir.The DataTable's loose typing in this example is exhibited by the fact that we need to access the column name using a string or ordinal index. Kesin türü belirtilmiş bir DataTable, diğer taraftan, sütunlarının her birini özellik olarak uygulanmış olacaktır, bu, şunun gibi görünen kod ile sonuçlanır: DataTable.Rows(index).columnName.A strongly-typed DataTable, on the other hand, will have each of its columns implemented as properties, resulting in code that looks like: DataTable.Rows(index).columnName.

Kesin tür belirtilmiş nesneleri döndürmek için, geliştiriciler kendi özel iş nesnelerini oluşturabilir ya da türü belirlenmiş veri kümelerini kullanabilir.To return strongly-typed objects, developers can either create their own custom business objects or use Typed DataSets. İş nesnesi geliştirici tarafından, özellikleri genellikle iş nesnesinin temsil ettiği temel veritabanı tablosunun sütunlarını yansıtan bir sınıf olarak uygulanır.A business object is implemented by the developer as a class whose properties typically reflect the columns of the underlying database table the business object represents. Türü belirtilmiş veri kümesi, Visual Studio tarafından bir veritabanı şemasına göre oluşturulan ve üyeleri bu şemaya göre kesin olarak yazılan bir sınıftır.A Typed DataSet is a class generated for you by Visual Studio based on a database schema and whose members are strongly-typed according to this schema. Türü belirtilmiş veri kümesi, ADO.NET DataSet, DataTable ve DataRow sınıflarını genişleten sınıflardan oluşur.The Typed DataSet itself consists of classes that extend the ADO.NET DataSet, DataTable, and DataRow classes. Türü kesin belirlenmiş DataTable 'a ek olarak, yazılan veri kümeleri artık DataSet 'in DataTable 'ları dolduruluyor ve DataTable içindeki değişiklikleri veritabanına geri yaymaya yönelik yöntemlere sahip olan TableAdapters de içerir.In addition to strongly-typed DataTables, Typed DataSets now also include TableAdapters, which are classes with methods for populating the DataSet's DataTables and propagating modifications within the DataTables back to the database.

Note

Türü belirtilmiş veri kümeleri ve özel iş nesneleri kullanmanın avantajları ve dezavantajları hakkında daha fazla bilgi için, veri katmanı bileşenleri tasarlama ve katmanlar aracılığıyla veri geçirmekonusuna bakın.For more information on the advantages and disadvantages of using Typed DataSets versus custom business objects, refer to Designing Data Tier Components and Passing Data Through Tiers.

Bu öğreticiler mimarisi için kesin türü belirtilmiş veri kümeleri kullanacağız.We'll use strongly-typed DataSets for these tutorials' architecture. Şekil 3 ' te, yazılan veri kümelerini kullanan bir uygulamanın farklı katmanları arasındaki iş akışı gösterilmektedir.Figure 3 illustrates the workflow between the different layers of an application that uses Typed DataSets.

tüm veri erişim kodu DAL için yeniden dağıtılırAll Data Access Code is Relegated to the DAL

Şekil 3: tüm veri ERIŞIM kodu dal için yeniden dağıtılır (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 3: All Data Access Code is Relegated to the DAL (Click to view full-size image)

Türü belirtilmiş veri kümesi ve tablo bağdaştırıcısı oluşturmaCreating a Typed DataSet and Table Adapter

DAL oluşturmaya başlamak için, projemizi belirlenmiş bir veri kümesi ekleyerek başladık.To begin creating our DAL, we start by adding a Typed DataSet to our project. Bunu gerçekleştirmek için Çözüm Gezgini proje düğümüne sağ tıklayın ve yeni öğe Ekle ' yi seçin.To accomplish this, right-click on the project node in the Solution Explorer and choose Add a New Item. Şablon listesinden veri kümesi seçeneğini belirleyin ve Northwind.xsdadlandırın.Select the DataSet option from the list of templates and name it Northwind.xsd.

projenize yeni bir veri kümesi eklemeyi seçinChoose to Add a New DataSet to Your Project

Şekil 4: projenize yeni bir veri kümesi eklemeyi seçin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 4: Choose to Add a New DataSet to Your Project (Click to view full-size image)

Ekle ' ye tıkladıktan sonra, veri kümesini App_Code klasörüne eklemek isteyip istemediğiniz sorulduğunda Evet ' i seçin.After clicking Add, when prompted to add the DataSet to the App_Code folder, choose Yes. Daha sonra, yazılan veri kümesine ilişkin tasarımcı görüntülenir ve TableAdapter Yapılandırma Sihirbazı başlatılır ve bu işlem, türü belirtilmiş veri kümesine ilk TableAdapter eklemenizi sağlar.The Designer for the Typed DataSet will then be displayed, and the TableAdapter Configuration Wizard will start, allowing you to add your first TableAdapter to the Typed DataSet.

Türü belirtilmiş veri kümesi, kesin türü belirtilmiş bir veri koleksiyonu işlevi görür. her biri türü kesin belirlenmiş DataRow örneklerinden oluşan kesin türü belirtilmiş DataTable örneklerinden oluşur.A Typed DataSet serves as a strongly-typed collection of data; it is composed of strongly-typed DataTable instances, each of which is in turn composed of strongly-typed DataRow instances. Bu öğreticiler serisinde birlikte çalışması gereken temel alınan veritabanı tablolarının her biri için kesin olarak yazılmış bir DataTable oluşturacağız.We will create a strongly-typed DataTable for each of the underlying database tables that we need to work with in this tutorials series. Products tablosu için bir DataTable oluşturmaya başlayalım.Let's start with creating a DataTable for the Products table.

Türü kesin belirlenmiş DataTable 'ın, temel alınan veritabanı tablosundan verilere erişme hakkında herhangi bir bilgi içermediği göz önünde bulundurun.Keep in mind that strongly-typed DataTables do not include any information on how to access data from their underlying database table. DataTable 'ı doldurmak üzere verileri almak için veri erişim katmanımız olarak işlev gören bir TableAdapter sınıfı kullanırız.In order to retrieve the data to populate the DataTable, we use a TableAdapter class, which functions as our Data Access Layer. Products DataTable 'imiz için TableAdapter, sunum katmanından çağıracağımız yöntemleri GetProducts(), GetProductByCategoryID(categoryID)vb. içerir.For our Products DataTable, the TableAdapter will contain the methods GetProducts(), GetProductByCategoryID(categoryID), and so on that we'll invoke from the presentation layer. DataTable 'ın rolü, katmanlar arasında veri geçirmek için kullanılan türü kesin belirlenmiş nesneler olarak kullanılır.The DataTable's role is to serve as the strongly-typed objects used to pass data between the layers.

TableAdapter Yapılandırma Sihirbazı, hangi veritabanının birlikte çalışabileceği seçmenizi isteyerek başlar.The TableAdapter Configuration Wizard begins by prompting you to select which database to work with. Açılan listede bu veritabanları Sunucu Gezgini gösterilmektedir.The drop-down list shows those databases in the Server Explorer. Northwind veritabanını Sunucu Gezgini eklememediyseniz, şu anda yeni bağlantı düğmesine tıklayabilirsiniz.If you did not add the Northwind database to the Server Explorer, you can click the New Connection button at this time to do so.

, açılan listeden Northwind veritabanını seçinChoose the Northwind Database from the Drop-Down List

Şekil 5: açılan listeden Northwind veritabanını seçin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 5: Choose the Northwind Database from the Drop-Down List (Click to view full-size image)

Veritabanını seçip Ileri ' ye tıkladıktan sonra, Web.config dosyasına bağlantı dizesini kaydetmek isteyip istemediğiniz sorulur.After selecting the database and clicking Next, you'll be asked if you want to save the connection string in the Web.config file. Bağlantı dizesini kaydederek, daha sonra bağlantı dizesi bilgileri değişirse, TableAdapter sınıflarında sabit kodlanmış olmasını önleyin.By saving the connection string you'll avoid having it hard coded in the TableAdapter classes, which simplifies things if the connection string information changes in the future. Bağlantı dizesini yapılandırma dosyasına kaydetmeyi tercih ederseniz, daha sonra geliştirilmiş güvenlik için şifrelenen veya daha sonra IIS GUI yönetici aracı içindeki yeni ASP.NET 2,0 özellik sayfasından, daha sonra Yöneticiler için ideal olan <connectionStrings> bölümüne yerleştirilir.If you opt to save the connection string in the configuration file it's placed in the <connectionStrings> section, which can be optionally encrypted for improved security or modified later through the new ASP.NET 2.0 Property Page within the IIS GUI Admin Tool, which is more ideal for administrators.

bağlantı dizesini Web. config dosyasına kaydetSave the Connection String to Web.config

Şekil 6: bağlantı dizesini Web.config kaydetme (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 6: Save the Connection String to Web.config (Click to view full-size image)

Daha sonra, kesin olarak belirlenmiş ilk DataTable için şemayı tanımlamanız ve TableAdapter 'ızın kesin türü belirtilmiş veri kümesini doldururken kullanacağı ilk yöntemi sağlaması gerekir.Next, we need to define the schema for the first strongly-typed DataTable and provide the first method for our TableAdapter to use when populating the strongly-typed DataSet. Bu iki adım aynı anda DataTable 'umuza yansıtıldığımız tablodaki sütunları döndüren bir sorgu oluşturularak gerçekleştirilir.These two steps are accomplished simultaneously by creating a query that returns the columns from the table that we want reflected in our DataTable. Sihirbazın sonunda bu sorguya bir yöntem adı vereceğiz.At the end of the wizard we'll give a method name to this query. Bu yöntem alındıktan sonra sunum katmanınızdan çağrılabilir.Once that's been accomplished, this method can be invoked from our presentation layer. Yöntemi, tanımlı sorguyu yürütür ve türü kesin belirlenmiş bir DataTable olarak doldurur.The method will execute the defined query and populate a strongly-typed DataTable.

SQL sorgusunu tanımlamaya başlamak için önce TableAdapter 'ın sorguyu nasıl vermesini istediğinizi belirtmemiz gerekir.To get started defining the SQL query we must first indicate how we want the TableAdapter to issue the query. Geçici bir SQL ifadesini kullanabilir, yeni bir saklı yordam oluşturabilir veya var olan bir saklı yordamı kullanabilirsiniz.We can use an ad-hoc SQL statement, create a new stored procedure, or use an existing stored procedure. Bu öğreticiler için geçici SQL deyimlerini kullanacağız.For these tutorials we'll use ad-hoc SQL statements. Bkz. Brian Noyes'in makalesi, saklı yordamları kullanma örneği Için Visual Studio 2005 veri kümesi Tasarımcısı Ile veri erişim katmanı oluşturma .Refer to Brian Noyes's article, Build a Data Access Layer with the Visual Studio 2005 DataSet Designer for an example of using stored procedures.

geçici bir SQL Ifadesini kullanarak verileri sorgulamaQuery the Data Using an Ad-Hoc SQL Statement

Şekil 7: GEÇICI bir SQL Ifadesini kullanarak verileri sorgulama (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 7: Query the Data Using an Ad-Hoc SQL Statement (Click to view full-size image)

Bu noktada, SQL sorgusunu el ile yazabilirsiniz.At this point we can type in the SQL query by hand. TableAdapter içinde ilk yöntemi oluştururken, genellikle sorgunun karşılık gelen DataTable 'da ifade edilmesi gereken sütunları döndürmesini istersiniz.When creating the first method in the TableAdapter you typically want to have the query return those columns that need to be expressed in the corresponding DataTable. Products tablosundan tüm sütunları ve tüm satırları döndüren bir sorgu oluşturarak bunu gerçekleştirebiliriz:We can accomplish this by creating a query that returns all columns and all rows from the Products table:

metin kutusuna SQL sorgusunu girinEnter the SQL Query Into the Textbox

Şekil 8: metın kutusuna SQL sorgusunu girin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 8: Enter the SQL Query Into the Textbox (Click to view full-size image)

Alternatif olarak, Şekil 9 ' da gösterildiği gibi Sorgu Tasarımcısı kullanın ve sorguyu grafik olarak oluşturun.Alternatively, use the Query Builder and graphically construct the query, as shown in Figure 9.

sorgu Düzenleyicisi aracılığıyla sorguyu grafik olarak oluşturma Create the Query Graphically, through the Query Editor

Şekil 9: sorgu Düzenleyicisi aracılığıyla sorgu grafiksel olarak oluşturma (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 9: Create the Query Graphically, through the Query Editor (Click to view full-size image)

Sorguyu oluşturduktan sonra, bir sonraki ekrana geçmeden önce Gelişmiş Seçenekler düğmesine tıklayın.After creating the query, but before moving onto the next screen, click the Advanced Options button. Web sitesi projelerinde, "INSERT, Update ve delete deyimlerini oluştur" seçeneği varsayılan olarak seçilen tek gelişmiş seçenektir; Bu Sihirbazı bir sınıf kitaplığından veya bir Windows projesinden çalıştırırsanız, "iyimser eşzamanlılık kullan" seçeneği de işaretlenir.In Web Site Projects, "Generate Insert, Update, and Delete statements" is the only advanced option selected by default; if you run this wizard from a Class Library or a Windows Project the "Use optimistic concurrency" option will also be selected. Şimdilik "iyimser eşzamanlılık kullan" seçeneğini işaretsiz bırakın.Leave the "Use optimistic concurrency" option unchecked for now. Gelecekteki öğreticilerde iyimser eşzamanlılık inceleyeceğiz.We'll examine optimistic concurrency in future tutorials.

yalnızca INSERT, Update ve delete deyimlerini oluştur seçeneğini belirleyinSelect Only the Generate Insert, Update, and Delete statements Option

Şekil 10: yalnızca INSERT, Update ve delete deyimlerini oluştur seçeneğini belirleyin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 10: Select Only the Generate Insert, Update, and Delete statements Option (Click to view full-size image)

Gelişmiş seçenekleri doğruladıktan sonra, son ekrana ilerlemek için Ileri ' ye tıklayın.After verifying the advanced options, click Next to proceed to the final screen. Buraya, TableAdapter 'a eklenecek yöntemleri seçmemiz istenir.Here we are asked to select which methods to add to the TableAdapter. Veri doldurulmaya yönelik iki desen vardır:There are two patterns for populating data:

  • DataTable 'ı bu yaklaşım ile doldur bir yöntem, bir DataTable içinde parametre olarak alan ve sorgunun sonuçlarına göre doldurulur.Fill a DataTable with this approach a method is created that takes in a DataTable as a parameter and populates it based on the results of the query. Örneğin, ADO.NET DataAdapter sınıfı, bu kalıbı Fill() yöntemiyle uygular.The ADO.NET DataAdapter class, for example, implements this pattern with its Fill() method.
  • Bu yaklaşımla bir DataTable döndürün yöntemi, DataTable 'ı sizin için oluşturur ve doldurur ve yöntem dönüş değeri olarak döndürür.Return a DataTable with this approach the method creates and fills the DataTable for you and returns it as the methods return value.

TableAdapter 'ın Bu desenlerden birini veya her ikisini birden uygulayabilmeniz gerekir.You can have the TableAdapter implement one or both of these patterns. Burada sunulan yöntemleri de yeniden adlandırabilirsiniz.You can also rename the methods provided here. Her iki onay kutusu da yalnızca bu öğreticiler boyunca yalnızca ikinci kalıbı kullanacağız.Let's leave both checkboxes checked, even though we'll only be using the latter pattern throughout these tutorials. Ayrıca, GetProductsiçin bunun yerine bu genel GetData yöntemini yeniden adlandıralım.Also, let's rename the rather generic GetData method to GetProducts.

İşaretliyse, son onay kutusu "GenerateDBDirectMethods", TableAdapter için Insert(), Update()ve Delete() yöntemleri oluşturur.If checked, the final checkbox, "GenerateDBDirectMethods," creates Insert(), Update(), and Delete() methods for the TableAdapter. Bu seçeneği işaretlenmemiş olarak bırakırsanız, tüm güncelleştirmelerin, türü belirtilmiş veri kümesini, bir DataTable 'ı, tek bir DataRow 'ı veya bir DataRow dizisini alan TableAdapter 'ın tek Update() yöntemi aracılığıyla yapılması gerekir.If you leave this option unchecked, all updates will need to be done through the TableAdapter's sole Update() method, which takes in the Typed DataSet, a DataTable, a single DataRow, or an array of DataRows. (Şekil 9 ' da Gelişmiş özelliklerde "INSERT, Update ve delete deyimlerini üret" seçeneğini işaretlemezseniz, bu onay kutusunun ayarı hiçbir etkiye sahip olmayacaktır.) Bu onay kutusunu seçili bırakalım.(If you've unchecked the "Generate Insert, Update, and Delete statements" option from the advanced properties in Figure 9 this checkbox's setting will have no effect.) Let's leave this checkbox selected.

yöntem adını GetData öğesinden GetProducts olarak değiştirinChange the Method Name from GetData to GetProducts

Şekil 11: yöntem adını GetData GetProducts olarak değiştirin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 11: Change the Method Name from GetData to GetProducts (Click to view full-size image)

Son ' a tıklayarak Sihirbazı doldurun.Complete the wizard by clicking Finish. Sihirbaz kapandıktan sonra, yeni oluşturduğumuz DataTable 'ı gösteren veri kümesi tasarımcısına döndürülür.After the wizard closes we are returned to the DataSet Designer which shows the DataTable we just created. Products DataTable (ProductID, ProductName, vb.) ve ProductsTableAdapter Yöntemleri (Fill() ve GetProducts()) için sütun listesini görebilirsiniz.You can see the list of columns in the Products DataTable (ProductID, ProductName, and so on), as well as the methods of the ProductsTableAdapter (Fill() and GetProducts()).

DataTable ve ProductsTableAdapter ürünlerini yazılan veri kümesine eklenmiştirThe Products DataTable and ProductsTableAdapter have been Added to the Typed DataSet

Şekil 12: Products DataTable ve ProductsTableAdapter türü belirtilmiş veri kümesine eklenmiştir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 12: The Products DataTable and ProductsTableAdapter have been Added to the Typed DataSet (Click to view full-size image)

Bu noktada, bir GetProducts() yöntemiyle tek bir DataTable (Northwind.Products) ve kesin türü belirtilmiş bir DataAdapter sınıfı (NorthwindTableAdapters.ProductsTableAdapter) içeren bir veri kümesi vardır.At this point we have a Typed DataSet with a single DataTable (Northwind.Products) and a strongly-typed DataAdapter class (NorthwindTableAdapters.ProductsTableAdapter) with a GetProducts() method. Bu nesneler, aşağıdaki koddan tüm ürünlerin listesine erişmek için kullanılabilir:These objects can be used to access a list of all products from code like:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim products as Northwind.ProductsDataTable
products = productsAdapter.GetProducts()
For Each productRow As Northwind.ProductsRow In products
    Response.Write("Product: " & productRow.ProductName & "<br />")
Next

Bu kod, bir bit veri erişimine özgü kod yazmamızı gerektirmez.This code did not require us to write one bit of data access-specific code. Herhangi bir ADO.NET sınıfını örnekliyoruz, herhangi bir bağlantı dizesine, SQL sorgusuna veya saklı yordamlara başvurmamalıdır.We did not have to instantiate any ADO.NET classes, we didn't have to refer to any connection strings, SQL queries, or stored procedures. Bunun yerine TableAdapter, bizim için alt düzey veri erişim kodunu sağlar.Instead, the TableAdapter provides the low-level data access code for us.

Bu örnekte kullanılan her nesne Ayrıca kesin olarak belirlenmiş, Visual Studio 'Nun IntelliSense ve derleme zamanı tür denetimi sağlamasına izin verir.Each object used in this example is also strongly-typed, allowing Visual Studio to provide IntelliSense and compile-time type checking. TableAdapter tarafından döndürülen tüm DataTable, GridView, DetailsView, DropDownList, CheckBoxList gibi ASP.NET Data Web denetimlerine bağlanabilir.And best of all the DataTables returned by the TableAdapter can be bound to ASP.NET data Web controls, such as the GridView, DetailsView, DropDownList, CheckBoxList, and several others. Aşağıdaki örnek, GetProducts() yöntemi tarafından döndürülen DataTable 'ın, Page_Load olay işleyicisi içinde yalnızca bir yalnızca scant üç satır kodu içindeki GridView 'a bağlamasını gösterir.The following example illustrates binding the DataTable returned by the GetProducts() method to a GridView in just a scant three lines of code within the Page_Load event handler.

AllProducts.aspxAllProducts.aspx

<%@ Page Language="VB" AutoEventWireup="true" CodeFile="AllProducts.aspx.vb"
    Inherits="AllProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>View All Products in a GridView</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>
            All Products</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

AllProducts.aspx.vbAllProducts.aspx.vb

Imports NorthwindTableAdapters
Partial Class AllProducts
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim productsAdapter As New ProductsTableAdapter
        GridView1.DataSource = productsAdapter.GetProducts()
        GridView1.DataBind()
    End Sub
End Class

ürünlerin listesi bir GridView içinde görüntülenirThe List of Products is Displayed in a GridView

Şekil 13: ürünlerin listesi bir GridView 'da görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 13: The List of Products is Displayed in a GridView (Click to view full-size image)

Bu örnek, ASP.NET sayfamızda Page_Load olay işleyicimize üç satır kod yazmanızı gerektirirken, gelecekteki öğreticilerde, verileri DAL içinden bildirimli olarak almak için ObjectDataSource 'un nasıl kullanılacağını inceleyeceğiz.While this example required that we write three lines of code in our ASP.NET page's Page_Load event handler, in future tutorials we'll examine how to use the ObjectDataSource to declaratively retrieve the data from the DAL. ObjectDataSource ile herhangi bir kod yazmak zorunda olmayacaktır ve sayfalama ve sıralama desteğini de alacak!With the ObjectDataSource we'll not have to write any code and will get paging and sorting support as well!

3. Adım: veri erişim katmanına parametreli Yöntemler EklemeStep 3: Adding Parameterized Methods to the Data Access Layer

Bu noktada ProductsTableAdapter sınıfınız, veritabanındaki tüm ürünleri döndüren GetProducts()bir yöntem içerir.At this point our ProductsTableAdapter class has but one method, GetProducts(), which returns all of the products in the database. Tüm ürünlerle çalışabilmeniz mümkün olsa da, belirli bir ürün veya belirli bir kategoriye ait olan tüm ürünler hakkında bilgi almak istediğimiz durumlar vardır.While being able to work with all products is definitely useful, there are times when we'll want to retrieve information about a specific product, or all products that belong to a particular category. Veri erişim katmanımız gibi işlevselliği eklemek için TableAdapter 'a parametreli Yöntemler ekleyebiliriz.To add such functionality to our Data Access Layer we can add parameterized methods to the TableAdapter.

GetProductsByCategoryID(categoryID) yöntemini ekleyelim.Let's add the GetProductsByCategoryID(categoryID) method. DAL 'e yeni bir yöntem eklemek için veri kümesi Tasarımcısına dönün, ProductsTableAdapter bölümüne sağ tıklayın ve sorgu Ekle ' yi seçin.To add a new method to the DAL, return to the DataSet Designer, right-click in the ProductsTableAdapter section, and choose Add Query.

TableAdapter 'a sağ tıklayın ve sorgu Ekle ' yi seçin.

Şekil 14: TableAdapter 'A sağ tıklayın ve sorgu Ekle ' yi seçin.Figure 14: Right-Click on the TableAdapter and Choose Add Query

İlk olarak, veritabanına geçici bir SQL ifadesini veya yeni veya mevcut bir saklı yordamı kullanarak erişmek isteyip istemediğimiz sorulur.We are first prompted about whether we want to access the database using an ad-hoc SQL statement or a new or existing stored procedure. Geçici bir SQL ifadesini yeniden kullanmayı seçelim.Let's choose to use an ad-hoc SQL statement again. Ardından, kullanmak istediğimiz SQL sorgusu türü sorulur.Next, we are asked what type of SQL query we'd like to use. Belirtilen bir kategoriye ait tüm ürünleri döndürmek istediğimize göre, satırları döndüren bir SELECT deyimleri yazmak istiyoruz.Since we want to return all products that belong to a specified category, we want to write a SELECT statement which returns rows.

satırları döndüren bir SELECT Ifadesinin oluşturulmasını seçinChoose to Create a SELECT Statement Which Returns Rows

Şekil 15: satırları döndüren bir SELECT deyimin oluşturulmasını seçin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 15: Choose to Create a SELECT Statement Which Returns Rows (Click to view full-size image)

Sonraki adım, verilere erişmek için kullanılan SQL sorgusunu tanımlamaktır.The next step is to define the SQL query used to access the data. Yalnızca belirli bir kategoriye ait ürünleri döndürmek istediğimize göre, GetProducts()aynı SELECT deyimi kullanıyorum, ancak şu WHERE yan tümcesini ekleyin: WHERE CategoryID = @CategoryID.Since we want to return only those products that belong to a particular category, I use the same SELECT statement from GetProducts(), but add the following WHERE clause: WHERE CategoryID = @CategoryID. @CategoryID parametresi, bir TableAdapter sihirbazına, oluşturmakta olduğumuz yöntemin ilgili türde (yani, null atanabilir bir tamsayı) bir giriş parametresi gerektirdiğini gösterir.The @CategoryID parameter indicates to the TableAdapter wizard that the method we're creating will require an input parameter of the corresponding type (namely, a nullable integer).

yalnızca belirtilen bir kategorideki ürünlerin döndürülmesi için bir sorgu girinEnter a Query to Only Return Products in a Specified Category

Şekil 16: yalnızca belirtilen bir kategorideki ürünleri döndürmek Için bir sorgu girin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 16: Enter a Query to Only Return Products in a Specified Category (Click to view full-size image)

Son adımda, hangi veri erişimi desenlerini kullanacağınızı ve oluşturulan yöntemlerin adlarını özelleştirmenizi seçebiliriz.In the final step we can choose which data access patterns to use, as well as customize the names of the methods generated. Fill deseninin adı FillByCategoryID olarak değiştirelim ve bir DataTable Return deseninin (GetX yöntemleri) döndürdüğü GetProductsByCategoryIDkullanalım.For the Fill pattern, let's change the name to FillByCategoryID and for the return a DataTable return pattern (the GetX methods), let's use GetProductsByCategoryID.

TableAdapter yöntemlerinin adlarını seçin Choose the Names for the TableAdapter Methods

Şekil 17: TableAdapter metotları için adları seçin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 17: Choose the Names for the TableAdapter Methods (Click to view full-size image)

Sihirbazı tamamladıktan sonra, veri kümesi Tasarımcısı yeni TableAdapter yöntemlerini içerir.After completing the wizard, the DataSet Designer includes the new TableAdapter methods.

Ürünler artık kategori ile sorgulanabilecek

Şekil 18: ürünler artık kategori ile sorgulanabilecekFigure 18: The Products Can Now be Queried by Category

Aynı tekniği kullanarak bir GetProductByProductID(productID) yöntemi eklemek için bir dakikanızı ayırın.Take a moment to add a GetProductByProductID(productID) method using the same technique.

Bu parametreli sorgular doğrudan veri kümesi tasarımcısından test edilebilir.These parameterized queries can be tested directly from the DataSet Designer. TableAdapter ' ta yönteme sağ tıklayın ve verileri Önizle ' yi seçin.Right-click on the method in the TableAdapter and choose Preview Data. Ardından, parametreler için kullanılacak değerleri girin ve Önizleme ' ye tıklayın.Next, enter the values to use for the parameters and click Preview.

Alkolların kategorisine ait olan ürünler gösterilirThose Products Belonging to the Beverages Category are Shown

Şekil 19: Içecek kategorisine ait olan ürünler gösterilir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 19: Those Products Belonging to the Beverages Category are Shown (Click to view full-size image)

GetProductsByCategoryID(categoryID) yöntemi ile, artık yalnızca belirtilen bir kategorideki ürünleri görüntüleyen bir ASP.NET sayfası oluşturuyoruz.With the GetProductsByCategoryID(categoryID) method in our DAL, we can now create an ASP.NET page that displays only those products in a specified category. Aşağıdaki örnek, CategoryID 1 olan Içecek kategorisindeki tüm ürünleri gösterir.The following example shows all products that are in the Beverages category, which have a CategoryID of 1.

İçecek. aspxBeverages.aspx

<%@ Page Language="VB" AutoEventWireup="true" CodeFile="Beverages.aspx.vb"
    Inherits="Beverages" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>Beverages</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             CssClass="DataWebControlStyle">
               <HeaderStyle CssClass="HeaderStyle" />
               <AlternatingRowStyle CssClass="AlternatingRowStyle" />
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

İçecek. aspx. vbBeverages.aspx.vb

Imports NorthwindTableAdapters
Partial Class Beverages
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim productsAdapter As New ProductsTableAdapter
        GridView1.DataSource =
         productsAdapter.GetProductsByCategoryID(1)
        GridView1.DataBind()
    End Sub
End Class

Içecek kategorisindeki Bu ürünler görüntülenirThose Products in the Beverages Category are Displayed

Şekil 20: alkoller kategorisindeki Ürünler görüntülenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 20: Those Products in the Beverages Category are Displayed (Click to view full-size image)

4. Adım: verileri ekleme, güncelleştirme ve silmeStep 4: Inserting, Updating, and Deleting Data

Verileri eklemek, güncelleştirmek ve silmek için yaygın olarak kullanılan iki desen vardır.There are two patterns commonly used for inserting, updating, and deleting data. Veritabanı doğrudan modelini çağıracağımız ilk model, çağrıldığında, tek bir veritabanı kaydında çalışan veritabanına INSERT, UPDATEveya DELETE komutu veren Yöntemler oluşturmayı içerir.The first pattern, which I'll call the database direct pattern, involves creating methods that, when invoked, issue an INSERT, UPDATE, or DELETE command to the database that operates on a single database record. Bu tür yöntemler genellikle INSERT, Update veya delete değerlerine karşılık gelen bir dizi skalar değer (tamsayılar, dizeler, Boolean, DateTimes, vb.) dizisine geçirilir.Such methods are typically passed in a series of scalar values (integers, strings, Booleans, DateTimes, and so on) that correspond to the values to insert, update, or delete. Örneğin, Products tablosu için bu Düzenle, Delete yöntemi, silinecek kaydın ProductID belirten bir Integer parametresi içinde, Insert yöntemi ProductNameiçin bir dize, UnitPriceiçin bir tamsayı, UnitsOnStockiçin bir tamsayı, vb. için bir tamsayı alır.For example, with this pattern for the Products table the delete method would take in an integer parameter, indicating the ProductID of the record to delete, while the insert method would take in a string for the ProductName, a decimal for the UnitPrice, an integer for the UnitsOnStock, and so on.

Her ekleme, güncelleştirme ve silme Isteği veritabanına hemen gönderilir Each Insert, Update, and Delete Request is Sent to the Database Immediately

Şekil 21: her ekleme, güncelleştirme ve silme Isteği veritabanına hemen gönderilir (tam boyutlu görüntüyü görüntülemek için tıklatın)Figure 21: Each Insert, Update, and Delete Request is Sent to the Database Immediately (Click to view full-size image)

Toplu güncelleştirme düzeninde başvurabileceğiniz diğer bir model, bir yöntem çağrısında tüm veri kümesini, DataTable 'ı veya DataRow koleksiyonunu güncelleştirmek olacaktır.The other pattern, which I'll refer to as the batch update pattern, is to update an entire DataSet, DataTable, or collection of DataRows in one method call. Bu düzende bir geliştirici DataTable içindeki DataRow 'ı siler, ekler ve değiştirir ve ardından bu DataRow veya DataTable 'ı bir Update metoduna geçirir.With this pattern a developer deletes, inserts, and modifies the DataRows in a DataTable and then passes those DataRows or DataTable into an update method. Bu yöntem daha sonra geçirilen DataRow öğesini numaralandırır, değiştirilip değiştirilmediğini, eklendiğini veya silindiğini (DataRow 'ın RowState özelliği değeri aracılığıyla) belirler ve her kayıt için uygun veritabanı isteğini yayınlar.This method then enumerates the DataRows passed in, determines whether or not they've been modified, added, or deleted (via the DataRow's RowState property value), and issues the appropriate database request for each record.

güncelleştirme yöntemi çağrıldığında tüm değişiklikler veritabanıyla eşitlenirAll Changes are Synchronized with the Database When the Update Method is Invoked

Şekil 22: güncelleştirme yöntemi çağrıldığında tüm değişiklikler veritabanıyla eşitlenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 22: All Changes are Synchronized with the Database When the Update Method is Invoked (Click to view full-size image)

TableAdapter varsayılan olarak Batch güncelleştirme modelini kullanır, ancak VERITABANı doğrudan modelini de destekler.The TableAdapter uses the batch update pattern by default, but also supports the DB direct pattern. TableAdapter ' ı oluştururken gelişmiş özelliklerden "INSERT, Update ve delete deyimlerini üret" seçeneğini belirlediğimiz için, ProductsTableAdapter Batch Update modelini uygulayan bir Update() yöntemi içerir.Since we selected the "Generate Insert, Update, and Delete statements" option from the Advanced Properties when creating our TableAdapter, the ProductsTableAdapter contains an Update() method, which implements the batch update pattern. Özellikle TableAdapter, türü belirtilmiş veri kümesini, türü kesin belirlenmiş bir DataTable 'ı veya bir ya da daha fazla DataRow 'ı geçirilebilecek bir Update() yöntemi içerir.Specifically, the TableAdapter contains an Update() method that can be passed the Typed DataSet, a strongly-typed DataTable, or one or more DataRows. TableAdapter oluştururken "GenerateDBDirectMethods" onay kutusunu işaretlerseniz, VERITABANı doğrudan deseninin de Insert(), Update()ve Delete() yöntemleri aracılığıyla uygulanması gerekir.If you left the "GenerateDBDirectMethods" checkbox checked when first creating the TableAdapter the DB direct pattern will also be implemented via Insert(), Update(), and Delete() methods.

Her iki veri değişikliği deseni, INSERT, UPDATEve DELETE komutlarını veritabanına vermek için TableAdapter 'ın InsertCommand, UpdateCommandve DeleteCommand özelliklerini kullanır.Both data modification patterns use the TableAdapter's InsertCommand, UpdateCommand, and DeleteCommand properties to issue their INSERT, UPDATE, and DELETE commands to the database. InsertCommand, UpdateCommandve DeleteCommand özelliklerini, veri kümesi tasarımcısında TableAdapter ' a tıklayıp ardından Özellikler penceresi ' a giderek inceleyebilirsiniz.You can inspect and modify the InsertCommand, UpdateCommand, and DeleteCommand properties by clicking on the TableAdapter in the DataSet Designer and then going to the Properties window. (TableAdapter ' ı seçtiğinizden ve ProductsTableAdapter nesnesinin Özellikler penceresi açılan listede seçili olduğundan emin olun.)(Make sure you have selected the TableAdapter, and that the ProductsTableAdapter object is the one selected in the drop-down list in the Properties window.)

TableAdapter 'ın InsertCommand, UpdateCommand ve DeleteCommand özelliklerine sahip The TableAdapter has InsertCommand, UpdateCommand, and DeleteCommand Properties

Şekil 23: TableAdapter InsertCommand, UpdateCommandve DeleteCommand özelliklerine sahiptir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 23: The TableAdapter has InsertCommand, UpdateCommand, and DeleteCommand Properties (Click to view full-size image)

Bu veritabanı komut özelliklerinden herhangi birini incelemek veya değiştirmek için, Sorgu Tasarımcısı CommandText alt özelliğine tıklayın.To examine or modify any of these database command properties, click on the CommandText subproperty, which will bring up the Query Builder.

Sorgu Tasarımcısı INSERT, UPDATE ve DELETE deyimlerini yapılandırma Configure the INSERT, UPDATE, and DELETE Statements in the Query Builder

Şekil 24: Sorgu Tasarımcısı INSERT, UPDATEve DELETE deyimlerini yapılandırın (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 24: Configure the INSERT, UPDATE, and DELETE Statements in the Query Builder (Click to view full-size image)

Aşağıdaki kod örneği, toplu güncelleştirme düzeninin, son olmayan ve stokta 25 birime sahip olan tüm ürünlerin fiyatını iki katına eklemek için nasıl kullanılacağını gösterir:The following code example shows how to use the batch update pattern to double the price of all products that are not discontinued and that have 25 units in stock or less:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim products As Northwind.ProductsDataTable = productsAdapter.GetProducts()
For Each product As Northwind.ProductsRow In products
   If Not product.Discontinued AndAlso product.UnitsInStock <= 25 Then
      product.UnitPrice *= 2
   End if
Next
productsAdapter.Update(products)

Aşağıdaki kod, belirli bir ürünü programlı olarak silmek, sonra güncelleştirmek ve yeni bir ürün eklemek için DB doğrudan deseninin nasıl kullanılacağını göstermektedir:The code below illustrates how to use the DB direct pattern to programmatically delete a particular product, then update one, and then add a new one:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
productsAdapter.Delete(3)
productsAdapter.Update( _
    "Chai", 1, 1, "10 boxes x 20 bags", 18.0, 39, 15, 10, false, 1)
productsAdapter.Insert( _
    "New Product", 1, 1, "12 tins per carton", 14.95, 15, 0, 10, false)

Özel ekleme, güncelleştirme ve silme yöntemleri oluşturmaCreating Custom Insert, Update, and Delete Methods

VERITABANı doğrudan yöntemi tarafından oluşturulan Insert(), Update()ve Delete() yöntemleri, özellikle birden çok sütun içeren tablolar için bir bit, biraz kısası olabilir.The Insert(), Update(), and Delete() methods created by the DB direct method can be a bit cumbersome, especially for tables with many columns. Önceki kod örneğine bakıyor, IntelliSense 'in yardımı olmadan, Update() ve Insert() yöntemlerine her giriş parametresine hangi Products tablo sütununu eşlediğini özellikle temizlemez.Looking at the previous code example, without IntelliSense's help it's not particularly clear what Products table column maps to each input parameter to the Update() and Insert() methods. Yalnızca tek bir sütunu veya ikisini de güncelleştirmek istediğimiz ya da bir özelleştirilmiş Insert() yönteminin, yani yeni eklenen kaydın IDENTITY (otomatik artış) alanının değerini döndürdüğü durumlar olabilir.There may be times when we only want to update a single column or two, or want a customized Insert() method that will, perhaps, return the value of the newly inserted record's IDENTITY (auto-increment) field.

Böyle bir özel yöntem oluşturmak için veri kümesi Tasarımcısına dönün.To create such a custom method, return to the DataSet Designer. TableAdapter 'a sağ tıklayın ve TableAdapter sihirbazına dönerek sorgu Ekle ' yi seçin.Right-click on the TableAdapter and choose Add Query, returning to the TableAdapter wizard. İkinci ekranda, oluşturulacak sorgunun türünü belirtebiliriz.On the second screen we can indicate the type of query to create. Yeni bir ürün ekleyen ve sonra yeni eklenen kaydın ProductIDdeğerini döndüren bir yöntem oluşturalım.Let's create a method that adds a new product and then returns the value of the newly added record's ProductID. Bu nedenle, INSERT bir sorgu oluşturmayı tercih edin.Therefore, opt to create an INSERT query.

Products tablosuna yeni bir satır eklemek için bir yöntem oluşturmaCreate a Method to Add a New Row to the Products Table

Şekil 25: Products tabloya yeni bir satır eklemek Için bir yöntem oluşturun (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 25: Create a Method to Add a New Row to the Products Table (Click to view full-size image)

Sonraki ekranda InsertCommand``CommandText görüntülenir.On the next screen the InsertCommand's CommandText appears. Bu sorguyu, sorgunun sonuna SELECT SCOPE_IDENTITY() ekleyerek, aynı kapsamda bir IDENTITY sütununa eklenen son kimlik değerini döndürecek şekilde artırabilir.Augment this query by adding SELECT SCOPE_IDENTITY() at the end of the query, which will return the last identity value inserted into an IDENTITY column in the same scope. (SCOPE_IDENTITY() hakkında daha fazla bilgi için teknik belgelere ve neden büyük olasılıkla @@IDENTITYyerıne kapsam_kimliği () kullanmak istediğimize bakın.) SELECT ifadesini eklemeden önce INSERT ifadesini noktalı virgül ile sonlandırdığınızdan emin olun.(See the technical documentation for more information about SCOPE_IDENTITY() and why you probably want to use SCOPE_IDENTITY() in lieu of @@IDENTITY.) Make sure that you end the INSERT statement with a semi-colon before adding the SELECT statement.

SCOPE_IDENTITY () değerini döndürecek şekilde sorguyu artırmakAugment the Query to Return the SCOPE_IDENTITY() Value

Şekil 26: SCOPE_IDENTITY() değerini döndürmek için sorguyu artırmak (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 26: Augment the Query to Return the SCOPE_IDENTITY() Value (Click to view full-size image)

Son olarak, yeni yöntemi InsertProductadlandırın.Finally, name the new method InsertProduct.

Yeni yöntem adını InsertProduct olarak ayarlamak Set the New Method Name to InsertProduct

Şekil 27: yeni yöntem adını InsertProduct olarak ayarlayın (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 27: Set the New Method Name to InsertProduct (Click to view full-size image)

Veri kümesi tasarımcısına geri döndüğünüzde, ProductsTableAdapter InsertProductyeni bir yöntem içerdiğini görürsünüz.When you return to the DataSet Designer you'll see that the ProductsTableAdapter contains a new method, InsertProduct. Bu yeni yöntemin Products tablodaki her bir sütun için bir parametresi yoksa, INSERT deyimini noktalı virgülle sonlandırmayı unutmanız gerekir.If this new method doesn't have a parameter for each column in the Products table, chances are you forgot to terminate the INSERT statement with a semi-colon. InsertProduct yöntemini yapılandırın ve INSERT ve SELECT deyimlerini sınırlayan noktalı virgülle ayırın.Configure the InsertProduct method and ensure you have a semi-colon delimiting the INSERT and SELECT statements.

Varsayılan olarak, ekleme yöntemleri sorgu dışı Yöntemler vererek etkilenen satırların sayısını döndürtikleri anlamına gelir.By default, insert methods issue non-query methods, meaning that they return the number of affected rows. Ancak, InsertProduct yönteminin, etkilenen satır sayısı değil, sorgu tarafından döndürülen değeri döndürmesini istiyoruz.However, we want the InsertProduct method to return the value returned by the query, not the number of rows affected. Bunu gerçekleştirmek için, InsertProduct yönteminin ExecuteMode özelliğini Scalarolarak ayarlayın.To accomplish this, adjust the InsertProduct method's ExecuteMode property to Scalar.

ExecuteMode özelliğini skaler olarak değiştirmeChange the ExecuteMode Property to Scalar

Şekil 28: ExecuteMode özelliğini Scalar olarak değiştirin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 28: Change the ExecuteMode Property to Scalar (Click to view full-size image)

Aşağıdaki kod bu yeni InsertProduct metodunu eylemde gösterir:The following code shows this new InsertProduct method in action:

Dim productsAdapter As New NorthwindTableAdapters.ProductsTableAdapter()
Dim new_productID As Integer = Convert.ToInt32(productsAdapter.InsertProduct( _
    "New Product", 1, 1, "12 tins per carton", 14.95, 10, 0, 10, false))
productsAdapter.Delete(new_productID)

5. Adım: veri erişim katmanını tamamlamaStep 5: Completing the Data Access Layer

ProductsTableAdapters sınıfının Products tablosundan CategoryID ve SupplierID değerlerini döndürdüğünü, ancak bu büyük olasılıkla ürün bilgilerini gösterirken, CategoryName tablosundan veya Categories sütunundan CompanyName sütununu içermediğini unutmayın.SuppliersNote that the ProductsTableAdapters class returns the CategoryID and SupplierID values from the Products table, but doesn't include the CategoryName column from the Categories table or the CompanyName column from the Suppliers table, although these are likely the columns we want to display when showing product information. TableAdapter 'ın ilk yöntemini GetProducts(), hem CategoryName hem de CompanyName sütun değerlerini dahil etmek için, bu yeni sütunları da içerecek şekilde kesin olarak yazılmış DataTable 'ı güncelleştirecek şekilde,.We can augment the TableAdapter's initial method, GetProducts(), to include both the CategoryName and CompanyName column values, which will update the strongly-typed DataTable to include these new columns as well.

Bu, bir sorun oluşturabilir, ancak TableAdapter 'ın veri ekleme, güncelleştirme ve silme yöntemleri bu başlangıç yöntemine göre yapılır.This can present a problem, however, as the TableAdapter's methods for inserting, updating, and deleting data are based off of this initial method. Neyse ki, ekleme, güncelleştirme ve silme için otomatik olarak oluşturulan Yöntemler SELECT yan tümcesindeki alt sorgularda etkilenmez.Fortunately, the auto-generated methods for inserting, updating, and deleting are not affected by subqueries in the SELECT clause. Sorguları Categories ve Suppliers JOIN s yerine alt sorgular olarak eklemek için, verileri değiştirmek için bu yöntemleri yeniden yapmak zorunda kalmaktan kaçınacağız.By taking care to add our queries to Categories and Suppliers as subqueries, rather than JOIN s, we'll avoid having to rework those methods for modifying data. ProductsTableAdapter GetProducts() yöntemine sağ tıklayın ve Yapılandır ' ı seçin.Right-click on the GetProducts() method in the ProductsTableAdapter and choose Configure. Ardından, SELECT yan tümcesini, şöyle görünmesi için ayarlayın:Then, adjust the SELECT clause so that it looks like:

SELECT     ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, ReorderLevel, Discontinued,
(SELECT CategoryName FROM Categories
WHERE Categories.CategoryID = Products.CategoryID) as CategoryName,
(SELECT CompanyName FROM Suppliers
WHERE Suppliers.SupplierID = Products.SupplierID) as SupplierName
FROM         Products

GetProducts () yöntemi için SELECT Ifadesini güncelleştirme Update the SELECT Statement for the GetProducts() Method

Şekil 29: GetProducts() yöntemi Için SELECT ifadesini güncelleştirin (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 29: Update the SELECT Statement for the GetProducts() Method (Click to view full-size image)

GetProducts() yöntemini bu yeni sorguyu kullanacak şekilde güncelleştirdikten sonra DataTable iki yeni sütun içerir: CategoryName ve SupplierName.After updating the GetProducts() method to use this new query the DataTable will include two new columns: CategoryName and SupplierName.

Products DataTable 'ın Iki yeni sütunu vardır

Şekil 30: Products DataTable 'ın Iki yeni sütunu vardırFigure 30: The Products DataTable has Two New Columns

GetProductsByCategoryID(categoryID) yönteminde SELECT yan tümcesini de güncellemek için bir dakikanızı ayırın.Take a moment to update the SELECT clause in the GetProductsByCategoryID(categoryID) method as well.

JOIN sözdizimini kullanarak GetProducts() SELECT güncelleştirirseniz veri kümesi Tasarımcısı, veritabanı verilerini ekleme, güncelleştirme ve silme yöntemlerini DB doğrudan düzeniyle otomatik olarak oluşturamayacak.If you update the GetProducts() SELECT using JOIN syntax the DataSet Designer won't be able to auto-generate the methods for inserting, updating, and deleting database data using the DB direct pattern. Bunun yerine, Bu öğreticinin önceki kısımlarında InsertProduct yöntemi ile yaptığımız gibi el ile oluşturmanız gerekir.Instead, you'll have to manually create them much like we did with the InsertProduct method earlier in this tutorial. Ayrıca, Batch güncelleştirme modelini kullanmak istiyorsanız, InsertCommand, UpdateCommandve DeleteCommand özellik değerlerini el ile sağlamanız gerekir.Furthermore, you'll manually have to provide the InsertCommand, UpdateCommand, and DeleteCommand property values if you want to use the batch updating pattern.

Kalan TableAdapters eklemeAdding the Remaining TableAdapters

Şimdi tek bir veritabanı tablosu için tek bir TableAdapter ile çalışmaya bakıyoruz.Up until now, we've only looked at working with a single TableAdapter for a single database table. Bununla birlikte, Northwind veritabanı Web uygulamamızda ile birlikte çalışmak için gereken birkaç ilgili tablo içerir.However, the Northwind database contains several related tables that we'll need to work with in our web application. Türü belirtilmiş bir veri kümesi birden çok, ilgili DataTable içerebilir.A Typed DataSet can contain multiple, related DataTables. Bu nedenle, DAL olarak bu öğreticilerde kullanacağımız diğer tablolar için DataTable eklememiz gerekiyor.Therefore, to complete our DAL we need to add DataTables for the other tables we'll be using in these tutorials. Türü belirtilmiş bir veri kümesine yeni bir TableAdapter eklemek için veri kümesi tasarımcısını açın, tasarımcıya sağ tıklayın ve Ekle/TableAdapter ' ı seçin.To add a new TableAdapter to a Typed DataSet, open the DataSet Designer, right-click in the Designer, and choose Add / TableAdapter. Bu, yeni bir DataTable ve TableAdapter oluşturur ve bu öğreticide daha önce incelendiğimiz sihirbazda size kılavuzluk eder.This will create a new DataTable and TableAdapter and walk you through the wizard we examined earlier in this tutorial.

Aşağıdaki sorguları kullanarak aşağıdaki TableAdapters ve yöntemleri oluşturmak için birkaç dakikanızı alın.Take a few minutes to create the following TableAdapters and methods using the following queries. ProductsTableAdapter sorguların her ürünün kategori ve Tedarikçi adlarını almak için alt sorguları olduğunu unutmayın.Note that the queries in the ProductsTableAdapter include the subqueries to grab each product's category and supplier names. Ayrıca, daha sonra takip ediyorsanız, ProductsTableAdapter sınıfın GetProducts() ve GetProductsByCategoryID(categoryID) yöntemlerini zaten eklemiş oldunuz.Additionally, if you've been following along, you've already added the ProductsTableAdapter class's GetProducts() and GetProductsByCategoryID(categoryID) methods.

  • ProductsTableAdapterProductsTableAdapter

    • GetProducts:GetProducts:

      SELECT     ProductID, ProductName, SupplierID, 
      CategoryID, QuantityPerUnit, UnitPrice, UnitsInStock, 
      UnitsOnOrder, ReorderLevel, Discontinued, 
      (SELECT CategoryName FROM Categories WHERE
      Categories.CategoryID = Products.CategoryID) as 
      CategoryName, (SELECT CompanyName FROM Suppliers
      WHERE Suppliers.SupplierID = Products.SupplierID) 
      as SupplierName
      FROM         Products
      
    • Getproductsbycategoryıd:GetProductsByCategoryID:

      SELECT     ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued, (SELECT CategoryName
      FROM Categories WHERE Categories.CategoryID = 
      Products.CategoryID) as CategoryName,
      (SELECT CompanyName FROM Suppliers WHERE
      Suppliers.SupplierID = Products.SupplierID)
      as SupplierName
      FROM         Products
      WHERE      CategoryID = @CategoryID
      
    • Getproductsbysupplierıd:GetProductsBySupplierID:

      SELECT     ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued, (SELECT CategoryName
      FROM Categories WHERE Categories.CategoryID = 
      Products.CategoryID) as CategoryName, 
      (SELECT CompanyName FROM Suppliers WHERE 
      Suppliers.SupplierID = Products.SupplierID) as SupplierName
      FROM         Products
      WHERE SupplierID = @SupplierID
      
    • GetProductByProductID:GetProductByProductID:

      SELECT     ProductID, ProductName, SupplierID, CategoryID,
      QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
      ReorderLevel, Discontinued, (SELECT CategoryName 
      FROM Categories WHERE Categories.CategoryID = 
      Products.CategoryID) as CategoryName, 
      (SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID) 
      as SupplierName
      FROM         Products
      WHERE ProductID = @ProductID
      
  • CategoriesTableAdapterCategoriesTableAdapter

    • GetCategories:GetCategories:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      
    • Getcategorybycategoryıd:GetCategoryByCategoryID:

      SELECT     CategoryID, CategoryName, Description
      FROM         Categories
      WHERE CategoryID = @CategoryID
      
  • SuppliersTableAdapterSuppliersTableAdapter

    • Getsuppliers:GetSuppliers:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      
    • GetSuppliersByCountry:GetSuppliersByCountry:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      WHERE Country = @Country
      
    • Getsupplierbysupplierıd:GetSupplierBySupplierID:

      SELECT     SupplierID, CompanyName, Address,
      City, Country, Phone
      FROM         Suppliers
      WHERE SupplierID = @SupplierID
      
  • EmployeesTableAdapterEmployeesTableAdapter

    • GetEmployees:GetEmployees:

      SELECT     EmployeeID, LastName, FirstName, Title,
      HireDate, ReportsTo, Country
      FROM         Employees
      
    • GetEmployeesByManager:GetEmployeesByManager:

      SELECT     EmployeeID, LastName, FirstName, Title, 
      HireDate, ReportsTo, Country
      FROM         Employees
      WHERE ReportsTo = @ManagerID
      
    • GetEmployeeByEmployeeID:GetEmployeeByEmployeeID:

      SELECT     EmployeeID, LastName, FirstName, Title,
      HireDate, ReportsTo, Country
      FROM         Employees
      WHERE EmployeeID = @EmployeeID
      

Dört TableAdapters eklendikten sonra veri kümesi tasarımcısını The DataSet Designer After the Four TableAdapters Have Been Added

Şekil 31: dört TableAdapters sonra veri kümesi Tasarımcısı (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 31: The DataSet Designer After the Four TableAdapters Have Been Added (Click to view full-size image)

DAL için özel kod eklemeAdding Custom Code to the DAL

Türü belirtilmiş veri kümesine eklenen TableAdapters ve DataTable, bir XML şema tanımı dosyası (Northwind.xsd) olarak ifade edilir.The TableAdapters and DataTables added to the Typed DataSet are expressed as an XML Schema Definition file (Northwind.xsd). Bu şema bilgilerini, Çözüm Gezgini Northwind.xsd dosyasına sağ tıklayıp kodu görüntüle ' yi seçerek görüntüleyebilirsiniz.You can view this schema information by right-clicking on the Northwind.xsd file in the Solution Explorer and choosing View Code.

Northwintürü belirtilmiş veri kümesinin XML şema tanımı (XSD) dosyası The XML Schema Definition (XSD) File for the Northwinds Typed DataSet

Şekil 32: Northwinds türünde VERI kümesinin XML şema tanımı (xsd) dosyası (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 32: The XML Schema Definition (XSD) File for the Northwinds Typed DataSet (Click to view full-size image)

Bu şema bilgileri C# , derleme zamanında derlendiğinde veya çalışma zamanında (gerekliyse) kodu Visual Basic dönüştürülür. bu noktada, hata ayıklayıcıyla adım adım ilerlenebilir.This schema information is translated into C# or Visual Basic code at design time when compiled or at runtime (if needed), at which point you can step through it with the debugger. Otomatik olarak oluşturulan bu kodu görüntülemek için Sınıf Görünümü gidin ve TableAdapter veya Typed DataSet sınıflarının detayına gidin.To view this auto-generated code go to the Class View and drill down to the TableAdapter or Typed DataSet classes. Ekranınızda Sınıf Görünümü görmüyorsanız, Görünüm menüsüne gidin ve buradan seçin ya da CTRL + SHIFT + C tuşlarına basın.If you don't see the Class View on your screen, go to the View menu and select it from there, or hit Ctrl+Shift+C. Sınıf Görünümü, yazılan veri kümesinin ve TableAdapter sınıflarının özelliklerini, yöntemlerini ve olaylarını görebilirsiniz.From the Class View you can see the properties, methods, and events of the Typed DataSet and TableAdapter classes. Belirli bir yöntemin kodunu görüntülemek için Sınıf Görünümü Yöntem adına çift tıklayın veya sağ tıklayın ve tanıma git ' i seçin.To view the code for a particular method, double-click the method name in the Class View or right-click on it and choose Go To Definition.

Sınıf Görünümü tanıma git ' i seçerek otomatik oluşturulan kodu inceleyin

Şekil 33: sınıf görünümü tanıma git ' i seçerek otomatik oluşturulan kodu inceleyinFigure 33: Inspect the Auto-Generated Code by Selecting Go To Definition from the Class View

Otomatik olarak oluşturulan kod harika bir zaman koruyucu olabilir, ancak kod genellikle çok geneldir ve uygulamanın benzersiz ihtiyaçlarını karşılamak için özelleştirilmelidir.While auto-generated code can be a great time saver, the code is often very generic and needs to be customized to meet the unique needs of an application. Ancak otomatik olarak oluşturulan kodu genişletme riski, kodu oluşturan aracın, "yeniden oluşturma" ve özelleştirmelerinizin üzerine yazma zamanına karar vermesine neden olabilir.The risk of extending auto-generated code, though, is that the tool that generated the code might decide it's time to "regenerate" and overwrite your customizations. .NET 2.0 'ın yeni kısmi sınıf kavramıyla, bir sınıfı birden çok Dosya arasında ayırmak kolaydır.With .NET 2.0's new partial class concept, it's easy to split a class across multiple files. Bu, kendi yöntemlerimizi, özellikleri ve olayları, özelleştirmelerimizin üzerine yazarak Visual Studio hakkında endişelenmenize gerek kalmadan otomatik oluşturulan sınıflara eklememize olanak sağlar.This enables us to add our own methods, properties, and events to the auto-generated classes without having to worry about Visual Studio overwriting our customizations.

DAL özelleştirmeyi göstermek için SuppliersRow sınıfına bir GetProducts() yöntemi ekleyelim.To demonstrate how to customize the DAL, let's add a GetProducts() method to the SuppliersRow class. SuppliersRow sınıfı, Suppliers tablosundaki tek bir kaydı temsil eder; her tedarikçi, her bir tedarikçide, belirtilen tedarikçinin ürünlerini döndürecek GetProducts(), bu ürünlerin her biri için bir sağlayıcı olabilir.The SuppliersRow class represents a single record in the Suppliers table; each supplier can provider zero to many products, so GetProducts() will return those products of the specified supplier. Bunu gerçekleştirmek için SuppliersRow.vb adlı App_Code klasörde yeni bir sınıf dosyası oluşturun ve aşağıdaki kodu ekleyin:To accomplish this create a new class file in the App_Code folder named SuppliersRow.vb and add the following code:

Imports NorthwindTableAdapters
Partial Public Class Northwind
    Partial Public Class SuppliersRow
        Public Function GetProducts() As Northwind.ProductsDataTable
            Dim productsAdapter As New ProductsTableAdapter
            Return productsAdapter.GetProductsBySupplierID(Me.SupplierID)
        End Function
    End Class
End Class

Bu kısmi sınıf, daha önce tanımladığımız GetProducts() yöntemi eklemek için Northwind.SuppliersRow sınıfını oluştururken derleyiciye bildirir.This partial class instructs the compiler that when building the Northwind.SuppliersRow class to include the GetProducts() method we just defined. Projenizi derleyebilir ve ardından Sınıf Görünümü geri dönerseniz, artık Northwind.SuppliersRowbir yöntem olarak listelenmiş GetProducts() görürsünüz.If you build your project and then return to the Class View you'll see GetProducts() now listed as a method of Northwind.SuppliersRow.

GetProducts () yöntemi artık Northwind. SuppliersRow sınıfının bir parçasıdır

Şekil 34: GetProducts() yöntemi artık Northwind.SuppliersRow sınıfının bir parçasıdırFigure 34: The GetProducts() Method is Now Part of the Northwind.SuppliersRow Class

GetProducts() yöntemi artık, aşağıdaki kodda gösterildiği gibi belirli bir tedarikçinin ürün kümesini numaralandırmak için kullanılabilir:The GetProducts() method can now be used to enumerate the set of products for a particular supplier, as the following code shows:

Dim suppliersAdapter As New NorthwindTableAdapters.SuppliersTableAdapter()
Dim suppliers As Northwind.SuppliersDataTable = suppliersAdapter.GetSuppliers()
For Each supplier As Northwind.SuppliersRow In suppliers
    Response.Write("Supplier: " & supplier.CompanyName)
    Response.Write("<ul>")
    Dim products As Northwind.ProductsDataTable = supplier.GetProducts()
    For Each product As Northwind.ProductsRow In products
        Response.Write("<li>" & product.ProductName & "</li>")
    Next
    Response.Write("</ul><p> </p>")
Next

Bu veriler aynı zamanda ASP ' de görüntülenebilir. NET 'in veri Web denetimleri.This data can also be displayed in any of ASP.NET's data Web controls. Aşağıdaki sayfada iki alan içeren bir GridView denetimi kullanılmıştır:The following page uses a GridView control with two fields:

  • Her tedarikçinin adını görüntüleyen bir BoundField veA BoundField that displays the name of each supplier, and
  • Her bir tedarikçi için GetProducts() yöntemi tarafından döndürülen sonuçlara bağlanan bir BulletedList denetimi içeren TemplateField.A TemplateField that contains a BulletedList control that is bound to the results returned by the GetProducts() method for each supplier.

Bu tür ana ayrıntı raporlarının gelecekteki öğreticilerde nasıl görüntüleneceğini inceleyeceğiz.We'll examine how to display such master-detail reports in future tutorials. Şimdilik bu örnek, Northwind.SuppliersRow sınıfına eklenen özel yöntemin kullanımını göstermek için tasarlanmıştır.For now, this example is designed to illustrate using the custom method added to the Northwind.SuppliersRow class.

SuppliersAndProducts.aspxSuppliersAndProducts.aspx

<%@ Page Language="VB" CodeFile="SuppliersAndProducts.aspx.vb"
    AutoEventWireup="true" Inherits="SuppliersAndProducts" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
    <link href="Styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <h1>
            Suppliers and Their Products</h1>
        <p>
            <asp:GridView ID="GridView1" runat="server"
             AutoGenerateColumns="False"
             CssClass="DataWebControlStyle">
                <HeaderStyle CssClass="HeaderStyle" />
                <AlternatingRowStyle CssClass="AlternatingRowStyle" />
                <Columns>
                    <asp:BoundField DataField="CompanyName"
                      HeaderText="Supplier" />
                    <asp:TemplateField HeaderText="Products">
                        <ItemTemplate>
                            <asp:BulletedList ID="BulletedList1"
                             runat="server" DataSource="<%# CType(CType(Container.DataItem, System.Data.DataRowView).Row, Northwind.SuppliersRow).GetProducts() %>"
                                 DataTextField="ProductName">
                            </asp:BulletedList>
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView>
             </p>
    </div>
    </form>
</body>
</html>

SuppliersAndProducts.aspx.vbSuppliersAndProducts.aspx.vb

Imports NorthwindTableAdapters
Partial Class SuppliersAndProducts
    Inherits System.Web.UI.Page
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) _
        Handles Me.Load
        Dim suppliersAdapter As New SuppliersTableAdapter
        GridView1.DataSource = suppliersAdapter.GetSuppliers()
        GridView1.DataBind()
    End Sub
End Class

, tedarikçinin şirket adı sol sütunda, sağ taraftaki ürünlerle listelenirThe Supplier's Company Name is Listed in the Left Column, Their Products in the Right

Şekil 35: tedarikçinin şirket adı sol sütunda, sağ taraftaki ürünlerde listelenir (tam boyutlu görüntüyü görüntülemek için tıklayın)Figure 35: The Supplier's Company Name is Listed in the Left Column, Their Products in the Right (Click to view full-size image)

ÖzetSummary

Bir Web uygulaması oluşturulurken DAL oluşturma, sunum katmanınızı oluşturmaya başlamadan önce ortaya çıkan ilk adımlardan biri olmalıdır.When building a web application creating the DAL should be one of your first steps, occurring before you start creating your presentation layer. Visual Studio ile, türü belirtilmiş veri kümelerine dayalı bir DAL oluşturmak, kod satırı yazmadan 10-15 dakika içinde gerçekleştirilebilen bir görevdir.With Visual Studio, creating a DAL based on Typed DataSets is a task that can be accomplished in 10-15 minutes without writing a line of code. İleriye doğru ilerleyen öğreticiler bu DAL üzerine oluşturulacak.The tutorials moving forward will build upon this DAL. Bir sonraki öğreticide , bir dizi iş kuralı tanımlayacağız ve bunları ayrı bir Iş mantığı katmanında nasıl uygulayacağınızı görürsünüz.In the next tutorial we'll define a number of business rules and see how to implement them in a separate Business Logic Layer.

Programlamanın kutlu olsun!Happy Programming!

Daha Fazla BilgiFurther Reading

Bu öğreticide ele alınan konular hakkında daha fazla bilgi için aşağıdaki kaynaklara bakın:For more information on the topics discussed in this tutorial, refer to the following resources:

Bu öğreticide bulunan konularda video eğitimiVideo Training on Topics Contained in this Tutorial

Yazar hakkındaAbout the Author

4GuysFromRolla.com 'in, Scott Mitchell, yedi ASP/ASP. net books ve 'in yazarı, 1998 sürümünden bu yana Microsoft Web teknolojileriyle çalışmaktadır.Scott Mitchell, author of seven ASP/ASP.NET books and founder of 4GuysFromRolla.com, has been working with Microsoft Web technologies since 1998. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor.Scott works as an independent consultant, trainer, and writer. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitimister.His latest book is Sams Teach Yourself ASP.NET 2.0 in 24 Hours. mitchell@4GuysFromRolla.comadresinden erişilebilir .He can be reached at mitchell@4GuysFromRolla.com. ya da blog aracılığıyla http://ScottOnWriting.NETbulabilirsiniz.or via his blog, which can be found at http://ScottOnWriting.NET.

Özel olarak teşekkürlerSpecial Thanks To

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi.This tutorial series was reviewed by many helpful reviewers. Bu öğreticiye ilişkin müşteri adayı gözden geçirenler, deniz yeşili, Tepton Giesenow, dennıs Patterson, Liz Shulok, Abel Gomez ve Carlos Santos.Lead reviewers for this tutorial were Ron Green, Hilton Giesenow, Dennis Patterson, Liz Shulok, Abel Gomez, and Carlos Santos. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz?Interested in reviewing my upcoming MSDN articles? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .If so, drop me a line at mitchell@4GuysFromRolla.com.