如何将带有存储在ObservableCollection中的值的新行添加到数据库?

时间:2019-04-09 19:46:06

标签: c# sql-server wpf

所以我有两个ObservableCollections:

ObservableCollection<Student> studentslist
ObservableCollection<Subject> subjectslist

我将它们传递给与sql数据库建立了完整通信的类。

学生列表包含以下人员传递的值:

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

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

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

这是我的Subject类:

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)

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

1 个答案:

答案 0 :(得分:1)

我喜欢使用存储过程来做这种事情,以最大程度地减少应用程序中的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。