Introduction
Every Command
object has a public
CommandTimeout
property. A DataAdapter
has (up to) four public references to Command
objects. Visual Studio 2005 introduced the concept of a TableAdapter
, which encapsulates a DataAdapter
. The encapsulated DataAdapter
is private
, and there is no public access to it and its contents.
The result is that you have no access to the Command
objects used by the TableAdapter
(quite rightly so too). But that allows no access to the CommandTimeout
properties!
The code that defines the TableAdapter
gets generated automatically (in C#, the file is named xxxDataSet.Designer.cs). Modifying this file is not the solution because any changes to this file will be lost the next time the code is generated.
Solution
.NET V2.0 (or is it just C#?) also introduced "partial
classes". The TableAdapter
class is a partial
class (and you have the source code for it) so you can add any additional functionality to it. Simply create (and include in your project) a file containing whatever code you want to add to the class.
The following code adds public
properties for the CommandTimeout
s of the Command
objects. (Look in your xxxDataSet.Designer.cs file for the name of the class and the namespace for your 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;
}
}
}
}
}
}
Then you can access them like this:
this.xxxTableAdapter.SelectCommandTimeout = 0 ;
In closing
You can use this technique to add whatever you like to generated partial
classes, but be careful what you do!
History
- 8th February, 2006: Initial post