Form For Finding Database Table By Row Value
Mon Aug 22 2022 11:57:34 GMT+0000 (UTC)
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(); } }
Comments