Ejemplo n.º 1
0
        private async void btnGiveBook_Click(object sender, EventArgs e)
        {
            _searchedFor = SearchedFor.BookIssue;

            var userId = txtUserId.Text;
            var bookId = txtBookId.Text;
            //var days = int.Parse((string) cboDays.SelectedItem);
            var dueDate = txtDueDate.Text;

            if (userId.IsNullOrEmpty() || bookId.IsNullOrEmpty())
            {
                return;
            }

            try
            {
                Cursor = Cursors.WaitCursor;

                var bookIssue = new BookIssueEntity()
                {
                    Id       = Guid.Parse(bookId),
                    UserId   = Guid.Parse(userId),
                    BookId   = Guid.Parse(bookId),
                    IssuerId = Store.CurrentUser.Id,
                    DueDate  = DateTime.Parse(dueDate)
                };

                var createdBookIssue = await BookIssueRepository.GiveBookAsync(bookIssue);

                ctlDataGridView.PopulateDataGridView(createdBookIssue, true, true);

                LocalizeDataGridView();

                btnClear.PerformClick();
            }
            catch (Exception exception)
            {
                Debug.WriteLine(exception.Message);
                MessageBox.Show(Resource_Localization.ErrorUnknown);
            }
            finally
            {
                Cursor = Cursors.Default;
            }
        }
        //private const int RowPerPage = 2;

        internal static async Task <BookIssueEntity> GiveBookAsync(BookIssueEntity bookIssue)
        {
            //await Task.Delay(3000);
            await using var connection = Database.CreateConnection();

            const string cmdText = @"
                BEGIN TRANSACTION [BookIssueEntity_GiveBookAsync]
                    BEGIN TRY
                        UPDATE dbo.[Book]
                        SET [Borrowed]=1
                        WHERE [Id]=@bookId

                        DECLARE @bookIssueTableVariable TABLE(
                            [Id]            UNIQUEIDENTIFIER NOT NULL,
                            [UserId]        UNIQUEIDENTIFIER NOT NULL,
                            [BookId]        UNIQUEIDENTIFIER NOT NULL,
                            [IssuerId]      UNIQUEIDENTIFIER NOT NULL,
                            [ReceiverId]    UNIQUEIDENTIFIER NULL,
                            [IssuedAt]      DATETIME NOT NULL,
                            [DueDate]       DATE NOT NULL,
                            [ReturnedAt]    DATETIME NULL,
                            [Returned]      BIT NOT NULL
                        );

                        INSERT INTO [dbo].[BookIssue]
                            ([UserId], [BookId], [IssuerId], [DueDate])
                        OUTPUT Inserted.[Id], Inserted.[UserId], Inserted.[BookId], [Inserted].[IssuerId], [Inserted].[ReceiverId], [Inserted].[IssuedAt], [Inserted].[DueDate], [Inserted].[ReturnedAt], [Inserted].[Returned]
                        INTO @bookIssueTableVariable
                        VALUES (@userId, @bookId, @issuerId, @duaDate);

                        SELECT t.[Id], t.[UserId], usr.[Username], t.[BookId], book.[BookName], t.[IssuerId], issuer.[Username], t.[ReceiverId], receiver.[Username], t.[IssuedAt], t.[DueDate], t.[ReturnedAt], t.[Returned]
                        FROM @bookIssueTableVariable t
                        JOIN [dbo].[Book] book ON book.[Id] = t.[BookId]
                        JOIN [dbo].[User] usr ON usr.[Id] = t.[UserId]
                        JOIN [dbo].[User] issuer ON issuer.[Id] = t.[IssuerId]
                        LEFT OUTER JOIN [dbo].[User] receiver ON receiver.[Id] = t.[ReceiverId];

                        COMMIT TRANSACTION [BookIssueEntity_GiveBookAsync]
                    END TRY
                    BEGIN CATCH
                        DECLARE
                            @ErrorMessage NVARCHAR(max), 
                            @ErrorSeverity INT, 
                            @ErrorState INT;

                        SELECT
                            @ErrorMessage = ERROR_MESSAGE() + ' Line ' + CAST(ERROR_LINE() AS NVARCHAR(5)),
                            @ErrorSeverity = ERROR_SEVERITY(),
                            @ErrorState = ERROR_STATE();

                        if @@TRANCOUNT > 0
                            ROLLBACK TRANSACTION [Tran1]

                        RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
                    END CATCH";

            var command = new SqlCommand(cmdText, connection);

            command.Parameters.Add("@userId", SqlDbType.UniqueIdentifier).Value   = bookIssue.UserId;
            command.Parameters.Add("@bookId", SqlDbType.UniqueIdentifier).Value   = bookIssue.BookId;
            command.Parameters.Add("@issuerId", SqlDbType.UniqueIdentifier).Value = bookIssue.IssuerId;
            command.Parameters.Add("@duaDate", SqlDbType.Date).Value = bookIssue.DueDate;

            await command.Connection.OpenAsync();

            var reader = await command.ExecuteReaderAsync();

            if (!reader.Read())
            {
                return(null);
            }

            var newBookIssue = new BookIssueEntity()
            {
                Id     = reader.GetGuid(0),
                UserId = reader.GetGuid(1),
                User   = new UserEntity()
                {
                    Username = reader.GetString(2)
                },
                BookId = reader.GetGuid(3),
                Book   = new BookEntity()
                {
                    BookName = reader.GetString(4)
                },
                IssuerId = reader.GetGuid(5),
                Issuer   = new UserEntity()
                {
                    Username = reader.GetString(6)
                },
                ReceiverId = reader.GetGuidSafe(7),
                Receiver   = new UserEntity()
                {
                    Username = reader.GetStringSafe(8)
                },
                IssuedAt   = reader.GetDateTime(9),
                DueDate    = reader.GetDateTime(10),
                ReturnedAt = reader.GetDateTimeSafe(11),
                Returned   = reader.GetBoolean(12)
            };

            return(newBookIssue);
        }