टाइप किए गए डेटासेट में टेबलएडअप्टर का आधार वर्ग बदलें

पेज निर्माण की तारीख :

टाइप किए गए डेटासेट को बनाने और जेनरेट करने के लिए कोड

एक टाइप ्ड डाटासेट आपको एक डेटाटेबल बनाने की अनुमति देता है जिसमें एसक्यूएल के आधार पर प्रत्येक कॉलम के लिए टाइप जानकारी हो, या टेबलएडअपर जो टाइप किए गए डेटाटेबल के आधार पर डीबी के साथ डेटा इंटरैक्शन को सरल बनाता है।

चूंकि उद्देश्य यहां टाइप किए गए डेटासेट बनाना नहीं है, इसलिए आइए अभी के लिए तैयार डेटाबेस और टेबल के साथ डेटासेट बनाएं। आप टेबल को जो भी रखना चाहते हैं, कर सकते हैं।

पहला चरण आपकी परियोजना में एक नए आइटम के रूप में डेटासेट जोड़ना है। नाम कुछ भी है लेकिन यहयहां छोड़ दिया गया है ।

डेटासेट खोलें और डिजाइनर से एक टेबलएडअपकरेंस जोड़ें।

एक डेटाटेबल और टेबलएडेंटर बनाने के लिए जादूगर का पालन करें।

मुझे लगता है कि निम्नलिखित फ़ोर आपके द्वारा बनाए गए डेटाटेबल और टेबलएडिप्टर का उपयोग करके डेटाबेस से रिकॉर्ड को पुनः प्राप्त करने और उपयोग करने का एक उदाहरण हो सकता है। (यह सिर्फ एक उदाहरण है.)

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

आमतौर पर, इस डेटासेट का उपयोग करने वाली परियोजना में एक से कम तालिका होती है, और आप कई डेटासेट बनाते हैं जो तालिकाओं या कई तालिकाओं की संख्या को जोड़ते हैं। मुझे लगता है कि जब ऐसा होता है तो प्रसंस्करण का आम करण होता है । उदाहरण के लिए, आप रिकॉर्ड प्राप्त करने के लिए शर्तों को बदलने के लिए आंतरिक रूप से उपयोग किए जाने वाले एसक्यूएल को गतिशील रूप से बदलना चाह सकते हैं।

हालांकि, डेटासेट से बनाया गया टेबलएडअप्टर क्लास वास्तव में कोड द्वारा स्वचालित रूप से उत्पन्न होता है। इसके अलावा, क्योंकि यह टेबलएडेंडर वर्ग घटक वर्ग को विरासत में देता है, कोई विधियां या गुण नहीं हैं जिनका उपयोग वास्तविक आम में किया जा सकता है। आप टेबलअडॉप्टर से संबंधित ऑपरेशन को कॉल करने के लिए एक विधि के लिए आधार वर्ग पारित नहीं कर सकते।

इसके अलावा, आंतरिक रूप से उपयोग किए जाने वाले एसक्यूएल, डेटाबेस आदि तक पहुंचने के लिए उपयोग किए जाने वाले sqldataadapter को संरक्षित रूप से घोषित किया जाता है, इसलिए आप उन्हें बाहर से नहीं छू सकते हैं।

हालांकि, जैसा कि आप संरक्षित में घोषित तरीकों और गुणों के लिए घोषणा करते हैं, आप टेबलएडेंडर वर्ग के उत्तराधिकारी वर्ग का निर्माण करके उन्हें छू सकते हैं, और इस टेबलएडिपर वर्ग में आंशिक संशोधक है, इसलिए आप प्रक्रिया का विस्तार करने के लिए एक और विधि या संपत्ति घोषित कर सकते हैं। आप आंतरिक संपत्ति प्राप्त करने के लिए एक नई संपत्ति भी बना सकते हैं, जैसा कि निम्नलिखित कोड में है:

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

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

आप वास्तव में इस टेबलएडिपर का उपयोग यह देखने के लिए कर सकते हैं कि आपके पास विस्तारित गुणों तक पहुंच है।

हालांकि, आंतरिक गुणों तक पहुंचने का मतलब यह नहीं है कि प्रक्रिया आम है, और आपको अभी भी अपने द्वारा बनाए गए प्रत्येक डेटासेट के लिए कोड लिखना होगा।

टेबलएड्प्टर के बेस क्लास को बदलें

जैसा कि पहले उल्लेख किया गया है, टेबलएडेंटर वर्ग घटक वर्ग को विरासत में देता है, जिससे प्रसंस्करण साझा करना मुश्किल हो जाता है। यदि आप कोड का वह हिस्सा बदलते हैं जो एक वर्ग को विरासत में मिलता है, तो कोड ऑटो-जेनरेट होता है, इसलिए डेटासेट को अपडेट करने से कोड फिर से रिटर्न होता है। यदि आप कर सकते हैं, तो आप एक आंशिक वर्ग लिख सकते हैं जो एक अलग फ़ाइल में इंटरफ़ेस का वारिस है, लेकिन इसका बहुत मतलब नहीं है क्योंकि आपको जितने टेबलएडेंटर्स बनाए हैं, उन्हें लिखना होगा।

वास्तव में, इस टेबलएडेंटर के विरासत वर्ग को बदलने के लिए एक तंत्र है। मैं प्रक्रिया की व्याख्या करना चाहते हैं ।

सबसे पहले, आप विरासत में रखना चाहते हैं कक्षा बनाएं। टेबलएड्पर को मूल रूप से घटक वर्ग विरासत में मिला था, इसलिए आपको घटक वर्ग के वारिस होने चाहिए, भले ही आप इसे बनाएं। मैं कोड मैं यहां साझा करना चाहते लिखना चाहते हैं, लेकिन मैं सिर्फ एक वर्ग लिखूंगा । आपने जो बनाया है उसके लिए नामस्थान से मेल खाते हैं।

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

फिर डेटासेट डिजाइनर खोलें और आपके द्वारा बनाए गए टेबलएडअप्टर का चयन करें।

संपत्ति खोलने के लिए सही क्लिक करें। बेसक्लास नामक एक संपत्ति है, जिसे शुरू में "सिस्टम.कंपोनेंटमॉडल.कंपोनेंट" होना चाहिए। आप ने बस बनाई कक्षा में इसे फिर से लिखें। मैं नामस्थान सहित सब कुछ लिखूंगा।

यदि आप इसे सहेजते हैं, तो आप देखेंगे कि टेबलएडिपर का आधार वर्ग बदल गया है। इसे प्रत्येक टेबलएडिक्टर को सेट करके, आप बेस क्लास को कॉमन प्रोसेसिंग लिख सकते हैं।

उदाहरण के लिए, यदि आप किसी आंतरिक एसक्यूएल या एसक्यूएलडाटाएडर तक पहुंचना चाहते हैं, तो लिखें: एडाप्टर और कमांडकलेक्शन जो स्वचालित रूप से बनाए जाते हैं, केवल उत्तराधिकारी वर्ग द्वारा बनाए गए गुण हैं, इसलिए उन्हें उत्तराधिकारी से सीधे छुआ नहीं जा सकता है। निम्नलिखित कोड पहुंच को मजबूर करने के लिए प्रतिबिंब का उपयोग करता है।

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

आप देख सकते हैं कि आप वास्तव में विरासत में मिली कक्षा के गुणों तक पहुंचने के लिए टेबलएड्पर का उपयोग कर सकते हैं।