将 TableAdapter 与基类、接口或部分类一起使用的更智能方法
Posted
技术标签:
【中文标题】将 TableAdapter 与基类、接口或部分类一起使用的更智能方法【英文标题】:Smarter ways to use TableAdapter with base-class, interface or partial class 【发布时间】:2009-12-04 14:15:01 【问题描述】:C# ADO.Net TableAdapter 对象不实现接口或基类(组件除外)。
有没有人在 (GoF) 模板模式的应用程序中使用过 TableAdapter?
更新: 我想解决这里描述的问题:Help to improve a migration program 通过使用模板模式 (GoF), 适配器模式 (GoF) 或其他不错的模式。
【问题讨论】:
你能给我们一个你想做的例子吗? “以类似模板的模式使用 TableAdapter”意味着什么并不明显。 (典型的 Gang of Four 模板方法模式,en.wikipedia.org/wiki/Template_method_pattern?) @Jeff Sternal:你是对的。更新描述 【参考方案1】:TableAdapter 没有具体的基类或接口。但是 MS 的家伙足够聪明,可以部分离开。因此,您可以使用分部类来使用 TableAdapter。我们遇到了类似的问题,我们想编写可以处理数据模型中所有表适配器的通用代码。我们做了如下。
1.) 定义了一个接口 ITableAdapter
public interface ITableAdapter<TDataTable> : IDisposable
where TDataTable : DataTable
void AttachTransaction(SqlTransaction _transaction);
SqlTransaction CreateTransaction();
int Update(TDataTable _dataTable);
TDataTable GetData();
TDataTable GetById(int Id);
2.) 后来我们为项目中的每个表适配器创建了部分类,并为它们实现了这个接口。
public partial class UsersTableAdapter : ITableAdapter<FileParkDataSet.UsersDataTable>
#region ITableAdapter<UsersDataTable> Members
public void AttachTransaction(SqlTransaction _transaction)
if (this.Adapter == null)
this.InitAdapter();
this.Adapter.InsertCommand.Transaction = _transaction;
this.Adapter.UpdateCommand.Transaction = _transaction;
this.Adapter.DeleteCommand.Transaction = _transaction;
foreach (var _cmd in this.CommandCollection)
_cmd.Transaction = _transaction;
public SqlTransaction CreateTransaction()
if (this.Connection.State != ConnectionState.Closed)
this.Connection.Close();
this.Connection.Open();
return this.Connection.BeginTransaction();
#endregion
现在您可以针对 ITableAdapter 进行编程了。
【讨论】:
嘿,它是局部的?太好了! 是的 - 我可以想象你的快乐。我们费了很大劲才找到解决这个问题的方法。最后我们发现 TableAdapters 是不完整的。 @this.__curious_geek:太好了! +1 您能准确解释一下如何在适配器中使用通用 FileParkDataSet.UsersDataTable 吗? 可能值得注意的是,Microsoft 打算让 TableAdapter 通过成为 used inside a TransactionScope 来参与事务,而不是专门将每个 tableadapter 注册到特定于连接的数据库事务中【参考方案2】:与大部分 BCL 一样,由于您无权访问内部,因此您需要定义自己的类层次结构并减少对 BCL 类的直接引用。
Adapter pattern 之类的东西可能适合您的需求:使用它来“包装”TableAdapter,然后您可以将其用作模板。
【讨论】:
我是唯一一个希望有人在 Microsoft 清醒并刚刚使 ITableAdaptor 成为一件事的人,这样我们就不必适配适配器了。如果有人调整了我的适配适配器,我可能不得不 plotz。以上是关于将 TableAdapter 与基类、接口或部分类一起使用的更智能方法的主要内容,如果未能解决你的问题,请参考以下文章