访问 TableAdapter 中的 CommandTimeout 属性






4.76/5 (10投票s)
描述了向 TableAdapter 添加公共属性以访问私有 DataAdapter 的 CommandTimeout。
引言
每个Command对象都有一个public的CommandTimeout属性。DataAdapter最多有四个public引用指向Command对象。Visual Studio 2005引入了TableAdapter的概念,它封装了一个DataAdapter。封装的DataAdapter是private的,并且无法公开访问它及其内容。
因此,你无法访问TableAdapter使用的Command对象(这样做是正确的)。但这也就无法访问CommandTimeout属性了!
定义TableAdapter的代码是自动生成的(在C#中,文件名为xxxDataSet.Designer.cs)。修改此文件不是解决方案,因为任何对该文件的更改将在下次代码生成时丢失。
解决方案
.NET V2.0(或者只是C#?)还引入了“partial类”。TableAdapter类是一个partial类(并且你拥有它的源代码),因此你可以向它添加任何额外的功能。只需创建(并在你的项目中包含)一个包含你想要添加到类中的任何代码的文件即可。
以下代码添加了Command对象的CommandTimeout的public属性。(在你的xxxDataSet.Designer.cs文件中查找你的TableAdapter的类名和命名空间。)
namespace xxx.xxxDataSetTableAdapters
{
    public partial class xxxTableAdapter
    {
        public int InsertCommandTimeout
        {
            get
            {
                return ( this._adapter.InsertCommand.CommandTimeout ) ;
            }
            set
            {
                this._adapter.InsertCommand.CommandTimeout = value ;
            }
        }
        public int UpdateCommandTimeout
        {
            get
            {
                return ( this._adapter.UpdateCommand.CommandTimeout ) ;
            }
            set
            {
                this._adapter.UpdateCommand.CommandTimeout = value ;
            }
        }
        public int DeleteCommandTimeout
        {
            get
            {
                return ( this._adapter.DeleteCommand.CommandTimeout ) ;
            }
            set
            {
                this._adapter.DeleteCommand.CommandTimeout = value ;
            }
        }
        public int SelectCommandTimeout
        {
            get
            {
                return ( this._commandCollection[0].CommandTimeout ) ;
            }
            set
            {
                for ( int i = 0 ; i < this._commandCollection.Length ; i++ )
                {
                    if ( ( this._commandCollection [ i ] != null ) )
                    {
                        ((System.Data.SqlClient.SqlCommand) 
                         (this._commandCollection [ i ])).CommandTimeout = value;
                    }
                }
            }
        }
    }
}
然后你可以像这样访问它们
this.xxxTableAdapter.SelectCommandTimeout = 0 ;
// Set the CommandTimeout
// for the TableAdapter's Select command(s)
总结
你可以使用这种技术向生成的partial类添加任何你想要的内容,但要小心你所做的事情!
历史
- 2006年2月8日:初始发布

