全局控制TableAdapter命令超时

Bil*_*ver 4 c# tableadapter

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

partial class QueriesTableAdapter
{
    public void ChangeTimeout(int timeout)
    {
        foreach (System.Data.SqlClient.SqlCommand cmd in CommandCollection)
        {
            cmd.CommandTimeout = timeout;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

对于每个拥有QueriesTableAdapter的DataSet,我可以在执行之前设置CommandTimeout.

using (NameSpace.DataSet.DataSetTableAdapters.QueriesTableAdapter ta =
new NameSpace.DataSet.DataSetTableAdapters.QueriesTableAdapter())
{
    ta.ChangeTimeout(3600);
    ta.DoSomething();
}
Run Code Online (Sandbox Code Playgroud)

这在大多数情况下都很有效,因为"QueriesTableAdapter"是在DataSet设计器中为您命名的.我遇到的问题是具有唯一名称的TableAdapter.例如,如果我有一个名为Person的DataTable和一个名为PersonTableAdapter的TableAdaper,我必须像编写QueriesTableAdaper类一样编写PersonTableAdapter分部类.我有数百个具有唯一TableAdapter名称的DataTable.我不想为每个人创建一个部分类.如何以全局方式访问部分类的基础SqlCommand对象?

小智 11

由于某种原因,我的适配器的.select命令是null所以我最终不得不通过CommandCollection对象,所以我想我会根据上面的答案发布我的小改动.

包括:

using System.ComponentModel;
using System.Reflection;
Run Code Online (Sandbox Code Playgroud)

码:

private void ChangeTimeout(Component component, int timeout)
        {
            if (!component.GetType().Name.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;
            }

            command[0].CommandTimeout = timeout;            
        }
Run Code Online (Sandbox Code Playgroud)