Оптимизация работы с SQLite

289
11 февраля 2017, 05:46

Имеется код (он рабочий), но хотел бы узнать, можно его как-то упростить? Особенно интересует, можно как-нибудь уменьшить кол-во строк? Просто из-за использования 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(); 
                } 
            } 
        }

Answer 1

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);
READ ALSO
ObservableCollection и абстрактный лист

ObservableCollection и абстрактный лист

Допустим есть какой либо абстрактный класс, который имеет в себе основную реализациюНу как принято во многих статьях или книгах - AbstractBox

262
The iOS Designer requires an active connection to the Mac server

The iOS Designer requires an active connection to the Mac server

Сложилась непростая ситуацияВдруг понадобилось написать небольшое приложение под iOS, но не тут-то было

477
Статический метод расширения

Статический метод расширения

У нас есть статические методы:

248
Вызов метода расширения

Вызов метода расширения

Могу ли я вызвать метод Click в методе ClickAt?

307