Tukar kelas asas sesuatu Tableaddalam DataSet yang ditaip

Tarikh penciptaan halaman :

Kod untuk mencipta dan menjana DataSet yang ditaip

A menaip DataSet membolehkan anda untuk membuat DataTable yang mempunyai maklumat taip untuk setiap lajur berdasarkan SQL, atau yang TableAdapter yang memudahkan interaksi data dengan DB berdasarkan yang ditaip DataTable.

Oleh kerana tujuan itu bukan untuk membuat menaip DataSet di sini, mari kita dengan cepat membuat DataSet dengan pangkalan data dan jadual siap untuk sekarang. Anda juga boleh melakukan apa sahaja yang anda mahu untuk meletakkan Jadual.

Langkah pertama adalah untuk menambah DataSet sebagai item baru untuk projek anda. Namanya adalah apa-apa tetapi ia dibiarkan di sini.

Buka DataSet dan tambahkan satu serpihan Tableaddari pereka.

Ikuti Wizard untuk mencipta DataTable dan yang Tableadapator.

Saya berfikir bahawa borang berikut mungkin contoh mendapatkan semula dan menggunakan rekod dari pangkalan data menggunakan DataTable dan TableAdapter yang anda buat. (Ini hanyalah satu contoh.)

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.金額));
    }
  }
}

Biasanya, projek yang menggunakan DataSet ini mempunyai kurang daripada satu jadual, dan anda membuat banyak set data yang menggabungkan bilangan Jadual atau berbilang Jadual. Saya berfikir bahawa ia adalah satu isasi biasa pemprosesan untuk datang apabila ia berlaku. Sebagai contoh, anda mungkin mahu mengubah secara dinamik SQL digunakan secara dalaman untuk menukar syarat untuk mendapatkan semula rekod.

Walau bagaimanapun, kelas TableAdapter yang dicipta dari DataSet sebenarnya secara automatik dihasilkan oleh Kod. Juga, kerana kelas TableAdapter ini mewarisi kelas komponen, tidak ada kaedah atau harta yang boleh digunakan di umum sebenar. Anda tidak boleh lulus kelas asas kepada kaedah untuk memanggil operasi yang berkaitan dengan tableadapter.

Di samping itu, SQL digunakan secara dalaman, sqldatapenyesuai yang digunakan untuk mengakses pangkalan data, dan sebagainya diisytiharkan dilindungi, jadi anda tidak boleh menyentuh mereka dari luar.

Walau bagaimanapun, seperti yang anda mengisytiharkan untuk kaedah dan harta yang diisytiharkan dilindungi, anda boleh menyentuh mereka dengan mewujudkan kelas yang mewarisi kelas TableAdapter, dan kelas TableAdapter ini mempunyai Pengubah suai separa, supaya anda boleh mengisytiharkan kaedah lain atau harta untuk melanjutkan proses. Anda juga boleh mencipta harta baru untuk mendapatkan harta dalaman, seperti dalam kod berikut:

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

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

Anda sebenarnya boleh menggunakan ini yang Tableadup untuk melihat bahawa anda mempunyai akses kepada hartanah yang dilanjutkan.

Walau bagaimanapun, mengakses sifat dalaman tidak bermakna bahawa proses adalah umum, dan anda masih perlu menulis kod untuk setiap DataSet yang anda buat.

Tukar kelas asas daripada sebuah Tableadapator

Seperti yang disebutkan sebelum ini, kelas TableAdapter mewarisi kelas komponen, menjadikannya sukar untuk berkongsi pemprosesan. Jika anda menukar bahagian kod yang mewarisi kelas, kod itu dihasilkan secara automatik, jadi mengemaskini DataSet sekali lagi mengembalikan kod. Jika anda boleh, anda boleh menulis kelas separa yang mewarisi antara muka dalam fail yang berasingan, tetapi ia tidak membuat banyak rasa kerana anda perlu menulis seberapa banyak yang TableAdapters seperti yang anda telah buat.

Malah, Terdapat satu mekanisme untuk menukar kelas mewarisi daripada ini. Saya ingin menjelaskan prosedur.

Pertama, buat kelas yang anda mahu mewarisi. TableAdapter asalnya mewarisi kelas komponen, jadi anda harus mewarisi kelas komponen walaupun anda menciptanya. Saya akan menulis kod saya ingin berkongsi di sini, tetapi saya hanya akan menulis kelas. Padankan ruang nama untuk apa yang anda cipta.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Kemudian buka pereka DataSet dan pilih Tableadapator yang anda buat.

Klik kanan untuk membuka penginapan. Terdapat harta tanah yang dipanggil BaseClass, yang pada mulanya akan menjadi "sistem. ComponentModel. komponen". Tulis semula ini kepada kelas yang baru anda cipta. Saya akan menulis segala-galanya, termasuk ruang nama.

Jika anda menyimpannya, anda akan melihat bahawa kelas asas dari TableAdapter telah berubah. Dengan menetapkan hal ini kepada setiap Tableadapator, anda boleh menulis pemprosesan biasa kepada kelas asas.

Contohnya, jika anda ingin mengakses SQL atau Sqldatapenyesuai dalaman, menulis: Penyesuai dan CommandCollections yang dicipta secara automatik hanya hartanah yang dicipta oleh kelas inheritor, jadi mereka tidak boleh disentuh terus dari inheritor. Kod berikut menggunakan pantulan untuk memaksa akses.

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);
      }
    }
  }
}

Anda boleh melihat bahawa anda sebenarnya boleh menggunakan TableAdapter untuk mengakses hartanah kelas Warisan.