Thay đổi lớp cơ sở của một TableAdapter trong một tập dữ liệu gõ

Ngày tạo trang :

Mã để tạo và tạo một tập dữ liệu gõ

Một DataSet đánh máy cho phép bạn tạo ra một DataTable có loại thông tin cho mỗi cột dựa trên SQL, hoặc một TableAdapter đơn giản hóa tương tác dữ liệu với DB dựa trên một DataTable gõ.

Vì mục đích không phải là tạo ra một tập dữ liệu đã gõ ở đây, hãy nhanh chóng tạo một tập dữ liệu với cơ sở dữ liệu và bảng đã sẵn sàng ngay bây giờ. Bạn cũng có thể làm bất cứ điều gì bạn muốn lay ra bảng.

Bước đầu tiên là thêm một tập dữ liệu như một mục mới cho dự án của bạn. Tên là bất cứ điều gì nhưng nó còn lại ở đây.

Mở DataSet và thêm một TableAdapter từ thiết kế.

Làm theo các hướng dẫn để tạo ra một DataTable và một TableAdapter.

Tôi nghĩ rằng các hình thức sau đây có thể là một ví dụ về lấy và sử dụng các hồ sơ từ cơ sở dữ liệu bằng cách sử dụng DataTable và TableAdapter mà bạn tạo ra. (Đây chỉ là một ví dụ.)

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

Thông thường, một dự án sử dụng dữ liệu này có ít hơn một bảng và bạn tạo nhiều tập dữ liệu kết hợp số bảng hoặc nhiều bảng. Tôi nghĩ rằng nó là một iZATION phổ biến của việc xử lý để đi lên khi nó xảy ra. Ví dụ: bạn có thể muốn tự động thay đổi SQL sử dụng nội bộ để thay đổi các điều kiện để lấy hồ sơ.

Tuy nhiên, lớp TableAdapter tạo từ DataSet thực sự tự động tạo ra bởi mã. Ngoài ra, vì lớp TableAdapter này kế thừa lớp cấu phần, không có phương pháp hoặc thuộc tính có thể được sử dụng trong thực sự phổ biến. Bạn không thể vượt qua một lớp cơ sở phương pháp để gọi một hoạt động liên quan đến tableadapter.

Ngoài ra, SQL được sử dụng trong nội bộ, sqldataadapter được sử dụng để truy cập vào cơ sở dữ liệu, vv được tuyên bố trong bảo vệ, vì vậy bạn không thể chạm vào chúng từ bên ngoài.

Tuy nhiên, khi bạn tuyên bố cho các phương pháp và thuộc tính tuyên bố trong bảo vệ, bạn có thể chạm vào chúng bằng cách tạo ra một lớp kế thừa lớp TableAdapter, và lớp TableAdapter này có một công cụ sửa đổi một phần, vì vậy bạn có thể tuyên bố một phương pháp hoặc thuộc tính để mở rộng quá trình. Bạn cũng có thể tạo một thuộc tính mới để lấy tài sản nội bộ, như trong mã sau đây:

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

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

Bạn thực sự có thể sử dụng TableAdapter này để thấy rằng bạn có quyền truy cập vào các thuộc tính mở rộng.

Tuy nhiên, truy cập vào thuộc tính nội bộ không có nghĩa là quá trình này là phổ biến, và bạn vẫn phải viết mã cho mỗi tập dữ liệu bạn tạo.

Thay đổi lớp cơ sở của một TableAdapter

Như đã đề cập trước đó, lớp TableAdapter kế thừa lớp thành phần, làm cho nó khó khăn để chia sẻ xử lý. Nếu bạn thay đổi một phần của mã kế thừa một lớp, mã được tự động tạo ra, do đó, Cập Nhật DataSet lại trả về mã. Nếu bạn có thể, bạn có thể viết một phần lớp mà kế thừa giao diện trong một tập tin riêng biệt, nhưng nó không làm cho nhiều ý nghĩa bởi vì bạn phải viết như nhiều Tableadapter như bạn đã tạo ra.

Trong thực tế, có một cơ chế để thay đổi lớp thừa hưởng của TableAdapter này. Tôi muốn giải thích các thủ tục.

Đầu tiên, tạo lớp bạn muốn kế thừa. TableAdapter ban đầu được thừa kế lớp component, vì vậy bạn nên thừa kế lớp component ngay cả khi bạn tạo ra nó. Tôi sẽ viết mã tôi muốn chia sẻ ở đây, nhưng tôi sẽ chỉ viết một lớp học. Phù hợp với không gian tên với những gì bạn đã tạo.

using System.ComponentModel;

namespace DataSetBaseAdapter
{
  public class BaseAdapter : Component
  {
  }
}

Sau đó mở thiết kế DataSet và chọn TableAdapter mà bạn đã tạo.

Bấm chuột phải để mở thuộc tính. Có một tài sản được gọi là BaseClass, mà ban đầu nên được "System. ComponentModel. component". Viết lại cho lớp mà bạn vừa tạo ra. Tôi sẽ viết tất cả mọi thứ, bao gồm cả không gian tên.

Nếu bạn lưu nó, bạn sẽ thấy rằng lớp cơ sở của TableAdapter đã thay đổi. Bằng cách thiết lập này cho mỗi TableAdapter, bạn có thể viết chung xử lý các lớp cơ sở.

Ví dụ: nếu bạn muốn truy cập vào một SQL hoặc SQLDataAdapter nội bộ, viết Bộ điều hợp và CommandCollections được tạo tự động chỉ thuộc tính được tạo ra bởi lớp kế thừa, vì vậy chúng không thể được chạm trực tiếp từ người thừa kế. Mã sau sử dụng phản ánh để buộc truy cập.

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

Bạn có thể thấy rằng bạn thực sự có thể sử dụng TableAdapter để truy cập các thuộc tính của lớp thừa kế.