تغییر کلاس پایه یک آداپتور در یک مجموعه داده های تایپ شده

تاریخ ایجاد صفحه :

کد برای ایجاد و ایجاد مجموعه داده های تایپ شده

مجموعه داده های تایپ اجازه می دهد تا به شما برای ایجاد یک DataTable است که اطلاعات نوع برای هر ستون بر اساس SQL ، و یا TableAdapter که ساده تعامل داده ها با دسی بل بر اساس Table ی تایپ شده است.

از آنجا که هدف این است که یک مجموعه داده های تایپ شده را در اینجا ایجاد نکنید ، به شما اجازه می دهد تا به سرعت یک مجموعه اطلاعات با بانک اطلاعاتی و جدول آماده در حال حاضر ایجاد کنید. شما همچنین می توانید هر چه شما می خواهید به وضع کردن جدول انجام دهد.

اولین قدم این است که یک مجموعه داده را به عنوان یک آیتم جدید به پروژه خود اضافه کنید. نام هر چیزی است ، اما آن را در اینجا باقی مانده است.

مجموعه داده را باز کنید و یک آداپتور TableAdapter طراح اضافه کنید.

دنبال جادوگر برای ایجاد یک Table ی و TableAdapter.

من فکر می کنم که فرم زیر ممکن است به عنوان مثال از بازیابی و با استفاده از سوابق از پایگاه داده با استفاده از DataTable و TableAdapter که شما ایجاد شده است. (این فقط یک مثال است.)

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

به طور معمول ، یک پروژه که از این مجموعه داده استفاده می کند ، کمتر از یک جدول است و شما بسیاری از مجموعه ها را ایجاد می کنید که تعداد جداول یا جداول چندگانه را ترکیب کرده است. من فکر می کنم آن است که یک مشترک از پردازش به آمده تا زمانی که آن اتفاق می افتد. به عنوان مثال ، شما ممکن است بخواهید به صورت پویا تغییر SQL داخلی مورد استفاده برای تغییر شرایط برای بازیابی سوابق.

با این حال ، کلاس TableAdapter ایجاد شده از مجموعه داده است که در واقع به طور خودکار توسط کد تولید می شود. همچنین ، چون این طبقه آداپتور به ارث می رود کلاس جزء ، هیچ روش و یا خواص است که نمی تواند مورد استفاده در واقعی مشترک وجود دارد. شما نمی توانید یک کلاس پایه را به یک روش برای تماس با یک عملیات مربوط به آداپتور tableadapter کنید.

علاوه بر این ، sql مورد استفاده در داخل ، sqldataadapter استفاده می شود برای دسترسی به پایگاه داده ، و غیره در حفاظت اعلام کرد ، بنابراین شما می توانید آنها را از خارج را لمس نمی کند.

با این حال ، همانطور که شما برای روش ها و خواص اعلام شده در محافظت ، شما می توانید آنها را با ایجاد یک کلاس است که به ارث طبقه TableAdapter ، و این کلاس TableAdapter دارای یک اصلاح جزئی ، بنابراین شما می توانید یکی دیگر از روش یا اموال به گسترش روند اعلام کنند. شما همچنین می توانید یک ویژگی جدید برای دریافت مالکیت داخلی ، همانطور که در کد زیر ایجاد کنید:

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

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

شما در واقع می توانید از این TableAdapter برای دیدن است که شما دسترسی به خواص گسترده استفاده کنید.

با این حال ، دسترسی به خواص داخلی به این معنا نیست که روند مشترک است و شما هنوز هم باید برای هر مجموعه داده ای که ایجاد می کنید ، کد را بنویسید.

تغییر کلاس پایه یک آداپتور table

همانطور که قبلا ذکر شد ، کلاس TableAdapter از کلاس کامپوننت به ارث می روند ، و آن را دشوار برای به اشتراک گذاشتن پردازش. اگر بخشی از کدی را که یک کلاس را به ارث می برده تغییر دهید ، کد تولید خودکار می شود ، بنابراین به روز رسانی مجموعه داده دوباره کد را بازمی گرداند. اگر شما می توانید ، شما می توانید یک کلاس با مشتقات جزئی است که رابط در یک فایل جداگانه بنویسید ، اما آن را حس بسیار را ندارد چرا که شما را به نوشتن به عنوان تابلو به عنوان بسیاری از شما ایجاد کرده اید.

در واقع ، یک مکانیزم برای تغییر کلاس وارث این TableAdapter وجود دارد. من می خواهم به توضیح روش.

اول ، ایجاد کلاس شما می خواهید به ارث می برند. TableAdapter در اصل جزء کلاس ، به ارث برده ، بنابراین شما باید جزء کلاس را به ارث می برند حتی اگر شما آن را ایجاد کنید. من کد من می خواهم برای به اشتراک گذاشتن در اینجا بنویسید ، اما من فقط یک کلاس بنویسید. در نظر گرفتن فضای نامی به آنچه که ایجاد کرده اید.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

سپس طراح مجموعه داده ها را باز کرده و آداپتور TableAdapter که ایجاد کرده اید انتخاب کنید.

برای باز کردن ویژگی ، روی آن کلیک راست کنید. یک ملک به نام BaseClass وجود دارد ، که باید در ابتدا "System. اجزاء. کامپوننت". بازنویسی این به کلاس شما فقط ایجاد. من همه چیز ، از جمله فضای نام نوشتن.

اگر آن را ذخیره کنید ، خواهید دید که کلاس پایه از آداپتور TableAdapter کرده است. با تنظیم این به هر TableAdapter ، شما می توانید پردازش مشترک به کلاس پایه نوشتن.

به عنوان مثال ، اگر شما می خواهید برای دسترسی به SQL داخلی یا SQLDataAdapter ، نوشتن: آداپتورهای و CommandCollections که به طور خودکار ایجاد می شوند تنها خواص ایجاد شده توسط کلاس وارث هستند ، به طوری که آنها نمی توانند مستقیما از وارث لمس شوند. کد زیر را با استفاده از انعکاس به زور دسترسی داشته باشید.

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

شما می توانید ببینید که شما در واقع می تواند استفاده از TableAdapter برای دسترسی به خواص از کلاس به ارث برده است.