C # и SQLite;Оптимальный код для вставки в отношения многие ко многим - PullRequest
0 голосов
/ 04 марта 2019

Я учусь работать с SQLite с использованием C # и имею простой пример.Я хочу получить информацию из формы WPF и вставить ее в базу данных SQLite.Структура довольно проста. У меня есть одно отношение «многие ко многим» между автором и статьей: Изображение отношения

И простая форма для ввода данных: Форма WPF

Чего я хочу добиться, так это вставить новую статью из текстового поля «Заголовок статьи», а каждого автора - из «Представления списка».Источник списка формы привязан к ObservableCollection: ObservableCollection<string> authorList = new ObservableCollection<string>();

Используя некоторые основные руководства в Интернете, я написал следующий код, теперь код работает нормально и выполняет то, что мне нужно.Но так как я все еще неопытен, я задаюсь вопросом, является ли такой способ ведения дел достойным.Если нет, я хотел бы дать несколько советов о том, что нужно изменить и как улучшить код.

private void Button_Click(object sender, RoutedEventArgs e)
{
    string insertQuery;
    SQLiteCommand sqlCommand;

    //Variable to store last inserted article id and list for author ids
    long lastArtID;
    List<long> authorIDArray = new List<long>();

    //Query to insert new Article into tblArticle
    insertQuery = "INSERT INTO tblArticle (Title, PersonalComment, File) VALUES (@Name, @PersonalComment, @File)";
    sqlCommand = new SQLiteCommand(insertQuery, NikasDB.myConnection);
    NikasDB.OpenConnection();

    //Add parameters from the window_textboxes
    sqlCommand.Parameters.AddWithValue("@Name", txbTitle.Text);
    sqlCommand.Parameters.AddWithValue("@PersonalComment", txbPersonalComment.Text);
    sqlCommand.Parameters.AddWithValue("@File", txbFileName.Text);
    sqlCommand.ExecuteNonQuery();
    //Retrieve newly added article id
    lastArtID = NikasDB.myConnection.LastInsertRowId;

    string selectQuery;
    SQLiteDataReader GetResult;

    //For each author in authorList check if author already exists
    //If it exists retrieve its id and store in authorIDArray
    //else first insert the author and then retrieve id
    foreach (var author in authorList)
    {
        selectQuery = "SELECT ID FROM tblAuthor WHERE Name=@Name";
        sqlCommand = new SQLiteCommand(selectQuery, NikasDB.myConnection);
        sqlCommand.Parameters.AddWithValue("@Name", author);
        GetResult = sqlCommand.ExecuteReader();
        if (GetResult.HasRows)
        {
            if (GetResult.Read())
            {
                authorIDArray.Add(GetResult.GetInt32(0));
            }
        }
        else
        {
            insertQuery = "INSERT INTO tblAuthor (Name) VALUES (@Name)";
            sqlCommand = new SQLiteCommand(insertQuery, NikasDB.myConnection);
            sqlCommand.Parameters.AddWithValue("@Name", author);
            sqlCommand.ExecuteNonQuery();

            authorIDArray.Add(NikasDB.myConnection.LastInsertRowId);
        }
    }

    //Foreach author Id insert ArticleID and AuthorID from list in joint table for many-to-many relationship
    foreach (var authorID in authorIDArray)
    {
        insertQuery = "INSERT into jntArticleAuthor (Article_ID, Author_ID) VALUES (@ArticleID, @AuthorID)";
        sqlCommand = new SQLiteCommand(insertQuery, NikasDB.myConnection);
        sqlCommand.Parameters.AddWithValue("@ArticleID", lastArtID);
        sqlCommand.Parameters.AddWithValue("@AuthorID", authorID);
        sqlCommand.ExecuteNonQuery();
    }

    NikasDB.CloseConnection();
    authorIDArray.Clear();
    authorList.Clear();
}

1 Ответ

0 голосов
/ 04 марта 2019

Здесь все действия, которые вы выполняете внутри события нажатия кнопки.

Вы можете создать слой доступа к данным для всех связанных с БД операций и наследовать его в этом классе.Поэтому, если у вас есть другая форма, вы можете повторно использовать один и тот же метод и разделить операции вставки в разные методы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...