【问题标题】:How can I add new row to database with values stored in ObservableCollection?如何使用存储在 ObservableCollection 中的值向数据库添加新行?
【发布时间】:2019-04-10 04:46:18
【问题描述】:

所以我有两个 ObservableCollections:

ObservableCollection<Student> studentslist
ObservableCollection<Subject> subjectslist

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

studentslist 包含传递的值:

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)

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

【问题讨论】:

  • 欢迎来到 StackOverflow!您需要 EntityFramework 或其他 ORM 来进行 CRUD 操作
  • 插入学生的 ID 绝不是一个好主意!让 SQL 来处理。该表需要将该字段设置为自动增量且不为空。我注意到您要么在代码中处理逻辑,要么将 UI 元素传递给 ViewModel,这在这两种情况下都是不好的做法!

标签: c# sql-server wpf


【解决方案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。

【讨论】:

  • 现在我正在尝试使用它,但不幸的是我收到一个错误:SQL71502: Procedure: [dbo].[InsertStudent] has an unresolved reference to object [dbo].[apbd .Student]。 我什至为此创建了新主题,因为我找不到适合我的解决方案:link
  • 我已经添加了对该问题的答案,希望对您有所帮助。
  • 我已经解决了这个问题,现在您的解决方案完美运行 :) 感谢您的帮助。
猜你喜欢
  • 2016-11-04
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 2016-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多