Yazılmış bir DataSet'te TableAdapter'ın taban sınıfını değiştirme

Sayfa oluşturma tarihi :

Yazılı bir DataSet oluşturmak ve oluşturmak için kod

Daktib edilmiş Bir DataSet, SQL'e dayalı her sütun için tür bilgilerine sahip bir DataTable veya daktilan bir DataTable'a dayalı Olarak DB ile veri etkileşimini kolaylaştıran bir TableAdapter oluşturmanıza olanak tanır.

Amaç burada yazılı bir DataSet oluşturmak olmadığından, veritabanı ve tablo şimdilik hazır bir DataSet hızla oluşturalım. Ayrıca masayı düzenlemek için ne isterseniz de yapabilirsiniz.

İlk adım, projenize yeni bir öğe olarak bir DataSet eklemektir. İsim bir şey ama burada kaldı.

DataSet'i açın ve tasarımcıdan bir TableAdapter ekleyin.

DataTable ve TableAdapter oluşturmak için sihirbazı izleyin.

Ben aşağıdaki formu alma ve oluşturduğunuz DataTable ve TableAdapter kullanarak veritabanından kayıtları kullanarak bir örnek olabileceğini düşünüyorum. (Bu sadece bir örnektir.)

public Form1()
{
  InitializeComponent();

  using (var adapter = new 金額集計TestTableAdapter())
  {
    var table = adapter.GetData();

    foreach (var row in table)
    {
      Trace.WriteLine(string.Format("{0}:{1}", row.年月, row.金額));
    }
  }
}

Genellikle, bu DataSet'i kullanan bir projede birden az tablo vardır ve tablo veya birden çok tablo sayısını birleştiren birçok Veri Kümesi oluşturursunuz. Ben bu olduğunda gelip işleme ortak bir leştirme olduğunu düşünüyorum. Örneğin, kayıtları almak için koşulları değiştirmek için dahili olarak kullanılan SQL'i dinamik olarak değiştirmek isteyebilirsiniz.

Ancak, DataSet'ten oluşturulan TableAdapter sınıfı aslında kod tarafından otomatik olarak oluşturulur. Ayrıca, bu TableAdapter sınıfı Bileşen sınıfını devraldığından, gerçek ortak alanda kullanılabilecek yöntem veya özellik yoktur. Bir taban sınıf bir yöntem için bir tablobağcı ile ilgili işlem çağırmak için geçemezsiniz.

Buna ek olarak, dahili olarak kullanılan sql, veritabanına erişmek için kullanılan sqldataadapter, vb korumalı olarak bildirilir, bu nedenle dışarıdan dokunamazsınız.

Ancak, korumalı olarak bildirilen yöntemler ve özellikler için beyan da belirttiğiniz gibi, TableAdapter sınıfını devralan bir sınıf oluşturarak bunlara dokunabilirsiniz ve bu TableAdapter sınıfıkısmi bir değiştiriciye sahiptir, böylece işlemi genişletmek için başka bir yöntem veya özellik bildirebilirsiniz. Aşağıdaki kodda olduğu gibi dahili özelliği almak için yeni bir özellik de oluşturabilirsiniz:

using System.Data.SqlClient;
namespace DataSetBaseAdapter {
    public partial class DataSet1 {
    }
}

namespace DataSetBaseAdapter.DataSet1TableAdapters
{
  public partial class 金額集計TestTableAdapter
  {
    public SqlDataAdapter InnerAdapter
    {
      get { return Adapter; }
    }
  }
}

Genişletilmiş özelliklere erişebildiğinizi görmek için bu TableAdapter'ı kullanabilirsiniz.

Ancak, iç özelliklere erişmek işlemin yaygın olduğu anlamına gelmez ve oluşturduğunuz her DataSet için kod yazmanız gerekir.

TableAdapter'ın taban sınıfını değiştirme

Daha önce de belirtildiği gibi, TableAdapter sınıfı Bileşen sınıfını devralır ve bu da işlemeyi paylaşmayı zorlaştırır. Kodun bir sınıfı devralan bölümünü değiştirirseniz, kod otomatik olarak oluşturulur, bu nedenle DataSet'in güncelleştirilmesi kodu yeniden döndürür. Yapabilirseniz, arabirimi ayrı bir dosyaya devralan kısmi bir sınıf yazabilirsiniz, ancak oluşturduğunuz kadar çok TableAdapters yazmanız gerektiği için bu pek mantıklı değildir.

Aslında, bu TableAdapter'ın devralma sınıfını değiştirmek için bir mekanizma vardır. Prosedürü açıklamak istiyorum.

İlk olarak, devralmak istediğiniz sınıfı oluşturun. TableAdapter başlangıçta Bileşen sınıfını devraldı, bu nedenle bileşen sınıfını oluştursanız bile devralmanız gerekir. Burada paylaşmak istediğim kodu yazacağım, ama sadece bir ders yazacağım. Ad alanını oluşturduğunuz la eşleştirin.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Ardından DataSet tasarımcısını açın ve oluşturduğunuz TableAdapter'ı seçin.

Özelliği açmak için sağ tıklatın. Başlangıçta "System.ComponentModel.Component" olması gereken BaseClass adında bir özellik vardır. Bunu az önce oluşturduğunuz sınıfa yeniden yazın. İsim alanı da dahil her şeyi yazacağım.

Kaydederseniz, TableAdapter'ın taban sınıfının değiştiğini görürsünüz. Bunu her TableAdapter'a ayarlayarak, taban sınıfa ortak işleme yazabilirsiniz.

Örneğin, dahili bir SQL veya SQLDataAdapter'a erişmek istiyorsanız, şunları yazın: Otomatik olarak oluşturulan Bağdaştırıcılar ve Komut Koleksiyonları yalnızca devralan sınıfı tarafından oluşturulan özelliklerdir, bu nedenle doğrudan mirasçıdan dokunulamaz. Aşağıdaki kod, erişimi zorlamak için yansımayı kullanır.

using System.ComponentModel;
using System.Data.SqlClient;
using System.Reflection;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
    public SqlDataAdapter InnerAdapter
    {
      get
      {
        return (SqlDataAdapter)GetType().GetProperty("Adapter",
          BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this, null);
      }
    }

    public SqlCommand[] InnerCommandCollection
    {
      get
      {
        return (SqlCommand[])GetType().GetProperty("CommandCollection",
          BindingFlags.NonPublic | BindingFlags.Instance).GetValue(this, null);
      }
    }
  }
}

Devralınan sınıfın özelliklerine erişmek için TableAdapter'ı gerçekten kullanabileceğinizi görebilirsiniz.