.NET 框架 SQL Server CRUD 使用数据集和数据适配器

Posted

技术标签:

【中文标题】.NET 框架 SQL Server CRUD 使用数据集和数据适配器【英文标题】:.NET framework SQL Server CRUD using data sets and data adapters 【发布时间】:2021-06-28 22:45:30 【问题描述】:

我在数据库中有以下 2 个表:

Movies (id, title, year) 是表 Language 的父级 Language (movie_id, language) ----movie_id 参考Movies.id

我编写了以下代码,但我仍然需要执行更新/删除部分并在子表中添加新记录

当我从子项(语言)中选择一条记录时,我必须删除并更新一条记录 当我从父表(电影)中选择一条记录时,我必须在子表中添加一条新记录

代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace lab1_v2

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        

        private void Form1_Load(object sender, EventArgs e)
        
            string connectionString = "Server=DESKTOP-T33VBF8;Database=lab1SGBD_v6;Integrated Security=true";

            try
            
                using (SqlConnection connection = new SqlConnection(connectionString))
                
                    // Open connection
                    connection.Open();
                    MessageBox.Show("State of the connection: " + connection.State.ToString());

                    // Create the data set
                    DataSet dataset = new DataSet();
                    
                    // Create the two SQL Data Adapters for parent and child tables.
                    SqlDataAdapter parentAdapter = new SqlDataAdapter("SELECT * FROM Movies;", connection);
                    SqlDataAdapter childAdapter = new SqlDataAdapter("SELECT * FROM Languages;", connection);
                    
                    // Create and populate the parent DataTable and the child DataTable
                    parentAdapter.Fill(dataset, "Movies");
                    childAdapter.Fill(dataset, "Languages");
                    
                    // Create the two BindingSources for parent and child DataTable
                    BindingSource parentBS = new BindingSource();
                    BindingSource childBS = new BindingSource();
                    
                    // Show all the records from parent DataTable in dataGridViewParent
                    parentBS.DataSource = dataset.Tables["Movies"];
                    dataGridViewParent.DataSource = parentBS;
                   
                    // Create and add in the DataSet the DataRelation between parent DataTable and child DataTable
                    DataColumn parentPK = dataset.Tables["Movies"].Columns["id"];
                    DataColumn childFK = dataset.Tables["Languages"].Columns["movie_id"];
                    DataRelation relation = new DataRelation("fk_parent_child", parentPK, childFK);
                    dataset.Relations.Add(relation);
                    
                    // Show in dataGridView the child records which are from the parent record selected
                    childBS.DataSource = parentBS;
                    childBS.DataMember = "fk_parent_child";
                    dataGridViewChild.DataSource = childBS;
                
            
            catch (Exception err)
            
                MessageBox.Show(err.Message.ToString());
            
        
    

【问题讨论】:

I still have to do the following thingswhat is stopping you? 删除/更新时不知道从哪里开始,如何开始 【参考方案1】:

你让你的生活变得如此艰难和复杂。 Visual Studio 几乎可以在几秒钟内写出你在那里写的每一行,甚至更多。

开始一个新项目(如果您不喜欢我的建议,可以将其丢弃,但您可能会喜欢) 向项目中添加新的 DataSet 类型的文件并打开它 出现一个空白的灰色表面,右键单击并选择添加 TableAdapter 按照向导,输入连接字符串,选择下载行的 SQL 语句,输入 SELECT * FROM movies,命名,保存 以相同的方式添加另一个表适配器,但用于语言(我个人认为您的关系不正确,因为一种语言有很多电影,而电影有很多语言,所以您应该同时拥有父表和 MovieLanguage 表分开他们,但是嘿..让我们现在就按你的方式去吧) 如果您在数据库中定义了关系,则会出现一行已经表示 DataRelation。如果您的数据库中没有设置外键,请单击表中 movie.id 行的淡灰色左边距,因此整行变为蓝色(不仅仅是单词),然后单击并按住在同一个地方(边缘)并开始拖动到languages.movi​​e_id - 拖动时会出现一条线,因此您实际上是在绘制两列之间的连接。当你放手时,会出现一个窗口。检查列是否正确(父项是您开始行的位置,子项是您完成的位置。如果错误,请在另一个方向再次执行该行或编辑此对话框设置) 切换到表单设计器 打开数据源工具面板(查看菜单、其他窗口) 将电影节点从数据源中拖出并放到表单中 在数据源中展开电影节点,然后将其下方的 Languages 节点拖出数据源窗口并拖到表单上 不要将作为父节点的 Languages 节点拖出数据源窗口 检查您的语言绑定源是否有一个电影绑定源的 .DataSource 和一个设置为表之间关系名称的 DataMember(您可以通过右键单击并显示它或获取其属性来查看 DataSet 中的关系名称)。如果您的语言绑定源将 DataSource 设置为 DataSet 的名称,则您将错误的语言节点拖出数据源。在属性网格中手动设置正确的设置或从表单中删除所有内容并再次确保将作为电影子项的语言拖出数据源 运行程序

是的,就是这样。没有代码供您编写。 VS 已经编写了所有内容,实际上是您问题中的所有内容以及更多内容,包括插入、更新和删除查询,它们都已连接好——只需按下右上角的保存图标。因为 Languages bindingsource 绑定到 movies bindingsource,所以网格以相关的方式工作;无论当前选择的电影行是什么,都会强制过滤器仅针对与该电影相关的语言。添加新的语言行使其与电影相关

稍后,当您希望您的应用程序比“将整个数据库下载到 DataSet”更有用时,您可以返回 DataSet 并右键单击 tableadapter 并添加另一个查询,例如 SELECT * FROM movies WHERE title LIKE @title,将其命名为 FillByTitle并在 moviesTableAdapter.FillByTitle(someDataSet.Movies, "Jaws%") 之类的代码中使用它。

请记住,您也必须填写您自己想要使用的所有相关行。出于这个原因,我很少让 tableadapter 中的第一个查询是一个简单的“select * from”——我总是添加一个 WHERE primarykeyid = @id 然后我可以遍历填充每个语言 id 的电影,或者如果性能是一个问题,我会添加另一个查询像 SELECT * FROM languages WHERE ID IN (SELECT DISTINCT languageid FROM movies WHERE title LIKE @title) 这样的语言,这样我就可以用 Jaws% 填充电影,然后也可以用 Jaws% 填充语言

【讨论】:

以上是关于.NET 框架 SQL Server CRUD 使用数据集和数据适配器的主要内容,如果未能解决你的问题,请参考以下文章

无法连接到我的 SQL Server 数据库?

实体框架、ASP.NET 和 SQL Server CE

csharp [DB接続] SQL Serverへの接続~CRUD操作

.Net框架搭建之1SQL Server EF MVC简单三层框架

SeriLog 使用经典 .net 框架从 sql server 读取属性值

如何从 SQL Server Management Studio 中的表生成 CRUD 存储过程