将TableAdapter与基类,接口或部分类一起使用的更智能方法

时间:2009-12-04 14:15:01

标签: c# .net ado.net tableadapter

C#ADO.Net TableAdapter对象没有实现和接口,也没有基类(除了Component)。

任何人都在模板中使用TableAdapter,如(GoF-)模式?

更新: 我想解决这里描述的问题:
Help to improve a migration program
使用模板(GoF),适配器(GoF)或其他漂亮的模式。

2 个答案:

答案 0 :(得分:5)

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进行编程。

答案 1 :(得分:1)

与大多数BCL一样,由于您无法访问内部,因此您需要定义自己的类层次结构,并且不要直接引用BCL类。

Adapter pattern这样的东西可能适合你的需要:使用它来将TableAdapter“包装”在你可以用作模板的东西上。