C#中DataAdapter对象

news2025/7/10 19:01:13

目录

一、DataAdapter对象概述

二、Fill()方法填充数据集DataSet

1.举例

2.源码

3.生成效果 

三、Update()方法

1.Update()方法更新数据源

2.设置数据库主键

3.源码

4.生成效果 


一、DataAdapter对象概述

        DataAdapter对象是一个数据适配器对象,是DataSet与数据源之间的桥梁。DataAdapter对象提供了4个属性,用于实现与数据源之间的互通。

☑ SelectCommand属性:向数据库发送查询SQL语句。
☑ DeleteCommand属性:向数据库发送删除SQL语句。
☑ InsertCommand属性:向数据库发送插入SQL语句。
☑ UpdateCommand属性:向数据库发送更新SQL语句。

         在对数据库进行操作时,只要将这4个属性设置成相应的SQL语句即可。

         DataAdapter对象中还有2个主要的方法:Fill()方法和Update()方法。

二、Fill()方法填充数据集DataSet

        Fill()方法用数据填充DataSet。 语法如下:

public int Fill (DataSet dataSet,string srcTable)
☑ dataSet:要用记录和架构(如果必要)填充的DataSet。
☑ srcTable:用于表映射的源表的名称。
☑ 返回值:已在DataSet中成功添加或刷新的行数,这不包括受不返回行的语句影响的行。 

        通过DataAdapter对象的Fill()方法填充DataSet数据集,Fill()方法使用Select语句从数据源中检索数据。与Select命令关联的Connection对象必须有效,但不需要将其打开。

1.举例

        创建一个SqlDataAdapter对象,使用该对象的Fill()方法填充DataSet数据集,最后设置DataGridView控件的数据源,显示查询的数据。使用DataAdapter对象的Fill()方法从数据源中提取数据并填充到DataSet时,就会用到SelectCommand属性中设置的命令对象。

2.源码

//Form1.cs
//DataAdapter对象的Fill()方法填充DataSet数据集
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace _7
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        
        /// <summary>
        /// 初始化Form1
        /// </summary>
        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Text = "加载数据";
            button1.Size = new System.Drawing.Size(75, 23);
        }

        /// <summary>
        /// 实例化SqlConnection变量conn
        /// 创建一个SqlCommand对象并通过select方法查询数据库tb_command
        /// 创建一个SqlDataAdapter对象
        /// 设置SqlDataAdapter对象的SelectCommand属性为cmd,与数据库SQL建立关联
        /// 创建一个DataSet对象
        /// 使用SqlDataAdapter对象的Fill()方法填充DataSet数据集
        /// 设置dataGridView1控件的数据源
        /// </summary>
        private void Button1_Click(object sender, EventArgs e)
        {
            SqlConnection conn = new SqlConnection("Server=DESKTOP-QFENBNJ\\SQL_WEN;integrated security=SSPI;Initial Catalog=db_CSharp");
            //SqlConnection conn = new SqlConnection("Server=DESKTOP-GFMO83R;integrated security=SSPI;Initial Catalog=db_CSharp");
            SqlCommand cmd = new SqlCommand("select * from tb_command", conn);
            SqlDataAdapter sda = new SqlDataAdapter
            {
                SelectCommand = cmd
            };
            DataSet ds = new DataSet();
            sda.Fill(ds, "wen");                     //""中的字符任意,不得为空
            dataGridView1.DataSource = ds.Tables[0]; //[]中的序号代表数据表tb_command中表的索引号,表0、表1等
        }
    }
}

3.生成效果 

Form1.cs[设计]

生成效果

SQL数据表tb_command

三、Update()方法

1.Update()方法更新数据源

        使用DataAdapter对象的Update()方法,可以将DataSet中修改过的数据及时地更新到数据库中。

        Update()方法更新数据库时,DataAdapter将调用DeleteCommand、InsertCommand以及UpdateCommand属性。

语法如下:
☑ dataTable:用于更新数据源的DataTable。
☑ 返回值:DataSet中成功更新的行数。

        在调用Update()方法之前,要实例化一个CommandBuilder类,这里为SqlCommandBuilder类,该类可以自动生成单表命令,用于将对DataSet所做的更改与关联的SQL Server数据库的更改相协调,具体使用时,它能自动根据DataAdapter的SelectCommand的SQL语句判断其他的InsertCommand、UpdateCommand和DeleteCommand,这样,就不用设置DataAdapter的InsertCommand、UpdateCommand和DeleteCommand属性,而是直接使用DataAdapter的Update()方法来更新DataSet、DataTable或DataRow即可。

2.设置数据库主键

        使用Update()方法更新数据时,要求更新的数据表必须要主键,否则将会产生异常信息,无法执行更新操作。设置主键指的是设置数据库的主键。可以在Form1.cs通过编程方法设置主键,也可以如本例在SSMS数据库管理软件里设置主键。

        打开SSMS→展开要访问的SQL数据表tb_command→文件夹“列”,右键→新建列→在右侧列表中选择编号→右键→设置主键→存储→鼠标选中tb_command→右键→刷新→展开列,展开键→观察设置主键后的变化(编号左侧出现钥匙标志,代表主键设置成功)。 

 

3.源码

//Form1.cs
//DataAdapter对象的Update()方法,可以将DataSet中修改过的数据及时地更新到数据库中
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;


namespace _8
{
    public partial class Form1 : Form
    {
        //定义全局变量
        public SqlConnection conn;
        public DataSet ds;
        public SqlDataAdapter sda;
        public SqlCommandBuilder cmdbuider;

        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 初始化Form1
        /// 实例化SqlConnection变量conn
        /// 创建一个SqlCommand对象
        /// 创建一个SqlDataAdapter对象
        /// 设置SqlDataAdapter对象的SelectCommand属性为cmd
        /// 创建一个DataSet对象
        /// 使用SqlDataAdapter对象的Fill()方法填充DataSet数据集
        /// 设置dataGridView1控件的数据源
        /// 不得增减行,不得改变行列大小,只读开,不包含行标题列,编辑标志不可见
        /// </summary>
        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Text = "修改";
            label1.Text = "编号:";
            label2.Text = "姓名:";
            label3.Text = "性别:";
            label4.Text = "年龄:";
            label5.Text = "奖金:";

            textBox1.Size = new System.Drawing.Size(40, 21);
            textBox2.Size = new System.Drawing.Size(50, 21);
            textBox3.Size = new System.Drawing.Size(40, 21);
            textBox4.Size = new System.Drawing.Size(40, 21);
            textBox5.Size = new System.Drawing.Size(40, 21);
            button1.Size = new Size(60,23);

            textBox2.Focus();                           //可设置可不设置鼠标焦点

            textBox1.Enabled = false;
            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.AllowUserToDeleteRows = false;
            dataGridView1.AllowUserToResizeColumns = false;
            dataGridView1.AllowUserToResizeRows = false;
            dataGridView1.ReadOnly = true;
            dataGridView1.RowHeadersVisible = false;
            dataGridView1.ShowEditingIcon = false;
            dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect;  //选择其他模式,比如cell,则不能激活CellClick事件

            //conn = new SqlConnection("Server=DESKTOP-QFENBNJ\\SQL_WEN;integrated security=SSPI;Initial Catalog=db_CSharp");
            conn = new SqlConnection("Server=DESKTOP-GFMO83R;integrated security=SSPI;Initial Catalog=db_CSharp");
            SqlCommand cmd = new SqlCommand("select * from tb_command", conn);
            sda = new SqlDataAdapter                    //设置SqlDataAdapter对象的SelectCommand属性为cmd
            {
                SelectCommand = cmd
            };
            ds = new DataSet();                         //实例化DataSet 
            sda.Fill(ds, "cs");                         //使用SqlDataAdapter对象的Fill()方法填充DataSet,""中的字符任意,不得为空
            dataGridView1.DataSource = ds.Tables[0];    //设置dataGridView1控件的数据源,[]中的序号代表数据表tb_command中列表[0]
        }

        private void Button1_Click(object sender, EventArgs e)
        {
            DataTable dt = ds.Tables["cs"];             //创建一个DataTable
            
            sda.FillSchema(dt, SchemaType.Mapped);      //把表结构加载到tb_command表中
            DataRow dr = dt.Rows.Find(textBox1.Text);   //创建一个DataRow,设置DataRow中的值
           
            if (dr != null)                             //必须非null判断否则"System.NullReferenceException: 未将对象引用设置到对象的实例"
            {
                dr[1] = textBox2.Text.Trim();           //[]中数字为表的列号,可以用列名称比如"姓名"
                dr[2] = textBox3.Text.Trim();           //"性别"
                dr[3] = textBox4.Text.Trim();           //"年龄"
                dr[4] = textBox5.Text.Trim();           //"奖金"
                //dr["姓名"] = textBox2.Text.Trim();    //等效语句
                //dr["性别"] = textBox3.Text.Trim();
                //dr["年龄"] = textBox4.Text.Trim();
                //dr["奖金"] = textBox5.Text.Trim();
            }
            cmdbuider = new SqlCommandBuilder(sda);     //虽然VS提示不需要,但不可或缺
            sda.Update(dt);                             //调用其Update()方法将DataTable更新到数据库中
        }

        /// <summary>
        /// 在dataGridView1控件的CellClick事件中实现单击某条数据显示详细信息
        /// </summary>     
        private void DataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
        {
           
                dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
                dataGridView1.EditMode = DataGridViewEditMode.EditProgrammatically;
                dataGridView1.BeginEdit(true);
           
            if (e.RowIndex >= 0 && e.RowIndex < dataGridView1.Rows.Count)
            {
                textBox1.Text = dataGridView1.SelectedCells[0].Value.ToString();
                textBox2.Text = dataGridView1.SelectedCells[1].Value.ToString();
                textBox3.Text = dataGridView1.SelectedCells[2].Value.ToString();
                textBox4.Text = dataGridView1.SelectedCells[3].Value.ToString();
                textBox5.Text = dataGridView1.SelectedCells[4].Value.ToString();
            }           
        }
    }
}

4.生成效果 

Form1.cs[设计]

生成后默认效果

修改第6行,年龄=18,奖金=555

SSMS更新数据库tb_command

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1103626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

说说对前端工程化的理解?

前端工程化是指将前端开发过程中的工具、流程和方法结合起来&#xff0c;提高开发效率、代码质量和团队协作的一种实践。涉及到多个方面&#xff1a; 包括代码管理、构建工具、自动化测试、性能优化、模块化开发等。 以下是前端工程化的主要内容和目标&#xff1a; 1&#xf…

【yolov8系列】yolov8的目标检测、实例分割、关节点估计的原理解析

1 YOLO时间线 这里简单列下yolo的发展时间线&#xff0c;对每个版本的提出有个时间概念。 2 yolov8 的简介 工程链接&#xff1a;https://github.com/ultralytics/ultralytics 2.1 yolov8的特点 采用了anchor free方式&#xff0c;去除了先验设置可能不佳带来的影响借鉴Genera…

nodejs基于vue小型企业银行账目管理系统

这就产生了以台式计算机为核心的管理信息系统在大规模的事务处理和对工作流的管理等方面的应用&#xff0c;在银行帐目管理之中的应用日益增加 且会出现信息的重复传递问题&#xff0c;因此该过程需要进行信息化,以利用计算机进行帐目管理。 3.1 银行帐目管理系统功能模块 …

【vue2高德地图api】03-完善展示页,并且调用poi搜索接口

系列文章目录 文章目录 系列文章目录前言一、编写页面内容样式1.1 html内容1.2 css内容解决报错 二、完善api接口变量方法1.data变量2. methods3. computed4. api接口方法 三、配置api接口方法创建map.jsgetParkList方法 移动端控制台插件四、编写components组件在main.js中引入…

【Leetcode】 416. 分割等和子集

给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和 [11] 。 示例 2&…

跬智信息(Kyligence)成为信创工委会技术活动单位

近日&#xff0c;跬智信息经过层层筛选和评审&#xff0c;成功加入中国电子工业标准化技术协会信息技术应用创新工作委员会&#xff08;以下简称信创工委会&#xff09;&#xff0c;正式成为信创工委会技术活动单位。 中国电子工业标准化技术协会信息技术应用创新工作委员会成立…

UR构型的奇异点

关节5与关节4平行时&#xff0c;发生腕部奇异关节234共面时&#xff0c;发生肘部奇异关节56交点在关节12轴线组成的平面内时&#xff0c;发生肩部奇异 下面这段视频说明了UR构型机器人奇点的三种类型。 参考链接&#xff1a; https://www.mecademic.com/academic_articles/si…

.Git 仓库敏感信息泄露

Git介绍 Git是由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;命名的&#xff0c;它来自英国俚语&#xff0c;意思是“混账”&#xff0c;Git是一个分布式版本控制软件&#xff0c;最初由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;创作&#xff0c;于2005年以…

vue2 解密图片地址(url)-使用blob文件-打开png格式图片

一、背景 开发中需要对加密文件进行解码&#xff0c;如图片等静态资源。 根据后端给到的url地址&#xff0c;返回的是图片文件&#xff0c;但是乱码的&#xff0c;需要解码成png图片进行展示 二、请求接口 将后端返回的文件转为文件流&#xff0c;创建Blob对象来存储二进制…

学习笔记|串口通信实战|简易串口控制器|sprintf函数|STC32G单片机视频开发教程(冲哥)|第二十一集(下):串口与PC通信

目录 3.串口通信实战实操简易的工作原理Tips:sprintf函数简介 总结课后练习 3.串口通信实战 做一个简易串口控制器。发送对应指令&#xff0c;让板子做相应的事情&#xff0c;或者传输数据&#xff08;文本模式下发送&#xff0c;不要选择HEX&#xff09;。 1.串口发送字符Ax\…

双目视觉实战--相机几何

目录 一、针孔摄像机和透镜 1. 针孔摄像机的原理 2. 近轴折射模型 3. 镜头畸变问题 二、摄像机几何 1. 数学基础 2. 相机坐标系&#xff08;空间点&#xff09;→像素坐标系的映射关系&#xff1a; 3. 规范化投影变换 4. 投影变换的性质 三、其他摄像机模型 1. 弱透视…

使用vscode + vite + vue3+ element3 搭建vue3脚手架

技术栈 开发工具&#xff1a;VSCode 代码管理&#xff1a;Git 前端框架&#xff1a;Vue3 构建工具&#xff1a;Vite 路由&#xff1a;vue-router 状态管理&#xff1a;vuex AJAX&#xff1a;axios UI库&#xff1a;element-ui 3 数据模拟&#xff1a;mockjs css预处理&#xf…

ORACLE 特殊日期时间转换,计算

一&#xff1a;特殊日期处理 如该字段存储日期形式为&#xff1a;2023/4/23 9:00&#xff0c;2023-3-1 12:23。将这样的数据转换成正确的格式&#xff08;yyyy-mm-dd HH24:mi:ss&#xff09;&#xff0c;即为&#xff1a;2023-04-23 09:00:00。这里举例的字段为&#xff1a;JS…

PCB电路板废水铜回收工艺有哪些?哪个处理效果好?

印制电路板(PrintedCircuitBoard&#xff0c;简称PCB)作为电子元器件电气相互连接的载体&#xff0c;是电子工业的重要部件之一&#xff0c;半导体、现代高新科技产品都离不开印制电路板。 近年来随着电子行业的快速发展&#xff0c;PCB生产制造量也逐年增加&#xff0c;然而PC…

GPT4 Advanced data analysis Code Interpreter 做行业数据分析、可视化处理图像、视频、音频等

1. 跨境电商如何用ChatGPT选品 ChatGPT Jungle scout 案例&#xff1a;跨境电商如何用ChatGFT选品 ChatGPTJungle scout 素材和资料来自&#xff1a; Jungle ScoutEM, Michael Soltis 和 文韬武韬AIGC 1.1 从Jungle scout上下载数据 Date Range > Last 90 days Downlo…

vscode提示扩展主机在过去5分钟内意外终止了3次,解决方法

参考链接&#xff1a; https://code.visualstudio.com/blogs/2021/02/16/extension-bisect https://code.visualstudio.com/docs/setup/uninstall#_clean-uninstall 使用vscode打开jupyter notebook记事本时&#xff0c;窗口右下角提示扩展主机在过去5分钟内意外终止了3次 而…

力扣每日一题46:全排列

题目描述&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; …

类加载的过程总结以及双亲委派模型[JVM]

类加载过程 类一共有七个生命周期:加载->验证->准备->解析->初始化->使用->卸载 加载&#xff08;加载字节码文件&#xff0c;生成.class对象&#xff09; 加载是类加载的第一个阶段。 加载阶段的任务是在类文件从磁盘加载到内存中&#xff0c;通常是从cl…

【学习笔记】RabbitMQ04:延迟队列的原理以及实现代码

参考资料 RabbitMQ官方网站RabbitMQ官方文档噼咔噼咔-动力节点教程 文章目录 七、延迟队列7.1 什么是延迟队列7.2 延迟队列的解决方案7.2.1 定时任务7.2.2 **被动取消**7.2.3 JDK的延迟队列7.2.3 采用消息中间件&#xff08;rabbitMQ7.2.3.1 适用专门优化后的死信队列实现延迟队…

防火墙规则顺序解决方案

防火墙是保护网络免受攻击的第一道防线&#xff0c;防火墙对互联网和公司IT网络之间的流量拥有绝对控制权&#xff0c;防火墙规则的配置处理调节流量的关键任务。 这些规则会仔细检查传入和传出流量&#xff0c;并根据规则中提到的条件允许或阻止它&#xff0c;防火墙规则越严…