Mengubah kelas dasar TableAdapter di diketik DataSet

Tanggal pembuatan halaman :

Kode untuk membuat dan menghasilkan diketik DataSet

Sebuah diketik DataSet memungkinkan Anda untuk membuat sebuah DataTable yang memiliki informasi jenis untuk setiap kolom berdasarkan SQL, atau TableAdapter yang menyederhanakan data interaksi dengan DB berdasarkan diketik DataTable.

Karena tujuannya bukan untuk membuat diketik DataSet di sini, mari kita cepat membuat DataSet dengan database dan tabel siap untuk saat ini. Anda juga dapat melakukan apa pun yang Anda ingin lay out meja.

Langkah pertama adalah menambahkan DataSet sebagai item baru untuk proyek Anda. Nama adalah sesuatu tapi itu ditinggalkan di sini.

Buka DataSet dan menambahkan TableAdapter dari perancang.

Ikuti Wizard untuk membuat DataTable dan A TableAdapter.

Saya berpikir bahwa bentuk berikut mungkin menjadi contoh mengambil dan menggunakan catatan dari database menggunakan DataTable dan TableAdapter yang Anda buat. (Ini hanyalah sebuah 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, proyek yang menggunakan DataSet ini memiliki kurang dari satu tabel, dan Anda membuat banyak dataset yang menggabungkan jumlah tabel atau beberapa tabel. Saya berpikir bahwa itu adalah ization umum dari pengolahan untuk muncul ketika itu terjadi. Misalnya, Anda mungkin ingin secara dinamis mengubah SQL yang digunakan secara internal untuk mengubah kondisi untuk mengambil data.

Namun, kelas TableAdapter dibuat dari DataSet sebenarnya secara otomatis dihasilkan oleh kode. Selain itu, karena kelas TableAdapter ini mewarisi kelas komponen, ada tidak ada metode atau properti yang dapat digunakan secara nyata umum. Anda tidak dapat melewati kelas dasar untuk metode untuk memanggil operasi tableadapter terkait.

Selain itu, SQL digunakan secara internal, sqldataadapter digunakan untuk mengakses database, dll dinyatakan dalam dilindungi, sehingga Anda tidak dapat menyentuh mereka dari luar.

Namun, ketika Anda menyatakan untuk metode dan properti dinyatakan dalam dilindungi, Anda dapat menyentuh mereka dengan membuat kelas yang mewarisi kelas TableAdapter, dan kelas TableAdapter ini memiliki pengubah parsial, sehingga Anda dapat menyatakan metode lain atau properti untuk memperluas proses. Anda juga dapat membuat properti baru untuk mendapatkan properti internal, seperti kode 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 dapat menggunakan TableAdapter ini untuk melihat bahwa Anda memiliki akses ke properti diperpanjang.

Namun, mengakses properti internal tidak berarti bahwa proses umum, dan Anda masih harus menulis kode untuk setiap DataSet yang Anda buat.

Mengubah kelas dasar TableAdapter

Seperti disebutkan sebelumnya, kelas TableAdapter mewarisi kelas komponen, sehingga sulit untuk berbagi pengolahan. Jika Anda mengubah bagian kode yang mewarisi kelas, kode yang dihasilkan otomatis, sehingga memperbarui DataSet kembali mengembalikan kode. Jika Anda bisa, Anda dapat menulis kelas parsial yang mewarisi antarmuka dalam file terpisah, tetapi tidak masuk akal karena Anda harus menulis banyak Tableadapter seperti yang Anda buat.

Sebenarnya, ada mekanisme untuk mengubah mewarisi kelas TableAdapter ini. Saya ingin menjelaskan prosedur.

Pertama, buat kelas yang ingin Anda warisi. TableAdapter awalnya mewarisi kelas komponen, sehingga Anda harus mewarisi kelas komponen bahkan jika Anda membuatnya. Aku akan menulis kode saya ingin berbagi di sini, tapi aku hanya akan menulis sebuah kelas. Cocokkan namespace dengan apa yang Anda buat.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Kemudian buka desain DataSet dan pilih TableAdapter yang Anda buat.

Klik kanan untuk membuka properti. Ada sebuah properti yang disebut BaseClass, yang awalnya harus "System. ComponentModel. component". Menulis ulang ini ke kelas yang baru saja Anda buat. Saya akan menulis semuanya, termasuk namespace.

Jika Anda menyimpannya, Anda akan melihat bahwa kelas dasar TableAdapter telah berubah. Dengan menetapkan ini untuk setiap TableAdapter, Anda dapat menulis pemrosesan umum untuk kelas dasar.

Sebagai contoh, jika Anda ingin mengakses SQL internal atau SQLDataAdapter, tulis: Adapter dan CommandCollections yang dibuat secara otomatis hanya properti yang dibuat oleh pewaris kelas, sehingga mereka tidak dapat menyentuh langsung dari pewaris. Kode berikut menggunakan refleksi 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 dapat melihat bahwa Anda sebenarnya dapat menggunakan TableAdapter untuk mengakses properti kelas mewarisi.