dashboard-403207-web-dashboard-create-dashboards-on-the-web-providing-data-working-with-sql-data-sources-manage-timeout-limit.md
The Web Dashboard has a 300-second time limit to execute a query. When a query timeout expires, the query execution stops and an exception occurs.
You can extend or shorten the time limit in code. The ConnectionOptions.DbCommandTimeout property specifies how many seconds the Web Dashboard waits for a query to execute. The time set in the property is stored in a dashboard definition after a successful connection to a database.
The examples below override the dashboard load procedure and set the time limit (up to 600 seconds) for an SQL Data Source query in a dashboard. Use the following code if you create a new data source based on the existing data connection in the UI:
using System.Web.Routing;
using DevExpress.DashboardCommon;
using DevExpress.DashboardWeb;
using DevExpress.DashboardWeb.Mvc;
using System.Linq;
namespace MvcDashboardDataSources {
public static class DashboardConfig {
public static void RegisterService(RouteCollection routes){
routes.MapDashboardRoute("dashboardControl", "DefaultDashboard");
DashboardConfigurator.Default.SetDashboardStorage(new DashboardFileStorageEx("~/App_Data/Dashboards"));
DashboardConfigurator.Default.SetConnectionStringsProvider(new DevExpress.DataAccess.Web.ConfigFileConnectionStringsProvider());
}
public class DashboardFileStorageEx : DashboardFileStorage {
public DashboardFileStorageEx(string workingDirectory) : base(workingDirectory) { }
protected override System.Xml.Linq.XDocument LoadDashboard(string dashboardID){
var dashboardXML = base.LoadDashboard(dashboardID);
Dashboard d = new Dashboard();
d.LoadFromXDocument(dashboardXML);
foreach (var ds in d.DataSources.OfType<DashboardSqlDataSource>())
ds.ConnectionOptions.CommandTimeout = 600;
return d.SaveToXDocument();
}
}
}
}
Imports System.Web.Routing
Imports DevExpress.DashboardCommon
Imports DevExpress.DashboardWeb
Imports DevExpress.DashboardWeb.Mvc
Imports System.Linq
Namespace MvcDashboardDataSources
Public Module DashboardConfig
Public Sub RegisterService(ByVal routes As RouteCollection)
routes.MapDashboardRoute("dashboardControl", "DefaultDashboard")
DashboardConfigurator.Default.SetDashboardStorage(New DashboardFileStorageEx("~/App_Data/Dashboards"))
DashboardConfigurator.Default.SetConnectionStringsProvider(New DevExpress.DataAccess.Web.ConfigFileConnectionStringsProvider())
End Sub
Public Class DashboardFileStorageEx
Inherits DashboardFileStorage
Public Sub New(ByVal workingDirectory As String)
MyBase.New(workingDirectory)
End Sub
Protected Overrides Function LoadDashboard(ByVal dashboardID As String) As System.Xml.Linq.XDocument
Dim dashboardXML = MyBase.LoadDashboard(dashboardID)
Dim d As New Dashboard()
d.LoadFromXDocument(dashboardXML)
For Each ds In d.DataSources.OfType(Of DashboardSqlDataSource)()
ds.ConnectionOptions.CommandTimeout = 600
Next ds
Return d.SaveToXDocument()
End Function
End Class
End Module
End Namespace
using DevExpress.DashboardAspNetCore;
using DevExpress.DashboardCommon;
using DevExpress.DashboardWeb;
using Microsoft.Extensions.FileProviders;
var builder = WebApplication.CreateBuilder(args);
// ...
builder.Services.AddScoped<DashboardConfigurator>((IServiceProvider serviceProvider) => {
DashboardConfigurator configurator = new DashboardConfigurator();
configurator.SetConnectionStringsProvider(new DashboardConnectionStringsProvider(configuration));
configurator.SetDashboardStorage(new DashboardFileStorageEx(fileProvider.GetFileInfo("Data/Dashboards").PhysicalPath));
return configurator;
});
// ...
var app = builder.Build();
// ...
app.Run();
// ...
public class DashboardFileStorageEx : DashboardFileStorage {
public DashboardFileStorageEx(string workingDirectory) : base(workingDirectory) { }
protected override System.Xml.Linq.XDocument LoadDashboard(string dashboardID) {
var dashboardXML = base.LoadDashboard(dashboardID);
Dashboard d = new Dashboard();
d.LoadFromXDocument(dashboardXML);
foreach (var ds in d.DataSources.OfType<DashboardSqlDataSource>())
ds.ConnectionOptions.CommandTimeout = 600;
return d.SaveToXDocument();
}
}
The examples below show how to extend the timeout. The DbCommandTimeout property sets the time limit (up to 600 seconds) for the registered SQL Data Source query. Use the following code if you connect a dashboard to a predefined data source:
using DevExpress.DashboardCommon;
using DevExpress.DashboardWeb;
using DevExpress.DashboardWeb.Mvc;
using DevExpress.DataAccess.Sql;
using System.Web.Routing;
Namespace MvcDashboardDataSources {
public static class DashboardConfig {
public static void RegisterService(RouteCollection routes) {
routes.MapDashboardRoute("dashboardControl", "DefaultDashboard");
DashboardConfigurator.Default.SetConnectionStringsProvider(new DevExpress.DataAccess.Web.ConfigFileConnectionStringsProvider());
DashboardConfigurator.Default.SetDataSourceStorage(CreateDataSourceStorage());
}
public static DataSourceInMemoryStorage CreateDataSourceStorage(){
DataSourceInMemoryStorage dataSourceStorage = new DataSourceInMemoryStorage();
// Registers an SQL data source.
DashboardSqlDataSource sqlDataSource = new DashboardSqlDataSource("SQL Data Source", "NWindConnectionString");
SelectQuery query = SelectQueryFluentBuilder
.AddTable("SalesPerson")
.SelectAllColumnsFromTable()
.Build("Sales Person");
sqlDataSource.Queries.Add(query);
sqlDataSource.ConnectionOptions.DbCommandTimeout = 600;
dataSourceStorage.RegisterDataSource("sqlDataSource", sqlDataSource.SaveToXml());
return dataSourceStorage;
}
}
}
Imports DevExpress.DashboardCommon
Imports DevExpress.DashboardWeb
Imports DevExpress.DashboardWeb.Mvc
Imports DevExpress.DataAccess.Sql
Imports System.Web.Routing
Namespace MvcDashboardDataSources
Public Module DashboardConfig
Public Sub RegisterService(ByVal routes As RouteCollection)
routes.MapDashboardRoute("dashboardControl", "DefaultDashboard")
DashboardConfigurator.Default.SetConnectionStringsProvider(New DevExpress.DataAccess.Web.ConfigFileConnectionStringsProvider())
DashboardConfigurator.Default.SetDataSourceStorage(CreateDataSourceStorage())
End Sub
Public Function CreateDataSourceStorage() As DataSourceInMemoryStorage
Dim dataSourceStorage As New DataSourceInMemoryStorage()
' Registers an SQL data source.
Dim sqlDataSource As New DashboardSqlDataSource("SQL Data Source", "NWindConnectionString")
Dim query As SelectQuery = SelectQueryFluentBuilder.AddTable("SalesPerson").SelectAllColumnsFromTable().Build("Sales Person")
sqlDataSource.Queries.Add(query)
sqlDataSource.ConnectionOptions.DbCommandTimeout = 600
dataSourceStorage.RegisterDataSource("sqlDataSource", sqlDataSource.SaveToXml())
Return dataSourceStorage
End Function
End Module
End Namespace
using DevExpress.DashboardAspNetCore;
using DevExpress.DashboardCommon;
using DevExpress.DashboardWeb;
using Microsoft.Extensions.FileProviders;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<DashboardConfigurator>((IServiceProvider serviceProvider) => {
DashboardConfigurator configurator = new DashboardConfigurator();
configurator.SetConnectionStringsProvider(new DashboardConnectionStringsProvider(configuration));
DataSourceInMemoryStorage dataSourceStorage = new DataSourceInMemoryStorage();
// Registers an SQL data source.
DashboardSqlDataSource sqlDataSource = new DashboardSqlDataSource("SQL Data Source", "NWindConnectionString");
sqlDataSource.DataProcessingMode = DataProcessingMode.Client;
SelectQuery query = SelectQueryFluentBuilder
.AddTable("Categories")
.Join("Products", "CategoryID")
.SelectAllColumns()
.Build("Products_Categories");
sqlDataSource.Queries.Add(query);
sqlDataSource.ConnectionOptions.DbCommandTimeout = 600;
dataSourceStorage.RegisterDataSource("sqlDataSource", sqlDataSource.SaveToXml());
configurator.SetDataSourceStorage(dataSourceStorage);
return configurator;
});
var app = builder.Build();