在继续使用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;
}
答案 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();
}
更好的是,只有当你真正使用它时才保持连接打开。连接被缓存并重新打开它们根本没有开销。 (我们用数百万的请求来衡量它,并且找不到一个不可思议的差异。)