相关知识:

  1. DataSet中的数据一旦从数据库下载下来,便不再与数据库保持联系。如果修改了DataSet中的数据,需要重新建立连接,并且通过SQL命令将修改更新到数据库去
  2. 编写SQL命令往往比较繁琐和机械化,ADO.NET提供了一个SqlCommandBuilder对象,帮助DataAdapter对象从SELECT语句推算出需要的UPDATE,DELETE和INSERT语句;然后DataAdapter便可以利用这些语句,检查DataSet中被修改的数据,然后提交到数据库
  3. SqlCommandBuilder自动生成的SQL命令虽然方便,但却不灵活。尤其是在需要向多个表中写入数据的时候,往往需要自定义增删改语句

代码示例:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient; namespace ConsoleApplication11
{
class Program
{
static void Main(string[] args)
{
string strConn = @"server=Joe-PC;database=AccountDBforSQLInjection;uid=sa;pwd=root";
SqlConnection conn = new SqlConnection(strConn); string sql = "SELECT AccountID,AccountName,password FROM Account";
SqlDataAdapter da = new SqlDataAdapter(sql, conn); DataSet ds = new DataSet(); da.Fill(ds, "Account"); Console.WriteLine("Account表中原有数据:"); DataTable dt = ds.Tables["Account"];
DataView dv = new DataView(dt);
dv.Sort = "AccountID ASC"; foreach (DataRowView drv in dv)
{
Console.WriteLine("{0}:{1},{2}", drv[], drv[], drv[]);
} Console.WriteLine(""); //添加一行数据——Insert
DataRow newRow = dt.NewRow(); //根据Table的架构,创建一个新的空行
// 给新行赋值
newRow["AccountID"] = ;
newRow["AccountName"] = "new";
newRow["password"] = "";
// 将新行加到表的行集合中
dt.Rows.Add(newRow); //修改一行数据——Update
DataRow updateRow = dt.Rows[]; //修改表中第一行数据
updateRow["password"] = "";//修改了密码为000000 //删除一行数据——Delete
DataRow deleteRow = dt.Rows[];//准备删除原表中第二行数据
dt.Rows.Remove(deleteRow); //测试内存中数据
Console.WriteLine("修改后,Account表中现有数据");
foreach (DataRowView drv in dv)
{
Console.WriteLine("{0}:{1},{2}", drv[], drv[], drv[]);
} //程序在此暂停等待用户输入,检查数据库,newRow此时尚未插入到数据库中。
//此时newRow仅仅是在DataSet对象内存中创建,并为更新到数据库
Console.WriteLine("");
Console.WriteLine("检查数据库中是否已经创建了新行,然后按回车继续。");
Console.ReadLine(); //更新到数据库
//创建SqlCommandBuilder,并且把DataAdapter对象传入。
SqlCommandBuilder cmdBuilder = new SqlCommandBuilder(da);
Console.WriteLine("生成的Insert语句:{0}", cmdBuilder.GetInsertCommand().CommandText);
Console.WriteLine("生成的Update语句:{0}", cmdBuilder.GetUpdateCommand().CommandText);
//之前建DataAdapter时候的sql语句,SELECT的键列,必须含有主键,此处SqlCommandBuilder的update才能成功
Console.WriteLine("生成的Delete语句:{0}", cmdBuilder.GetDeleteCommand().CommandText);
//执行更新
da.Update(dt);//将table中的所有修改更新到数据库
Console.WriteLine("数据更新到数据库。检查数据库中是否已经更新了数据。"); Console.WriteLine(""); //重新输出数据库中数据,检测以上操作是否成功
string _sql = "SELECT AccountID,AccountName,password FROM Account";
SqlDataAdapter _da = new SqlDataAdapter(_sql, conn);
_da.Fill(ds, "newAccount");
Console.WriteLine("Account表中现有数据:"); DataTable _dt = ds.Tables["newAccount"];
DataView _dv = new DataView(_dt);
_dv.Sort = "AccountID ASC"; foreach (DataRowView drv in _dv)
{
Console.WriteLine("{0}:{1},{2}", drv[], drv[], drv[]);
} Console.WriteLine("");
}
}
}

程序分析:

  1. 在DataSet中修改数据,仅是改了程序内存中的数据,并不会影响到数据库
  2. 通过SqlCommandBuilder帮助构建增删改的SQL语句。通过打印这些语句命令,可以看出,它们是用过参数来执行SQL命令的。当正式更新数据时,会用DataSet中的修改后的数据来填充这些参数值
  3. 调用SqlDataAdapter对象的Update方法,正式将数据更新到数据库

扩展问题:

如果在Fill一个DataSet时的SQL语句是同时从多个表中联合查询的数据,那么要更新数据时,插删改的语句将如何生成呢?

ADO.NET笔记——使用DataAdapter执行增删改操作的更多相关文章

  1. ADO.NET笔记——使用Command执行增删改操作,通过判断ExecuteNonQuery()返回值检查是否操作成功

    相关知识: ExecuteNonQuery()方法:执行CommandText属性所制定的操作,返回受影响的记录条数.该方法一般用来执行SQL中的UPDATE.INSERT和DELETE等操作 对于U ...

  2. C# winform窗体设计-对数据库执行增删改操作

    对于学习数据库的人来说,数据库的增删改可谓是最基本的了(小编其实也只是一个小白=-=),这篇文章,小编将于大家讲解数据库增删改操作 在执行数据库增删改的时候主要使用的:Command 类       ...

  3. Qt学习笔记 TableWidget使用说明和增删改操作的实现

    看一下效果很简单的一个小功能 先说分部讲一下过程 再给出详细代码 添加数据 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ...

  4. SQL数据库,使用事务执行增删改操作,给自己一个后悔的机会

    内容并不复杂,使用起来也比较简单. 主要使用以下3条SQL语句: 开始事物:BEGIN TRAN(全拼 TRANSACTION 亦可)提交事物:COMMIT TRAN回滚事务:ROLLBACK TRA ...

  5. 使用控制台对Redis执行增删改查命令

    使用控制台对Redis执行增删改查命令 在上一篇里,我们已经安装了redis.这一篇我们将一起来学习如何使用"控制台"管理Redis 首先肯定是打开一个控制台,在windows系统 ...

  6. 用dom4j解析xml文件并执行增删改查操作

    转自:https://www.aliyun.com/jiaocheng/1339446.html xml文件: <?xml version="1.0" encoding=&q ...

  7. 学习MyBatis必知必会(5)~了解myBatis的作用域和生命周期并抽取工具类MyBatisUtil、mybatis执行增删改查操作

    一.了解myBatis的作用域和生命周期[错误的使用会导致非常严重的并发问题] (1)SqlSessionFactoryBuilder [ 作用:仅仅是用来创建SqlSessionFactory,作用 ...

  8. OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

    公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...

  9. 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式

    一. 背景 说起EF的增删改操作,相信很多人都会说,有两种方式:① 通过方法操作  和  ② 通过状态控制. 相信你在使用EF进行删除或修改操作的时候,可能会遇到以下错误:“ The object c ...

随机推荐

  1. 海量数据处理算法—Bit-Map

    原文:http://blog.csdn.net/hguisu/article/details/7880288 1. Bit Map算法简介 来自于<编程珠玑>.所谓的Bit-map就是用一 ...

  2. The Kernel Newbie Corner: Kernel Debugging with proc "Sequence" Files--Part 2

    转载:https://www.linux.com/learn/linux-career-center/39972-kernel-debugging-with-proc-qsequenceq-files ...

  3. 关于androidManifest.xml的概叙以及intent-filter的详细分析

    AndroidManifest.xml配置文件对于Android应用开发来说是比较细但又很重要的基础知识,本文旨在总结该配置文件中常用到的几个属性,以便日后查阅,至于那些比较细的属性,主要是平时开发比 ...

  4. C#求所有可能的排列组合

    static System.Collections.Specialized.StringCollection MakeStrings(string[] characters, int finalStr ...

  5. BootStrap2学习日记21---消息提示

    <p><a href="#" title="中国(China),位于东亚,是一个以华夏文明为主体.中华文化为基础,以汉族为主要民族的统一多民族国家,通用 ...

  6. openlayers加载百度地图

    最近在做openlayers添加百度地图的扩展类,经过轮番的尝试,终于将其接入了,但是发现偏差比较大,有根据百度的坐标进行了比对,将切片原点进行了调整,发现OK了.打开百度地图,可以看出切片的路径如: ...

  7. 【Android 界面效果13】关于全屏和取消标题栏

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 去掉标题栏: 第一种:也一般入门的时候经常使用的一种方法 requestWindowFeature(Wi ...

  8. 【python,logging】python中的logging模块

    本文章转自kenby的博客,比较全面易懂,转来留作以后使用. http://kenby.iteye.com/blog/1162698 一.从一个使用场景开始 import logging # 创建一个 ...

  9. Android学习笔记⑤——UI组件的学习TextView相关

    TextView是一个强大的视图组件,直接继承了View,同时也派生出了很多子类,TextView其作用说白了就是在布局中显示文本,有点像Swing编程中的JLabel标签,但是他比JLabel强大的 ...

  10. 使用Spring Security实现权限管理

    使用Spring Security实现权限管理 1.技术目标 了解并创建Security框架所需数据表 为项目添加Spring Security框架 掌握Security框架配置 应用Security ...