我怎样才能改变表适配器的命令超时(How can I change the table adapte

2019-06-27 00:00发布

我使用Visual Studio 2008中使用C#。

我有一个.xsd文件,它有一个表适配器。 我想改变表适配器的命令超时。

谢谢你的帮助。

Answer 1:

我已经调查这个问题有点今天拿出基于几个来源以下解决方案。 我们的想法是创建一个基类的表适配器也继承这增加了在表适配器的所有命令的超时而不必重写太多现有的代码。 它使用反射,因为生成的表适配器不继承任何有用的东西。 它公开了一个公共功能,如果你想删除我在构造函数中使用,并用它来改变超时。

using System;
using System.Data.SqlClient;
using System.Reflection;

namespace CSP
{
    public class TableAdapterBase : System.ComponentModel.Component
    {
        public TableAdapterBase()
        {
            SetCommandTimeout(GetConnection().ConnectionTimeout);
        }

        public void SetCommandTimeout(int Timeout)
        {
            foreach (var c in SelectCommand())
                c.CommandTimeout = Timeout;
        }

        private System.Data.SqlClient.SqlConnection GetConnection()
        {
            return GetProperty("Connection") as System.Data.SqlClient.SqlConnection;
        }

        private SqlCommand[] SelectCommand()
        {
            return GetProperty("CommandCollection") as SqlCommand[];
        }

        private Object GetProperty(String s)
        {
            return this.GetType().GetProperty(s, BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.Instance).GetValue(this, null);
        }
    }
}


Answer 2:

对于一些小的修改CSL的思想的伟大工程。

partial class FooTableAdapter
{
  /**
   * <summary>
   * Set timeout in seconds for Select statements.
   * </summary>
   */
  public int SelectCommandTimeout
  {
    set
    {
            for (int i = 0; i < this.CommandCollection.Length; i++)
                if (this.CommandCollection[i] != null)
                 this.CommandCollection[i].CommandTimeout = value;
    }
  }
}

要使用它,只需设置this.FooTableAdapter.CommandTimeout = 60; 之前某处this.FooTableAdapter.Fill();


如果您需要更改很多表适配器的超时时间,你可以创建一个通用的扩展方法,并将它使用反射来更改超时。

/// <summary>
/// Set the Select command timeout for a Table Adapter
/// </summary>
public static void TableAdapterCommandTimeout<T>(this T TableAdapter, int CommandTimeout) where T : global::System.ComponentModel.Component
{                
    foreach (var c in typeof(T).GetProperty("CommandCollection", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.Instance).GetValue(TableAdapter, null) as System.Data.SqlClient.SqlCommand[])
        c.CommandTimeout = CommandTimeout;
}

用法:

this.FooTableAdapter.TableAdapterCommandTimeout(60);
this.FooTableAdapter.Fill(...);

这是一个慢一点。 还有就是如果你使用它的错误类型的对象发生错误的可能性。 (据我所知,没有“的TableAdapter”类,你可以限制它。)



Answer 3:

我有一对夫妇的问题,使用米切尔Gilman的解决方案,我最终能解决方法。

首先,我需要确保使用正确的命名空间。 我花了一段时间才能找出了XSD数据实际上设置设计文件中包含两个命名空间,一个用于数据一般设置一个用于表适配器。 所以,第一件事就是要注意的是,对于表适配器的命名空间应该使用,而不是为数据一般设置。

其次,commandcollection可能不总是当超时命令用于首次初始化。 要解决这个问题,我叫InitCommandCollection命令,如果是这种情况。

因此,适应解我所用的是

namespace xxx.xxxTableAdapters

partial class FooTableAdapter
{
  /**
   * <summary>
   * Set timeout in seconds for Select statements.
   * </summary>
   */
  public int SelectCommandTimeout
  {
    set
    {
        if (this.CommandCollection == null)
                this.InitCommandCollection();

        for (int i = 0; i < this.CommandCollection.Length; i++)
            if (this.CommandCollection[i] != null)
             this.CommandCollection[i].CommandTimeout = value;
    }
  }
}

希望这是有帮助的人!



Answer 4:

在某些情况下,你不能访问成员一样适配器类,因为它们被定义为私有的类。

幸运的是,向导会产生局部类,这意味着你可以扩展它们。 正如[由骓此线索] [1]所描述的,你可以写自己的属性对选择的命令超时。

一般情况下,你可以这样做:

partial class FooTableAdapter
{
  /**
   * <summary>
   * Set timeout in seconds for Select statements.
   * </summary>
   */
  public int SelectCommandTimeout
  {
    set
    {
      for ( int n=0; n < _commandCollection.Length; ++n )
        if ( _commandCollection[n] != null )
          ((System.Data.SqlClient.SqlCommand)_commandCollection[n])
            .commandTimeout = value;
    }
  }
}

请注意,我并没有真正尝试过这个自己,但它似乎是一个可行的解决方案。



Answer 5:

假设你的数据集被称为MYSET。
有一个名为MyTable的一个表

MySETTableAdapters.MyTableTableAdapter fAdapter = 
   new MySETTableAdapters.MyTableTableAdapter();
fAdapter.Adapter.SelectCommand.CommandTimeout = <fill inyour value here>;


Answer 6:

通过提供以秒为单位的TableAdapter和时间打电话ChangeTimeout功能。

this.ChangeTimeout(this.taTest, 500);

功能:

 private void ChangeTimeout(Component component, int timeout)
{
    if (!component.GetType().FullName.Contains("TableAdapter")) { 
        return;
    }

    PropertyInfo adapterProp = component.GetType().GetProperty("CommandCollection", BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.Instance);
    if (adapterProp == null) {
        return;
    }

    SqlCommand[] command = adapterProp.GetValue(component, null) as SqlCommand[];

    if (command == null) {
        return;
    }

    Interaction.command(0).CommandTimeout = timeout;
}


Answer 7:

如果使用部分类,让你有正确的命名空间。 也许[你的数据集的名称] +“的TableAdapter。例如:

命名空间MyProject.DataSet1TableAdapters



Answer 8:

你可以打开属性文件夹,打开Settings.settings和改变你的连接字符串的超时属性。



Answer 9:

下面是一些示例代码MSDN ,使用VB.NET:

Imports System.Data.SqlClient
Namespace MyDataSetTableAdapters
    Partial Class CustomersTableAdapter
        Public Sub SetCommandTimeOut(ByVal timeOut As Integer)
            For Each command As SqlCommand In Me.CommandCollection
                command.CommandTimeout = timeOut
            Next
        End Sub
    End Class
End Namespace

当谈到时间打电话长查询,只需调用查询之前的SetCommandTimeOut方法:

Dim ds As New MyDataSet
Dim customersTA As New MyDataSetTableAdapters.CustomersTableAdapter
' Increase time-out to 60 seconds
customersTA.SetCommandTimeOut(60000)
' Do the slow query
customersTA.FillSlowQuery(ds.Customers)


Answer 10:

这一个是现在有点老了,并怀疑这个解决方案是不相关的每个人,但我已经结束了使用AniPol的解决方案覆盖ObjectDataSource控件如下:

public class MyObjectDataSource : ObjectDataSource
{
    public MyObjectDataSource()
    {
        this.ObjectCreated += this.MyObjectDataSource_ObjectCreated;
    }

    private void MyObjectDataSource_ObjectCreated(object sender, ObjectDataSourceEventArgs e)
    {
        var objectDataSourceView = sender as ObjectDataSourceView;
        if (objectDataSourceView != null && objectDataSourceView.TypeName.EndsWith("TableAdapter"))
        {
            var adapter = e.ObjectInstance;

            PropertyInfo adapterProp = adapter.GetType()
                .GetProperty(
                    "CommandCollection",
                    BindingFlags.NonPublic | BindingFlags.GetProperty | BindingFlags.Instance);
            if (adapterProp == null)
            {
                return;
            }

            SqlCommand[] commandCollection = adapterProp.GetValue(adapter, null) as SqlCommand[];

            if (commandCollection == null)
            {
                return;
            }

            foreach (System.Data.SqlClient.SqlCommand cmd in commandCollection)
            {
                cmd.CommandTimeout = 120;
            }
        }
    }
}


Answer 11:

我喜欢这样; 右键单击Fill()GetX()函数,然后单击Goto Defination的菜单。

你会看到的DataTable的源代码。 找到;

private global::System.Data.SqlClient.SqlCommand[] _commandCollection;

从你的DataAdapter类的命令行。 并改变私人公众。

现在,您可以访问_commandCollection,你可以改变所有的属性。

但是,当您添加或更改任何一篇表单设计要小心,市民将再次自动生成系统是私有的。

而且,当你完成调用填充或获取函数必须复位_commandColleciton调用这个函数( InitCommandCollection()

 public void InitCommandCollection() {}

此功能也AUTOGEN私有,你必须改变公众也!

例:

dsIslemlerTableAdapters.tblIslemlerTableAdapter _t = new dsIslemlerTableAdapters.tblIslemlerTableAdapter();

dsIslemler.tblIslemlerDataTable _m = new dsIslemler.tblIslemlerDataTable();

_t._commandCollection[0].CommandText = "Select * From tblIslemler Where IslemTarihi>='' And IslemTarihi<=''";

_m = _t.GetData();

_t.InitCommandCollection();


Answer 12:

扩大对TableAdapter的,帮助了我很多已经非常有用的答案,我也有需要读出实际的超时值。 从而:

namespace XTrans.XferTableAdapters
{

    public partial class FooTableAdapter
    {
        int? _timeout = null;

        ///<summary>
        ///Get or set the current timeout in seconds for Select statements.
        ///</summary>
        public int CurrentCommandTimeout
        {
            get
            {
                int timeout = 0;

                if (_timeout != null)
                {
                    timeout = (int)_timeout;
                }
                else
                {
                    for (int i = 0; i < this.CommandCollection.Length; i++)
                        if (this.CommandCollection[i] != null)
                            timeout = this.CommandCollection[i].CommandTimeout;
                }
                return timeout;
            }

            set
            {
                if (this.CommandCollection == null)
                    this.InitCommandCollection();

                for (int i = 0; i < this.CommandCollection.Length; i++)
                    if (this.CommandCollection[i] != null)
                    {
                        this.CommandCollection[i].CommandTimeout = value;
                        _timeout = value;
                    }
            }

        }
    }

}


Answer 13:

似乎有这样做更方便的方式。 下面是我发现了什么快速回顾一下。

比方说,我叫mydb的一个(类库)项目添加到我的解决方案。 到该项目中,我添加了一个名为“数据”的数据集。 而进入该数据集,我将一个名为“X”表。

我所得到的设计表面上是一个对象,说明我有一个名为“XTableAdapter”的对象。

我现在打开生成的代码,Data.Designer.cs,寻找XTableAdapter。 当我找到它,我注意到,它包含在命名空间MyDB.DataTableAdapters - 这仅仅是一个项目,“MYDB”,该数据集的名称,“数据”和“TableAdapter的”名称的串联。

随着在手,我现在回去的类库,仍称的Class1.cs(我会略)。

我改变它的命名空间从MYDB到MyDB.DataTableAdapters。

我改变类声明的公共部分类XTableAdapter,并使它看起来像这样:

using System.Data.SqlClient;

namespace MyDB.DataTableAdapters
{
    public partial class XTableAdapter
    {
        public void SetTimeout(int seconds)
        {
            foreach (SqlCommand cmd in CommandCollection)
            {
                cmd.CommandTimeout = seconds;
            }
        }
    }
}

该调用序列几乎是清晰的:

int TwoMinutes = 120;    
XTableAdapter.SetTimeout(TwoMinutes);

少弄乱,忙乱少,少反射(以及,无),填充更小。



文章来源: How can I change the table adapter's command timeout