在表适配器中设置命令超时

时间:2012-01-05 21:32:16

标签: c# .net

我有一个用于连接我的应用程序的XSD文件。我有我的表适配器和方法来访问我在单独的cs文件中的查询。我想增加时间限制。我已经看到了其他解决方案,这点:

    [System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, false)]
    public Scout.ScoutDataTable GetItems(string node, int rank1, int rank2)
    {
        ScoutTableAdapter Adapter = new ScoutTableAdapter();
        Adapter.Adapter.SelectCommand.CommandTimeout = 60;
        return Adapter.GetDataBy(node, rank1, rank2);
    }

但是我在行上设置了超时= 60的空引用。我已经查看了错误,我对导致问题的原因感到困惑。

1 个答案:

答案 0 :(得分:2)

这可能是一个迟到的答案,但可能会帮助有同样问题的人......

我们的想法是为表适配器创建一个基类继承,这会增加表适配器中所有命令的超时。它必须使用反射,因为生成的表适配器不会继承任何有用的东西。它公开了一个公共函数来改变超时。

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

namespace CSP
{
    public class TableAdapterBase : System.ComponentModel.Component
    {
        public TableAdapterBase()
        {
        }

        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);
        }
    }
}

所以你的例子会变成:

[System.ComponentModel.DataObjectMethodAttribute
    (System.ComponentModel.DataObjectMethodType.Select, false)]
public Scout.ScoutDataTable GetItems(string node, int rank1, int rank2)
{
    ScoutTableAdapter Adapter = new ScoutTableAdapter();
    Adapter.SetCommandTimeout(60);
    return Adapter.GetDataBy(node, rank1, rank2);
}

在数据集设计器中,默认基类是System.ComponentModel.Component,只需将其设置为上面的类TableAdapterBase