【问题标题】:Smarter ways to use TableAdapter with base-class, interface or partial class将 TableAdapter 与基类、接口或部分类一起使用的更智能方法
【发布时间】: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:你是对的。更新描述

标签: c# .net ado.net tableadapter


【解决方案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。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 2013-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多