Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 全局控制TableAdapter命令超时_C#_Tableadapter - Fatal编程技术网

C# 全局控制TableAdapter命令超时

C# 全局控制TableAdapter命令超时,c#,tableadapter,C#,Tableadapter,我有一个带有QueriesTableAdapter的数据集。为了控制SqlCommand.CommandTimeout,我添加了一个名为QueriesTableAdapter的部分类,其中包含一个名为ChangeTimeout的公共方法 partial class QueriesTableAdapter { public void ChangeTimeout(int timeout) { foreach (System.Data.SqlClient.SqlComm

我有一个带有QueriesTableAdapter的数据集。为了控制SqlCommand.CommandTimeout,我添加了一个名为QueriesTableAdapter的部分类,其中包含一个名为ChangeTimeout的公共方法

partial class QueriesTableAdapter
{
    public void ChangeTimeout(int timeout)
    {
        foreach (System.Data.SqlClient.SqlCommand cmd in CommandCollection)
        {
            cmd.CommandTimeout = timeout;
        }
    }
}
对于具有QueriesTableAdapter的每个数据集,我可以在执行之前设置CommandTimeout

using (NameSpace.DataSet.DataSetTableAdapters.QueriesTableAdapter ta =
new NameSpace.DataSet.DataSetTableAdapters.QueriesTableAdapter())
{
    ta.ChangeTimeout(3600);
    ta.DoSomething();
}

这在大多数情况下都很有效,因为“QueriesTableAdapter”是在数据集设计器中为您命名的。我遇到的问题是唯一命名的TableAdapter。例如,如果我有一个名为Person的DataTable和一个名为PersonTableAdapter的TableAdapter,那么我必须以编写QueriesTableAdapter类的相同方式编写PersonTableAdapter部分类。我有数百个具有唯一TableAdapter名称的数据表。我不想为每一个创建一个分部类。如何以全局方式访问分部类的底层SqlCommand对象?

所有生成的TableAdapter都从组件继承。因此,您可以编写这样的方法,使用反射来提取适配器属性:

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

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

        SqlDataAdapter adapter = adapterProp.GetValue(component, null) as SqlDataAdapter;
        if (adapter == null)
        {
            return;
        }

        adapter.SelectCommand.CommandTimeout = timeout;
    }
然后你可以这样称呼它:

MyTableAdapter ta = new MyTableAdapter();
this.ChangeTimeout(ta,1000);

我假设,既然您使用的是类型化数据集,那么您仍然在.NET2.0中,这就是为什么我没有费心将其作为扩展方法的原因

我尝试了这两种选择,并提出了一些问题 在第一个答案中,CommandCollection对象必须导入/使用哪个命名空间
在2ns Answer adapter.SelectCommand返回空值

由于某种原因,我的适配器的.SelectCommand为空,因此我不得不通过CommandCollection对象,因此我认为我应该根据上面的答案发布我的小更改

包括:

using System.ComponentModel;
using System.Reflection;
代码:


BFree和mark的类似解决方案很好地解决了反射问题。下面是一个轻微的改进,我认为可以产生更整洁的代码

您还可以更改TableAdapter在数据集设计器中使用的基类。您可以将TableAdapter的基类更改为MyTableAdapterSeclass或类似的类,以提供所需的功能。通过在数据集.xsd文件上执行“在文件中查找”和“替换”,可以在所有TableAdapter上快速进行此更改

而不是BFree对具有签名的调用方的方法:

private void ChangeTimeout(Component component, int timeout)
public void ChangeTimeout(int timeout)
然后,您可以使用签名在被调用方TableAdapter的基类上创建一个方法:

private void ChangeTimeout(Component component, int timeout)
public void ChangeTimeout(int timeout)

BFree,我应该在哪里添加这个方法?你真正想要的任何地方。理想情况下,您可能会创建一个静态帮助器类,并将其作为静态方法添加到该类中。在我的答案中可以选择将该方法放置在何处。替换了最后一行命令[0]。CommandTimeout=timeout;在TableAdapter中使用以下方法以适应多种方法:foreach(SqlCommand-sc-in-command){sc.CommandTimeout=timeout;}