c# - 为自定义 Adapter 和 DataTable 创建接口
问题描述
我正在学习使用接口,使用生成的数据集时出现问题。我在数据库中创建了两个相似的表,然后基于这些表在数据集中创建了两个数据适配器。然后我创建了描述适配器、数据和必要方法的类。
class DB
{
public class Table1 {
public DataSetTableAdapters.Table1TableAdapter adapter;
public DataSet.Table1DataTable dataTable;
public void Init()
{
adapter = new DataSetTableAdapters.Table1TableAdapter();
dataTable = new DataSet.Table1DataTable();
}
}
public class Table2
{
public DataSetTableAdapters.Table2TableAdapter adapter;
public DataSet.Table2DataTable dataTable;
public void Init()
{
adapter = new DataSetTableAdapters.Table2TableAdapter();
dataTable = new DataSet.Table2DataTable();
}
}
}
例如,我尝试像这样实现
interface ISecondaryTable
{
DataTable dataTable { get; set; }
IDataAdapter adapter { get; set; }
}
我尝试了许多其他选择。但没有结果。有谁知道他们的普通班?
解决方案
如果您在 Visual Studio 中打开对象浏览器(2017 年为 Ctrl+Alt+J,以前是 Ctrl-W,J 作为和弦),您可以在项目中看到有关 tableadapter 的更多信息:
所有 TableAdapter 都继承自 Component。他们“HAVE-A”DataAdapter,他们不是“IS-A”DataAdapter。例如,它们看起来像这样:
public class XTableAdapter: Component{
private DataAdapter _da;
}
它们看起来不像这样:
public class XTableAdapter: DataAdapter
综上所述,我不确定您为什么要以这种方式对待它们或将它们与数据表一起封装。数据存储在数据表中,表适配器将其推送到数据库和数据表之间。我认为我从未见过有人这样做,例如,一个包装 StreamWriter(写入文件的东西)和 String(文件的内容)的类:
class CombinedFileContentAndWriter{
StreamWriter sw = newStreamWriter(@"C:\temp\x.txt");
string content = "Hello World";
void DoIt(){
sw.Write(content);
}
}
这并不是说你不能,只是很奇怪。TableAdapter 应该是需要移动数据的中短寿命的东西;他们不需要与这些数据密不可分地配对。一个 tableadapter 可以读写数百个不同的数据表实例。TableAdapter 可以按需创建和丢弃,它们不需要与下载的数据保持配对即可运行。你可以:
var dt = new XTableAdapter().GetDataByName();
//manipulate dt in a 30 minute operation
new XTableAdapter().Update(dt); //a different tableadapter sends the data back to the DB
试图找到一种通用的方式来引用 tableadapter 并没有多大意义,因为它们都完全针对特定的数据表进行了定制,并且具有可变的方法名称,因此不可重载:
SchoolDataset ds = new SchoolDataSet();
new StudentTableAdapter.FillByStudentId(ds, 123);
new StaffTableAdapter.FillByStaffLastName(ds, "Smith");
new ClassroomTableAdapter.FillByYearDesignation(ds, "First grade");
这与使用 tableadapter 和类型化数据表/集所需的深度差不多。
当然,Karen 链接到的问题是一个智能资源,但值得注意的是,主要答案选择创建一种通用的方式来处理 tableadapter,以便他们可以轻松地将每个适配器注册到事务中,而 Microsoft 打算将 tableadapter 操作注册到他们应该在 TransactionScope 内执行的事务
推荐阅读
- zorba - JSONiq console.log 或打印
- java - 如何将字符串反序列化为 Java 对象
- windows - 如何在没有 -s 标志的情况下自动运行 ftp?
- c# - 根据单元格值过滤datagridview中的对象列表
- ruby-on-rails - Rails 5.2 API ActiveStorage 如何获取多图像的 URL 路径?
- r - 如何在R中将一个字符更改为另一个字符
- python - kivy 的 Window.softinput_mode 是否适用于树莓派?
- java - 如何在java swing中显示数据库中的所有数据
- css - 字体不会加载所有字体
- kendo-grid - 如何使用 Kendo UI 在网格顶部创建一行?