c#和sqlite;最佳代码,用于插入多到多的关系



我正在学习使用C#使用SQLITE的工作,并且有一个简单的情况。我想从WPF表单中检索信息,然后将其插入SQLite数据库中。该结构很简单,我之间有着一段漫长的关系,作者与作者:关系图片

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

我要实现的是从"文章标题"文本框和"列表视图"中的每个作者插入新文章。列表框源限制为观察到汇票: 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();
}

在这里您在按钮单击事件中所做的所有操作。

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

最新更新