首页 > 解决方案 > 如何使用存储在 ObservableCollection 中的值向数据库添加新行?

问题描述

所以我有两个 ObservableCollections:

ObservableCollection<Student> studentslist
ObservableCollection<Subject> subjectslist

我将它们传递给我已经设置了与 sql 数据库的整个通信的类。

studentlist 包含通过以下方式传递的值:

StudentsList.Add(new Student { IdStudent = newStudentId, Name = NameBox.Text, Surname = SurnameBox.Text, Index = IndexBox.Text })

subjectlist 包含列表框中选中复选框的值(我仍然不确定这是否正确):

var selectedSubjects = SubjectList.Where(subjects => subjects.IsChecked == true);
var selectedSubjectsCollection = new ObservableCollection<Subject>(selectedSubjects);

这是我的主题课:

public class Subject
    {
        public int IdSubject{ get; set; }
        public string subject{ get; set; }
        public bool IsChecked { get; set; }


        public override string ToString()
        {
            return $"{subject}";
        }
    }

现在在我的班级中,负责与 sql 数据库的连接,我创建了获取这两个集合的方法,并根据它们的值在数据库中创建新记录:

public void addRecord(ObservableCollection<Student> studentslist, ObservableCollection<Przedmiot> subjectslist)
        {
            OpenConection();
            //...
            CloseConnection();
        }

在数据库中我有学生表:

Student(IdStudent, FirstName, LastName, IndexNumber)

和主题表:

Subject(IdSubject, Name)

并且就我可以从我的数据库中读取数据而言,我不知道如何以正确的方式将这些值传递给数据库中的相应值。

标签: c#sql-serverwpf

解决方案


我喜欢使用存储过程来做这种事情,以尽量减少应用程序中的 T-SQL 代码量。

一个例子是:

public static void InsertSubject(Przedmiot subject)
{
    using (SqlConnection conn = new SqlConnection("Connection String"))
    {
        try
        {
            SqlCommand command = new SqlCommand("dbo.InsertSubject", conn) { CommandType = CommandType.StoredProcedure };

            command.Parameters.Add(new SqlParameter("@IdSubject", subject.IdSubject));
            command.Parameters.Add(new SqlParameter("@Name", subject.subject));

            conn.Open();

            command.ExecuteNonQuery();
        }
        catch (Exception ex)
        {
            // handle exceptions
        }
    }
}

然后,您将拥有一个具有相同签名的存储过程来执行INSERT,即:

CREATE PROCEDURE dbo.InsertSubject
    @IdSubject int
    , @Name varchar(50)
AS

...

GO

如果你想传入整个集合,你可以foreach在上面的例子中实现一个循环。

就我个人而言,我喜欢在每次插入时调用一次这些方法,并将其作为int返回方法(例如),这样我就可以将一些数据传递出去,例如插入行的 ID。


推荐阅读