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

本文关键字:设置 命令 超时 适配器 | 更新日期: 2023-09-27 18:19:38

我有一个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的行上得到了null引用。我已经看了这个错误,我很困惑是什么导致了我的问题。

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

这可能是一个有点晚的答案,但可能会帮助有同样问题的人,所以。。。

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

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