C# ADO.Net TableAdapter 对象不实现接口或基类(组件除外)。
有没有人在(GoF)模板模式的应用程序中使用过 TableAdapter?
更新:我想解决这里描述的问题:
通过使用模板模式 (GoF)、适配器模式 (GoF) 或其他不错的模式
来帮助改进迁移程序。
C# ADO.Net TableAdapter 对象不实现接口或基类(组件除外)。
有没有人在(GoF)模板模式的应用程序中使用过 TableAdapter?
更新:我想解决这里描述的问题:
通过使用模板模式 (GoF)、适配器模式 (GoF) 或其他不错的模式
来帮助改进迁移程序。
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 进行编程。
与大部分 BCL 一样,由于您无权访问内部,因此您需要定义自己的类层次结构并减少对 BCL 类的直接引用。
像适配器模式这样的东西可能会满足您的需求:使用它来“包装” TableAdapter,然后您可以将其用作模板。