如何使用应用程序强制我的数据集重新连接并防止超时错误?

时间:2009-11-03 15:18:03

标签: c# sql .net-2.0 dataset timeout

简短问题

在继续使用DataSet对象之前,我可以使用什么命令让我的DataSet刷新它与SQL Server的连接? 我在.Net 2.0中使用C#


具体细节的同一问题的更长版本

我有一个数据库应用程序,经常在手动启动的操作之间运行几个小时。在长时间(> 1小时)之后返回应用程序并单击按钮时,它将抛出一个带有错误消息的System.Data.SqlClient.SqlException

  

超时已过期。操作完成之前经过的超时时间或服务器没有响应

我想我在这里有几个选择:

  • 增加超时时间
  • 在应用程序执行完操作后强制关闭应用程序,确保应用程序在用户需要时始终重新启动。
  • 在执行每个操作之前测试连接的运行状况。

我的偏好是后者,但我不知道可以调用或测试连接的位置。我正在使用Visual Studio拖放构建我的DataSet,创建一个实例。填充表格并将数据集传递给另一个表单。在加载此其他表单时,抛出异常,但仅当应用程序闲置数小时。

我还没有设法在调试模式下复制它,但我认为异常很可能是由下面的子窗体构造函数的_dsDistrib.tblReport.DefaultView.Sort行抛出的。

那么在我尝试使用DataSet之前,如何确保此DataSet具有活动连接或强制新连接?

主要表格的相关代码

    public frmMain(string[] args)
    {
        InitializeComponent();
        _dsDistrib = new dsDistrib();
        taDistrib = new ReportShunt.dsDistribTableAdapters.tblDistribTableAdapter();
        taDistrib.Fill(_dsDistrib.tblDistrib);
    } 

    private void btnManage_Click(object sender, EventArgs e)
    {
        new frmManageDespatch(_dsDistrib,taDistrib).ShowDialog();
    }

子表单的构造函数

    public frmManageDespatch(dsDistrib ds, dsDistribTableAdapters.tblDistribTableAdapter taDis)
    {
        InitializeComponent();

        _dsDistrib = ds;
        taDistrib = taDis;

        _dsDistrib.tblReport.DefaultView.Sort = "tblReportId";

        dtUsers = (dsDistrib.tblUserDataTable)_dsDistrib.tblUser.Copy();

        cboReport.DataSource = _dsDistrib.tblReport;
        cboReport.DisplayMember = _dsDistrib.tblReport.ReportNameColumn.ColumnName;
        cboReport.ValueMember = _dsDistrib.tblReport.tblReportIdColumn.ColumnName;

        lbxUserSelection.DataSource = dtUsers;
        lbxUserSelection.DisplayMember = dtUsers.OutputFolderColumn.ColumnName;
        lbxUserSelection.ValueMember = dtUsers.tblUserIdColumn.ColumnName;

    }

1 个答案:

答案 0 :(得分:2)

编辑:从您的评论中,我现在猜测taDistrib是一个SqlDataAdapter,它是从一个名为ReportShunt的库中填充的。该库负责打开连接。

假设表适配器有一个select命令,你可以关闭连接。在与数据库通信之前,表适配器通常会自行打开它:

private void btnManage_Click(object sender, EventArgs e)
{
    taDistrib.SelectCommand.Connection.Close();
    new frmManageDespatch(_dsDistrib,taDistrib).ShowDialog();
}

您还可以获取全新的连接:

private void btnManage_Click(object sender, EventArgs e)
{
    var localDsDistrib = new dsDistrib();
    var localTaDistrib = new ReportShunt.dsDistribTableAdapters.
         tblDistribTableAdapter();
    taDistrib.Fill(dsDistrib.tblDistrib);
    new frmManageDespatch(localDsDistrib,localTaDistrib).ShowDialog();
}

更好的是,只有当你真正使用它时才保持连接打开。连接被缓存并重新打开它们根本没有开销。 (我们用数百万的请求来衡量它,并且找不到一个不可思议的差异。)