@@ -18,9 +18,9 @@ public static class DatabaseTestUtility
1818 TConfiguration configuration = TestConfigurationLoader . Load < TConfiguration > ( testContext ) ;
1919 return CreateDatabaseAccessorFactory ( configuration ) ;
2020 }
21- public static IDatabaseAccessorFactory CreateDatabaseAccessorFactory < TConfiguration > ( TConfiguration configuration ) where TConfiguration : DatabaseConfigurationBase , new ( )
21+ public static IDatabaseAccessorFactory CreateDatabaseAccessorFactory < TConfiguration > ( TConfiguration configuration , int ? defaultCommandTimeout = null ) where TConfiguration : DatabaseConfigurationBase , new ( )
2222 {
23- return new DapperDatabaseAccessorFactory ( configuration . Database . ConnectionString , RaiseErrorWithNoWaitBehavior . ExecuteScalar ) ;
23+ return new DapperDatabaseAccessorFactory ( configuration . Database . ConnectionString , RaiseErrorWithNoWaitBehavior . ExecuteScalar , defaultCommandTimeout ) ;
2424 }
2525
2626 // RAISERROR WITH NOWAIT is useful to receive immediate progress of a long running command.
@@ -43,24 +43,26 @@ private sealed class DapperDatabaseAccessorFactory : IDatabaseAccessorFactory
4343 {
4444 private readonly string _connectionString ;
4545 private readonly RaiseErrorWithNoWaitBehavior _raiseErrorWithNoWaitBehavior ;
46+ private readonly int ? _defaultCommandTimeout ;
4647
47- public DapperDatabaseAccessorFactory ( string connectionString , RaiseErrorWithNoWaitBehavior raiseErrorWithNoWaitBehavior )
48+ public DapperDatabaseAccessorFactory ( string connectionString , RaiseErrorWithNoWaitBehavior raiseErrorWithNoWaitBehavior , int ? defaultCommandTimeout )
4849 {
49- this . _connectionString = connectionString ;
50- this . _raiseErrorWithNoWaitBehavior = raiseErrorWithNoWaitBehavior ;
50+ _connectionString = connectionString ;
51+ _raiseErrorWithNoWaitBehavior = raiseErrorWithNoWaitBehavior ;
52+ _defaultCommandTimeout = defaultCommandTimeout ;
5153 }
5254
5355 public IDatabaseAccessor Create ( )
5456 {
55- SqlConnection connection = new SqlConnection ( this . _connectionString ) ;
57+ SqlConnection connection = new SqlConnection ( _connectionString ) ;
5658
57- if ( this . _raiseErrorWithNoWaitBehavior == RaiseErrorWithNoWaitBehavior . FireInfoMessageEventOnUserErrors )
59+ if ( _raiseErrorWithNoWaitBehavior == RaiseErrorWithNoWaitBehavior . FireInfoMessageEventOnUserErrors )
5860 {
5961 connection . FireInfoMessageEventOnUserErrors = true ;
6062 connection . InfoMessage += OnInfoMessage ;
6163 }
6264
63- return new DapperDatabaseAccessor ( connection , this . _raiseErrorWithNoWaitBehavior ) ;
65+ return new DapperDatabaseAccessor ( connection , _raiseErrorWithNoWaitBehavior , _defaultCommandTimeout ) ;
6466 }
6567
6668 // When FireInfoMessageEventOnUserErrors is true, errors will trigger an info message event aswell, without throwing an exception.
@@ -85,28 +87,30 @@ private static void OnInfoMessage(object sender, SqlInfoMessageEventArgs e)
8587 private sealed class DapperDatabaseAccessor : Dapper . DapperDatabaseAccessor
8688 {
8789 private readonly RaiseErrorWithNoWaitBehavior _raiseErrorWithNoWaitBehavior ;
90+ private readonly int ? _defaultCommandTimeout ;
8891
89- public DapperDatabaseAccessor ( DbConnection connection , RaiseErrorWithNoWaitBehavior raiseErrorWithNoWaitBehavior ) : base ( connection )
92+ public DapperDatabaseAccessor ( DbConnection connection , RaiseErrorWithNoWaitBehavior raiseErrorWithNoWaitBehavior , int ? defaultCommandTimeout ) : base ( connection , defaultCommandTimeout : defaultCommandTimeout )
9093 {
91- this . _raiseErrorWithNoWaitBehavior = raiseErrorWithNoWaitBehavior ;
94+ _raiseErrorWithNoWaitBehavior = raiseErrorWithNoWaitBehavior ;
95+ _defaultCommandTimeout = defaultCommandTimeout ;
9296 }
9397
9498 // ExecuteNonQuery is optimized, and will not process any messages, so RAISERROR WITH NOWAIT will not work.
9599 // Here we override the underlying behavior, without the caller having to do it.
96100 protected override int Execute ( string commandText , CommandType commandType , int ? commandTimeout , ParametersVisitor parameters )
97101 {
98- if ( this . _raiseErrorWithNoWaitBehavior != RaiseErrorWithNoWaitBehavior . ExecuteScalar )
102+ if ( _raiseErrorWithNoWaitBehavior != RaiseErrorWithNoWaitBehavior . ExecuteScalar )
99103 return base . Execute ( commandText , commandType , commandTimeout , parameters ) ;
100104
101- _ = base . Connection . ExecuteScalar ( commandText , CollectParameters ( parameters ) , transaction : null , commandTimeout , commandType ) ;
105+ _ = base . Connection . ExecuteScalar ( commandText , CollectParameters ( parameters ) , transaction : null , _defaultCommandTimeout ?? commandTimeout , commandType ) ;
102106 return default ;
103107 }
104108 protected override async Task < int > ExecuteAsync ( string commandText , CommandType commandType , int ? commandTimeout , ParametersVisitor parameters , CancellationToken cancellationToken )
105109 {
106- if ( this . _raiseErrorWithNoWaitBehavior != RaiseErrorWithNoWaitBehavior . ExecuteScalar )
107- return await base . ExecuteAsync ( commandText , commandType , commandTimeout , parameters , cancellationToken ) ;
110+ if ( _raiseErrorWithNoWaitBehavior != RaiseErrorWithNoWaitBehavior . ExecuteScalar )
111+ return await base . ExecuteAsync ( commandText , commandType , commandTimeout , parameters , cancellationToken ) . ConfigureAwait ( false ) ;
108112
109- CommandDefinition command = new CommandDefinition ( commandText , CollectParameters ( parameters ) , transaction : null , commandTimeout , commandType , cancellationToken : cancellationToken ) ;
113+ CommandDefinition command = new CommandDefinition ( commandText , CollectParameters ( parameters ) , transaction : null , _defaultCommandTimeout ?? commandTimeout , commandType , cancellationToken : cancellationToken ) ;
110114 _ = await base . Connection . ExecuteScalarAsync ( command ) . ConfigureAwait ( false ) ;
111115 return default ;
112116 }
0 commit comments