public void Should_Null_The_DbCommand_On_Dispose()
        {
            // Arrange
            DatabaseCommand databaseCommand = Sequelocity.GetDatabaseCommand(ConnectionStringsNames.SqlServerConnectionString);

            // Act
            databaseCommand.Dispose();

            // Assert
            Assert.Null(databaseCommand.DbCommand);
        }
Exemple #2
0
        private DbException RaiseSqlDeadLock(bool withRetry, bool throwException)
        {
            // See: http://stackoverflow.com/questions/22825147/how-to-simulate-deadlock-on-sql-server

            SqlConnection connection2 = new SqlConnection(Configuration.CONNECTION_STRING);

            connection2.Open();
            DbException exToReturn = null;

            try
            {
                using (var cmd = new DatabaseCommand(_connection))
                {
                    cmd.Log = Console.WriteLine;

                    cmd.CommandText = @" CREATE TABLE ##Employees ( 
                                             EmpId INT IDENTITY, 
                                             EmpName VARCHAR(16), 
                                             Phone VARCHAR(16) 
                                         ) 

                                         INSERT INTO ##Employees (EmpName, Phone) 
                                         VALUES('Martha', '800-555-1212'), ('Jimmy', '619-555-8080') 

                                         CREATE TABLE ##Suppliers ( 
                                             SupplierId INT IDENTITY, 
                                             SupplierName VARCHAR(64), 
                                             Fax VARCHAR(16) 
                                         ) 

                                         INSERT INTO ##Suppliers (SupplierName, Fax) 
                                         VALUES ('Acme', '877-555-6060'), ('Rockwell', '800-257-1234') ";

                    cmd.ExecuteNonQuery();
                }

                using (var cmd1 = new DatabaseCommand(_connection))
                {
                    using (var cmd2 = new DatabaseCommand(connection2))
                    {
                        cmd1.Log = Console.WriteLine;
                        cmd2.Log = Console.WriteLine;

                        cmd1.TransactionBegin();
                        cmd2.TransactionBegin();

                        cmd1.CommandText = " UPDATE ##Employees SET EmpName = 'Mary'    WHERE empid = 1 ";
                        cmd1.ExecuteNonQuery();

                        cmd2.CommandText = " UPDATE ##Suppliers SET Fax = N'555-1212'   WHERE supplierid = 1 ";
                        cmd2.ExecuteNonQuery();

                        // Start and when cmd2.ExecuteNonQuery command will be executed, an DeadLock exception will be raised.
                        Task task1 = Task.Factory.StartNew(() =>
                        {
                            cmd1.ThrowException = throwException;
                            if (withRetry)
                            {
                                cmd1.Retry.SetDefaultCriteriaToRetry(RetryDefaultCriteria.SqlServer_DeadLock);
                            }
                            cmd1.CommandText = " UPDATE ##Suppliers SET Fax = N'555-1212'   WHERE supplierid = 1 ";
                            cmd1.ExecuteNonQuery();
                        });

                        System.Threading.Thread.Sleep(500);

                        cmd2.CommandText = " UPDATE ##Employees SET phone = N'555-9999' WHERE empid = 1 ";
                        cmd2.ExecuteNonQuery();

                        cmd2.Dispose();
                        connection2.Close();

                        // Wait cmd1 finished (and raised an Exception)
                        task1.Wait();

                        exToReturn = cmd1.Exception;
                    }
                }

                DropTemporaryTable();
            }
            finally
            {
                connection2.Close();
                connection2.Dispose();
                connection2 = null;
            }

            return(exToReturn);
        }