تغيير الفئة الأساسية لمحول جدول في مجموعة بيانات مطبوعة

تاريخ إنشاء الصفحة :

تعليمات برمجية لإنشاء مجموعة بيانات مطبوعة وإنشائها

تسمح لك مجموعة البيانات المكتوبة بإنشاء DataTable يحتوي على معلومات الكتابة لكل عمود استنادًا إلى SQL، أو محول جدول يبسط تفاعل البيانات مع DB استنادًا إلى جدول بيانات مكتوب.

نظرًا لأن الغرض ليس إنشاء DataSet مكتوبة هنا ، دعنا ننشئ مجموعة بيانات بسرعة مع قاعدة البيانات والجدول جاهزين في الوقت الحالي. يمكنك أيضا أن تفعل كل ما تريد لوضع الجدول.

الخطوة الأولى هي إضافة DataSet كعنصر جديد إلى المشروع الخاص بك. الاسم هو أي شيء لكنه ترك هنا.

افتح مجموعة البيانات وأضف محول جدول من المصمم.

اتبع المعالج لإنشاء DataTable و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 من DataSet فعلياً تلقائياً بواسطة التعليمات البرمجية. أيضاً، لأن هذه الفئة 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 للتأكد من أن لديك حق الوصول إلى الخصائص الموسعة.

ومع ذلك، الوصول إلى الخصائص الداخلية لا يعني أن العملية شائعة، ولا يزال لديك لكتابة التعليمات البرمجية لكل DataSet تقوم بإنشائها.

تغيير الفئة الأساسية لمحول جدول

كما ذكر سابقاً، فئة TableAdapter يرث فئة المكون، مما يجعل من الصعب مشاركة المعالجة. إذا قمت بتغيير جزء التعليمات البرمجية التي ترث فئة، يتم إنشاء التعليمات البرمجية تلقائيًا، لذلك يؤدي تحديث DataSet مرة أخرى إلى إرجاع التعليمات البرمجية. إذا كنت تستطيع، يمكنك كتابة فئة جزئية ترث واجهة في ملف منفصل، ولكن هذا لا معنى له لأنه يجب عليك كتابة العديد من محولات TableAdapters كما قمت بإنشائه.

في الواقع، هناك آلية لتغيير الفئة الموروثة من هذا TableAdapter. أود أن أشرح الإجراء.

أولاً، قم بإنشاء الفئة التي تريد توريثها. ورث TableAdapter أصلاً فئة المكون، لذلك يجب أن ترث فئة المكون حتى إذا قمت بإنشائها. سأكتب الرمز الذي أريد مشاركته هنا، لكنني سأكتب صفاً فقط. مطابقة مساحة الاسم مع ما قمت بإنشائه.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

ثم افتح مصمم DataSet وحدد محول الجدول الذي قمت بإنشائه.

انقر بزر الماوس الأيمن لفتح مكان الإقامة. هناك خاصية تسمى BaseClass، والتي يجب أن تكون في البداية "System.ComponentModel.Component". أعد كتابة هذا إلى الفئة التي أنشأتها للتو. سأكتب كل شيء، بما في ذلك مساحة الاسم.

إذا قمت بحفظه، سترى أن الفئة الأساسية من TableAdapter قد تغيرت. عن طريق تعيين هذا إلى كل TableAdapter، يمكنك كتابة معالجة مشتركة إلى الفئة الأساسية.

على سبيل المثال، إذا كنت ترغب في الوصول إلى مزود داخلي أو 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 للوصول إلى خصائص الفئة الموروثة.