เปลี่ยนคลาสพื้นฐานของการTableAdapterในชุดข้อมูลที่พิมพ์

วันที่สร้างเพจ :

รหัสเพื่อสร้าง และสร้างชุดข้อมูลที่พิมพ์

ชนิดชุดข้อมูลช่วยให้คุณสามารถสร้างDataTableที่มีชนิดข้อมูลสําหรับแต่ละคอลัมน์ที่ขึ้นอยู่กับ SQL หรือTableAdapterที่ง่ายการโต้ตอบข้อมูลกับ DB ที่ขึ้นอยู่กับชนิดข้อมูลที่พิมพ์

เนื่องจากวัตถุประสงค์คือไม่สร้างชุดข้อมูลที่พิมพ์ที่นี่, ขอได้อย่างรวดเร็วสร้างชุดข้อมูลกับฐานข้อมูลและตารางพร้อมสําหรับตอนนี้. นอกจากนี้คุณยังสามารถทําสิ่งที่คุณต้องการจัดวางโต๊ะ

ขั้นตอนแรกคือการเพิ่มเป็นชุดข้อมูลเป็นสินค้าใหม่ในโครงการของคุณ ชื่อเป็นอะไรแต่เหลือไว้ที่นี่

เปิดชุดข้อมูล และเพิ่มตัวปรับต่อตารางจากตัวออกแบบ

ทําตามตัวช่วยสร้างเพื่อสร้างตารางข้อมูลและตารางอะแดปเตอร์

ผมคิดว่ารูปแบบต่อไปนี้อาจจะมีตัวอย่างของการเรียกและการใช้ระเบียนจากฐานข้อมูลโดยใช้ 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 นี้จริงเพื่อดูว่า คุณมีการเข้าถึงคุณสมบัติเพิ่มเติม

อย่างไรก็ตาม การเข้าถึงคุณสมบัติภายในไม่ได้หมายความว่า กระบวนการเป็นปกติ และคุณยังคงต้องเขียนรหัสสําหรับแต่ละชุดข้อมูลที่คุณสร้าง

เปลี่ยนคลาสพื้นฐานของตัวปรับต่อ

ดังที่ได้กล่าวไว้ก่อนหน้านี้ ถ้าคุณเปลี่ยนส่วนของรหัสที่สืบทอดคลาส รหัสถูกสร้างขึ้นโดยอัตโนมัติ ดังนั้น การปรับปรุง DataSet อีกครั้งส่งกลับรหัส หากคุณสามารถเขียนคลาสบางส่วนที่สืบทอดอินเทอร์เฟซในไฟล์แยกต่างหาก แต่มันไม่สมเหตุสมผลมากนักเพราะคุณต้องเขียน TableAdapters มากเท่าที่คุณสร้างขึ้นมา

ในความเป็นจริงมีกลไกการเปลี่ยนแปลงคลาสที่สืบทอดของ TableAdapter นี้ ผมอยากจะอธิบายขั้นตอน

ขั้นแรกให้สร้างชั้นเรียนที่คุณต้องการสืบทอด TableAdapter เดิมสืบทอดคลาส Component ดังนั้นคุณควรสืบทอดคลาสคอมโพเนนต์แม้ว่าคุณสร้างขึ้น ฉันจะเขียนรหัสที่ฉันต้องการแบ่งปันที่นี่ แต่ฉันจะเขียนชั้นเรียน จับคู่เนมสเปซกับสิ่งที่คุณสร้าง

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

จากนั้นเปิดตัวออกแบบชุดข้อมูล และเลือกตัวปรับต่อตารางที่คุณสร้างขึ้น

คลิกขวาเพื่อเปิดคุณสมบัติ มีคุณสมบัติที่เรียกว่า BaseClass ซึ่งในขั้นต้นควรเป็น "System.ComponentModel.Component" เขียนใหม่นี้ไปยังชั้นเรียนที่คุณเพิ่งสร้างขึ้น ฉันจะเขียนทุกอย่าง รวมทั้งเนมสเปซ

ถ้าคุณบันทึกคุณจะเห็นว่า คลาสพื้นฐานของ TableAdapter มีการเปลี่ยนแปลง โดยการตั้งค่านี้ในแต่ละ TableAdapter คุณสามารถเขียนการประมวลผลทั่วไปไปยังคลาสพื้นฐาน

ตัวอย่างเช่น ถ้าคุณต้องการเข้าถึง SQL ภายในหรือ SQLDataAdapter เขียน: อะแด็ปเตอร์และ CommandCollection ที่สร้างขึ้นโดยอัตโนมัติเป็นคุณสมบัติที่สร้างโดยคลาส inheritor เท่านั้น รหัสต่อไปนี้ใช้การสะท้อนเพื่อบังคับให้เข้าถึง

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 ในการเข้าถึงคุณสมบัติของคลาสที่สืบทอดจริง