C#中DataAdapter对象

目录

一、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"];             //创建一个DataTablesda.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.rhkb.cn/news/164318.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Spring篇】详解AOP相关知识

&#x1f38a;专栏【Spring】 &#x1f354;喜欢的诗句&#xff1a;天行健&#xff0c;君子以自强不息。 &#x1f386;音乐分享【如愿】 &#x1f384;欢迎并且感谢大家指出小吉的问题&#x1f970; 文章目录 &#x1f33a;AOP简介&#x1f33a;AOP作用&#x1f33a;AOP核心概…

Jmeter —— jmeter利用取样器中http发送请求

使用Jmeter发送HTTP请求 取样器是用来模拟用户操作&#xff0c;向服务器发送请求以及接收服务器的响应数 据的一类元件&#xff0c;其中HTTP请求取样器是用来模拟常用的http请求的 步骤如下&#xff1a; 步骤一&#xff1a;添加线程组 右击测试计划——添加——线程&#x…

各类证件的版面信息收集

香港身份证的版面分析&#xff1a; 证件页面&#xff1a; 相关的版面信息&#xff1a; 该页面包含香港身份证的信息&#xff0c;可以用于版面分析&#xff1b; 信息来源&#xff1a;香港不同证件说明大汇总|回乡证|居民身份证|护照|永居_手机网易网 台湾通行证号码&#xf…

yolo数据增强,同时旋转txt标签文件

github https://github.com/vkdx/vkdx_cnn-.git YOLO格式txt文件分析 标注好的txt文件中有对应每个标注框的信息,从左到有分别是&#xff1a; class:类别 x_center&#xff1a;标注框中心相对于图像的x坐标 y_center&#xff1a;标注框中心相对于图像的y坐标 w&#xff1a;标…

比例伺服阀放大器厂家

比例阀放大器具有以下优点&#xff1a; 高精度&#xff1a;比例阀放大器能够根据输入信号的微小变化实时调整输出信号&#xff0c;从而实现对液压系统的精确控制。快速响应&#xff1a;比例阀放大器能够快速响应输入信号的变化&#xff0c;并迅速调整输出信号&#xff0c;以满…

亲测好用教师小程序

作为一名老师&#xff0c;经常需要面对的一大挑战就是如何有效地向学生和家长传达重要的学业信息。而其中&#xff0c;成绩的发布与查询更是重中之重。传统的做法是手动录入数据&#xff0c;或者通过电子邮件发送Excel表格&#xff0c;这样做既繁琐又耗时。幸运的是&#xff0c…

智慧公厕改变城市生活,厕所革命标杆应用解决方案

随着城市化进程的加快&#xff0c;公厕作为城市基础设施的重要组成部分&#xff0c;扮演着不可忽视的角色。然而&#xff0c;传统的公厕粗放型管理模式&#xff0c;已经无法满足市民日益增长的需求。为了提升公厕的管理和服务水平&#xff0c;智慧公厕应运而生。 什么是智慧公…

作业收集神器

作业收集系统&#xff0c;这是一个让老师们又爱又恨的存在。爱它&#xff0c;因为可以轻松整理学生作业&#xff0c;掌握他们的学习进度&#xff1b;恨它&#xff0c;因为那一份份纸质作业&#xff0c;总是带来无尽的麻烦和挑战。现在&#xff0c;我要告诉你们一个秘密——如何…

Python---练习:判断是否为一个合法三角形(if else)

案例 判断是否为一个合法三角形 需求&#xff1a;输入三角形的3边&#xff0c;如果两边的长度大于第三条边&#xff0c;则代表是一个合法三角形 思路&#xff1a; 先确定什么是一个合法三角形-----就是任意两边的和&#xff0c;大于第三边。 就像下图&#xff0c;a b 展…

机器学习(23)---Boosting tree(课堂笔记)

文章目录 一、知识记录二、题目2.1 题目12.2 题目22.3 答案书写 一、知识记录 二、题目 2.1 题目1 2.2 题目2 2.3 答案书写

c: Queue Calling in Ubuntu

/*** file TakeNumber.h* author your name (geovindu)* brief * version 0.1* date 2023-10-20* * copyright Copyright (c) 2023 站在巨人的肩膀上 Standing on the Shoulders of Giants* */#ifndef TAKENUMBER_H #define TAKENUMBER_H#include <stdio.h> #include <…

QT读取Excel表格内容到Table Widget

QT读取Excel表格内容到Table Widget_qt导入excel-CSDN博客有一个需求是要把Excel的数据导入到QT的Table Widget表格中。我是一个QT新手&#xff0c;在网上找了很多方法&#xff0c;在这里汇总记录一下。目前总共有四种方法&#xff1a;其中方法适用于不加密的Excel文件&#xf…

[已解决]Unable to connect to broker 0

[已解决]Unable to connect to broker 0 问题 Unable to connect to broker 0 kafka tool 工具无法查看主题 思路 在window的hosts添加上kafka服务器的ip和对应的域名 解决 成功解决&#xff01;

红队专题-从零开始VC++C/S远程控制软件RAT-MFC-[4]客户端与服务端连接

红队专题 招募六边形战士队员服务端编写新建工程server函数创建主线程类获取配置信息运行command 命令头文件里创建引用win32 类库/头文件startsocket 开始监听 类函数添加类StartSocketmysend/myrecv 设置 m_sockCommon 头文件MSGINFO_S 结构体 ThreadMain头文件runflag 启动 …

“权限之舞:Linux安全之道”

W...Y的主页&#x1f60a; 代码仓库分享&#x1f495; &#x1f354;前言&#xff1a; 在之前的Linux博客中&#xff0c;我们学习了基础的Linux指令&#xff0c;具体可以订阅一下博主的Linux专栏学习。当我们想进行递归删除文件时等等许多操作中&#xff0c;只有在root账号中…

碰到it运维故障怎么办丫?突发IT事故怎么快速解决?

随着信息技术的快速发展&#xff0c;企业对于IT系统的依赖程度越来越高。但IT系统突发事件的风险也在不断增加&#xff0c;例如突发故障&#xff0c;例如数据泄露、例如数据入侵等等。那碰到这种it运维故障怎么办&#xff1f;突发IT事故怎么快速解决&#xff1f; 碰到it运维故障…

竞赛 深度学习人体语义分割在弹幕防遮挡上的实现 - python

文章目录 1 前言1 课题背景2 技术原理和方法2.1基本原理2.2 技术选型和方法 3 实例分割4 实现效果5 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 深度学习人体语义分割在弹幕防遮挡上的应用 该项目较为新颖&#xff0c;适合作为竞…

centos7安装erlang23.3.4.11及rabbitmq3.9.16版本

rpm包有系统版本要求&#xff0c;el是Red Hat Enterprise Linux(EL)的缩写。 EL7是Red Hat 7.x&#xff0c;Centos 7.x EL8是Red Hat 8.x, Centos 8.x 所以我们在安装erlang及rabbitmq时需要选择与自己的服务器相对应的rpm包 # rabbitmq的rpm安装包 https://github.com/rabbi…

【使用OpenCV进行目标分割与计数的代码实例详解】

文章目录 概要实例一&#xff1a;硬币分割计数实例二&#xff1a;玉米粒分割计数 概要 在当今数字图像处理领域&#xff0c;图像分割技术是一项至关重要的任务。图像分割旨在将图像中的不同目标或区域准确地分开&#xff0c;为计算机视觉、图像识别和机器学习等领域提供了坚实…

kr 第三阶段(一)16 位汇编

为什么要学习 16 位汇编&#xff1f; 16 位汇编包含了大部分 32 位汇编的知识点。有助于在学习内核的两种模式。 实模式&#xff1a;访问真实的物理内存保护模式&#xff1a;访问虚拟内存 有助于提升调试能力&#xff0c;调试命令与 OllyDbg 和 WinDebug 通用。可以学习实现反…