C#和SQLite;用于插入多对多关系的最佳代码

时间:2019-03-04 12:56:53

标签: c# wpf sqlite

我正在学习使用C#使用SQLite的情况,并且有一个简单的案例。我想从WPF表单中检索信息并将其插入SQLite数据库。结构非常简单,我在文章和作者之间有一种多对多的关系: Relationship picture

和一个简单的表格来输入数据: WPF form

我想要实现的是从“文章标题”文本框中插入新文章,并从“列表视图”中插入每个作者。表单列表框源绑定到ObservableCollection: ObservableCollection<string> authorList = new ObservableCollection<string>();

使用Internet上的一些基本指南,我编写了以下代码,现在代码可以正常工作,并且可以完成我需要做的事情。但是由于我仍然没有经验,所以我想知道这种做事方式是否是一种体面的方式。如果没有,我想要一些有关更改内容以及如何改进代码的提示。

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 :(得分:0)

这是您在按钮单击事件中执行的所有操作。

您可以为所有与数据库相关的操作创建数据访问层,并在此类中继承它。因此,如果您使用其他表格,则可以重新使用相同的方法 并将插入选择操作分别插入不同的方法。