相关知识:

  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. global $GLOBALS区别

    <?phpfunction &test(){     static $b=0;//申明一个静态变量     $b=$b+1;     echo $b;     return $b; }} ...

  2. npm常用命令->nodejs

    npm install <name>安装nodejs的依赖包 例如npm install express 就会默认安装express的最新版本,也可以通过在后面加版本号的方式安装指定版本, ...

  3. leetcode 题解:Binary Tree Inorder Traversal (二叉树的中序遍历)

    题目: Given a binary tree, return the inorder traversal of its nodes' values. For example:Given binary ...

  4. Tomcat内存设置详解

    Java内存溢出详解 一.常见的Java内存溢出有以下三种: 1. java.lang.OutOfMemoryError: Java heap space ----JVM Heap(堆)溢出 JVM在 ...

  5. PHP trim()函数的一些用法

    string trim ( string $str [, string $charlist ] ) - 去除字符串首尾处的空白字符(或者其他字符) trim()函数当第二个参数为空时,默认去掉空格.制 ...

  6. DWZ框架Ajax无刷新表单提交处理流程

    DWZ框架Ajax无刷新表单提交处理流程是: 1.       ajax表单提交给服务器 2.       服务器返回一个固定格式json结构 3.       js会调函数根据这个json数据做相应 ...

  7. Redis中的批量删除数据库中的Key

    本文参考:http://blog.csdn.net/spring21st/article/details/15771861 http://stackoverflow.com/questions/575 ...

  8. entOS查看系统信息-CentOS查看命令

    一:查看cpu more /proc/cpuinfo | grep "model name" grep "model name" /proc/cpuinfo 如 ...

  9. Javascript -- Math.round()、Math.ceil()、Math.floor()、parseInt去小数取整总结

    一.Math.round() 作用:四舍五入返回整数.(返回参数+0.5后,向下取整) Math.round(5.57) //返回6 Math.round(2.4) //返回2 Math.round( ...

  10. 【wpf WebBrowser 清空网站的Cookie&Session 清空用户登录状态】

    最近做项目遇到了一个说小不小,说大不大的问题,那就是在WebBrowser中清空网站上用户的登陆状态, 一开始心想,那不就清空cookies就行啦,那么简单的事情,百度一下 …… …… 是的,正如你们 ...