Form For Finding Database Table By Row Value

PHOTO EMBED

Mon Aug 22 2022 11:57:34 GMT+0000 (Coordinated Universal Time)

Saved by @HristoT #c#

public void ShowFormFindFirebirdTable(Dictionary<string, IDatabaseProvider> databases)
        {
            using (var form = new XF_FindFirebirdTable())
            {
                form.Text = "Търсене на таблица във Firebird база";
                form.StartPosition = FormStartPosition.CenterScreen;

                form.btnClose.Click += (s, e) => form.Close();

                form.btnCloseFirebirdConnection.Click += (s, e) =>
                {
                    databases["FB"].CloseConnection();
                    MessageBox.Show("Успешно затворена връзка. При следваща заявка, връзката ще бъде автоматично отворена.");
                };

                form.btnSearch.Click += async (s, e) =>
                {
                    form.btnSearch.Enabled = false;
                    form.ValueToFind.Enabled = false;
                    form.btnCloseFirebirdConnection.Enabled = false;
                    form.ShouldAddNumbers.Enabled = false;

                    CancellationTokenSource src = new CancellationTokenSource();
                    CancellationToken ct = src.Token;

                    await Task.Factory.StartNew(async () =>
                    {
                        if (ct.IsCancellationRequested)
                        {
                            return;
                        }

                        var sb = new StringBuilder();
                        var searchFilter = form.ValueToFind.Text.Trim();

                        try
                        {
                            var tableColumnList = await databases["FB"].ExecuteListAsync<TableColumn>(SQL.Generic.GetAllTableColumByVarcharType);
                            var tableColumnGroup = tableColumnList
                            .GroupBy(p => p.TableName, p => p.ColumnName, (key, value) => new { TableName = key, ColumnName = value });

                            int tablesCount = tableColumnGroup.Count();
                            int currentTable = 1;

                            foreach (var tableColums in tableColumnGroup)
                            {
                                form.BeginInvoke((MethodInvoker)delegate ()
                                {
                                    form.CurrentTable.Text = $"В момента претърсвам: {tableColums.TableName}";
                                });

                                var whereBuilder = new StringBuilder("where");
                                var template = form.ShouldAddNumbers.Checked ? " cast(t.\"{0}\" as varchar(30000)) like '%{1}%' or " : " t.\"{0}\" like '%{1}%' or ";

                                foreach (var colum in tableColums.ColumnName)
                                {
                                    whereBuilder.Append(string.Format(template, colum, searchFilter));
                                }

                                var tableName = tableColums.TableName;
                                var sql = $"select count(*) from \"{tableName}\" t {whereBuilder.ToString().TrimEnd(' ', 'r', 'o')};";

                                try
                                {
                                    var obj = await databases["FB"].ExecuteScalarAsync<object>(sql);
                                    int.TryParse(obj.ToString(), out var matchCount);

                                    form.BeginInvoke((MethodInvoker)delegate ()
                                    {
                                        var percent = (int)((decimal)currentTable / tablesCount * 100);
                                        form.ProgressBar.EditValue = percent;
                                        form.Percentage.EditValue = $"{percent}%";
                                    });

                                    if (matchCount > 0)
                                    {
                                        var sqlToShow = sql.Replace("count(", " ");
                                        var index = sqlToShow.IndexOf(')');
                                        var final = sqlToShow.Remove(index, 1).Insert(index, " ");

                                        sb.AppendLine($"TABLE: {tableName}");
                                        sb.AppendLine($"Maches: {matchCount}");
                                        sb.AppendLine("SQL:");
                                        sb.AppendLine($"{final}{Environment.NewLine}");
                                        sb.AppendLine("======================================================================");
                                    }
                                }
                                catch
                                {
                                    sb.AppendLine("SQL:");
                                    sb.AppendLine($"{sql}{Environment.NewLine}");

                                    form.BeginInvoke((MethodInvoker)delegate ()
                                    {
                                        form.ProgressBar.EditValue = 0;
                                        form.Percentage.EditValue = $"0%";
                                    });

                                    throw;
                                }
                                currentTable++;
                            }
                        }
                        catch (Exception ex)
                        {
                            sb.AppendLine("=========================EXCEPTION=========================");
                            sb.AppendLine($"{ex}{Environment.NewLine}");
                        }

                        form.BeginInvoke((MethodInvoker)delegate ()
                        {
                            var log = string.IsNullOrWhiteSpace(sb.ToString()) ? "Няма намерени таблици" : sb.ToString();
                            form.Result.Text = log;
                        });

                    }, ct);

                    form.ValueToFind.Enabled = true;
                    form.btnSearch.Enabled = true;
                    form.btnCloseFirebirdConnection.Enabled = true;
                    form.ShouldAddNumbers.Enabled = true;
                };

                form.ShowDialog();
            }
        }
content_copyCOPY