Имеется код (он рабочий), но хотел бы узнать, можно его как-то упростить? Особенно интересует, можно как-нибудь уменьшить кол-во строк? Просто из-за использования using
, блоков исключения и т.д код растягивается, теряется читабельность.
Пожалуйста, ответьте как можно понятнее для новичка :)
public partial class CreateAds : Form
{
public MainForm otherForm;
string pathBase = Path.Combine(Application.StartupPath, "ads.db");
public CreateAds(MainForm form1)
{
InitializeComponent();
otherForm = form1;
btCreate.Click += (sender, e) => {
if (!File.Exists(pathBase))
{
SQLiteConnection.CreateFile(pathBase);
using (SQLiteConnection con = new SQLiteConnection(string.Format("Data Source={0};", pathBase)))
{
using (SQLiteCommand cmd = new SQLiteCommand("CREATE TABLE `base` (ID integer primary key, Name varchar, DateCreate varchar, DateEnd varchar, Mesto tinyint(5));", con))
{
try
{
con.Open();
cmd.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
}
}
}
using (SQLiteConnection con = new SQLiteConnection(string.Format("Data Source={0};", pathBase)))
{
try
{
con.Open();
string query = string.Format("INSERT INTO 'base' ('Name', 'DateCreate', 'DateEnd', 'Mesto') VALUES ('{0}', '{1}', '{2}', '{3}');", tbName.Text, tbDateCreate.Text, tbDateEnd.Text, tbMesto.Value);
using (SQLiteCommand cmd = new SQLiteCommand(query, con))
{
cmd.ExecuteNonQuery();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
con.Close();
}
}
otherForm.dgv.Rows.Add(tbName.Text, tbDateCreate.Text, tbDateEnd.Text, tbMesto.Value, "Удалить");
};
}
}
public static async Task InsertBase(string Names, string DateCreates, string DateEnds, decimal Mestos)
{
string pathBase = Path.Combine(Application.StartupPath, "ads.db");
using (SQLiteConnection con = new SQLiteConnection(string.Format("Data Source={0};", pathBase)))
{
await con.OpenAsync();
string query = string.Format("INSERT INTO 'base' ('Name', 'DateCreate', 'DateEnd', 'Mesto') VALUES ('{0}', '{1}', '{2}', '{3}');", Names, DateCreates, DateEnds, Mestos);
using (SQLiteCommand cmd = new SQLiteCommand(query, con))
{
await cmd.ExecuteNonQueryAsync();
}
}
}
SQLiteConnection con
следует сделать private
полем класса, да и откровенно говоря, работу с БД нужно выносить в отдельный класс Repository
, совсем выносить, подальше от UI.
SQLite - локальная БД, соединение в принципе можно держать открытым на протяжении всего времени работы программы. Программа запустилась, соединение установили, при закрытии программы закрываем соединение.
Создайте интерфейс со всеми требуемыми методами: create, read, update, delete и используйте его как тип для поля через которое будете работать с классом Repository
.
Методы в Repository
нужно сделать асинхронными, для этого создаете обычные синхронные методы, проверяете как работают (тестируете), а потом делаете так:
//предположим у нас есть синхронный метод
public bool DeleteEntity(int id) {...}
//делаем ему асинхронного брата
public Task<bool> DeleteEntityAsync(int id)
{
return Task.Run<bool>(() =>
{
return DeleteEntity(id);
});
}
Тогда в нужном месте мы сможем вызвать его так
bool result = await _repository.DeleteEntityAsync(123);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Допустим есть какой либо абстрактный класс, который имеет в себе основную реализациюНу как принято во многих статьях или книгах - AbstractBox
Сложилась непростая ситуацияВдруг понадобилось написать небольшое приложение под iOS, но не тут-то было