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