相关知识:

  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. OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)

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

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

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

  9. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

随机推荐

  1. pat甲级题解(更新到1013)

    1001. A+B Format (20) 注意负数,没别的了. 用scanf来补 前导0 和 前导的空格 很方便. #include <iostream> #include <cs ...

  2. SQL - 分页存储过程

    http://www.jb51.net/article/71193.htm http://www.webdiyer.com/utils/spgenerator/ create PROCEDURE [d ...

  3. Oracle hextoraw和rawtohex

    Oracle hextoraw和rawtohex [日期:2012-07-17] 来源:Linux社区  作者:adrain_001 [字体:大 中 小]     HEXTORAW  语法: HEXT ...

  4. 使用API在DigitalOcean上创建VPS

    1.生成Personal Access Token(API-Token) 密钥类似如下格式: 81d58e36224b63fc2gedac14342d0cfb16vf5451c798b2a38f976 ...

  5. 自动测试工具SilkTest全面介绍

    象交互,并最终记录测试结果,用户可以根据这些测试结果来判断测试成功还是失败. 4Test 脚本语言 和绝大多数自动化测试工具一样, SilkTest 可以自动捕捉,检测和重复用户交互的操作从而驱动测试 ...

  6. Mac下安装 MongoDB

    Mac 下安装 MongoDB 一般有两种方法,一种是通过源码安装,一种是直接使用 homebrew ,个人推荐使用 homebrew ,简单粗暴. 1.安装 homebrew : /usr/bin/ ...

  7. [ZOJ3435]Ideal Puzzle Bobble

    题面戳我 题意:你现在处于\((1,1,1)\),问可以看见多少个第一卦限的整点. 第一卦限:就是\((x,y,z)\)中\(x,y,z\)均为正 sol 首先L--,W--,H--,然后答案就变成了 ...

  8. TEAMWORK1

    代码信息 队友:马司雨 队友项目:Prim算法生成最小生成树 codeing地址:这里 博客地址:那里 代码功能审查表 功能模块名称 Prim算法生成最小生成树 审查人 张洋 审查日期 2019.4. ...

  9. windows10 下使用Pycharm2016 基于Anaconda3 Python3.6 安装Mysql驱动总结

    本文记录:在PyCharm2016.3.3 中基于Anaconda3 Python3.6版本安装Python for Mysql驱动.尝试了安装Mysql-Connector成功,但是连接数据库时驱动 ...

  10. 导入数据到MongoDB中

    import sys import json import pymongo import datetime from pymongo import MongoClient client = Mongo ...