ADO.NET笔记——使用DataAdapter执行增删改操作
相关知识:
- DataSet中的数据一旦从数据库下载下来,便不再与数据库保持联系。如果修改了DataSet中的数据,需要重新建立连接,并且通过SQL命令将修改更新到数据库去
- 编写SQL命令往往比较繁琐和机械化,ADO.NET提供了一个SqlCommandBuilder对象,帮助DataAdapter对象从SELECT语句推算出需要的UPDATE,DELETE和INSERT语句;然后DataAdapter便可以利用这些语句,检查DataSet中被修改的数据,然后提交到数据库
- 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("");
}
}
}

程序分析:
- 在DataSet中修改数据,仅是改了程序内存中的数据,并不会影响到数据库
- 通过SqlCommandBuilder帮助构建增删改的SQL语句。通过打印这些语句命令,可以看出,它们是用过参数来执行SQL命令的。当正式更新数据时,会用DataSet中的修改后的数据来填充这些参数值
- 调用SqlDataAdapter对象的Update方法,正式将数据更新到数据库
扩展问题:
如果在Fill一个DataSet时的SQL语句是同时从多个表中联合查询的数据,那么要更新数据时,插删改的语句将如何生成呢?
ADO.NET笔记——使用DataAdapter执行增删改操作的更多相关文章
- ADO.NET笔记——使用Command执行增删改操作,通过判断ExecuteNonQuery()返回值检查是否操作成功
相关知识: ExecuteNonQuery()方法:执行CommandText属性所制定的操作,返回受影响的记录条数.该方法一般用来执行SQL中的UPDATE.INSERT和DELETE等操作 对于U ...
- C# winform窗体设计-对数据库执行增删改操作
对于学习数据库的人来说,数据库的增删改可谓是最基本的了(小编其实也只是一个小白=-=),这篇文章,小编将于大家讲解数据库增删改操作 在执行数据库增删改的时候主要使用的:Command 类 ...
- Qt学习笔记 TableWidget使用说明和增删改操作的实现
看一下效果很简单的一个小功能 先说分部讲一下过程 再给出详细代码 添加数据 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ...
- SQL数据库,使用事务执行增删改操作,给自己一个后悔的机会
内容并不复杂,使用起来也比较简单. 主要使用以下3条SQL语句: 开始事物:BEGIN TRAN(全拼 TRANSACTION 亦可)提交事物:COMMIT TRAN回滚事务:ROLLBACK TRA ...
- 使用控制台对Redis执行增删改查命令
使用控制台对Redis执行增删改查命令 在上一篇里,我们已经安装了redis.这一篇我们将一起来学习如何使用"控制台"管理Redis 首先肯定是打开一个控制台,在windows系统 ...
- 用dom4j解析xml文件并执行增删改查操作
转自:https://www.aliyun.com/jiaocheng/1339446.html xml文件: <?xml version="1.0" encoding=&q ...
- 学习MyBatis必知必会(5)~了解myBatis的作用域和生命周期并抽取工具类MyBatisUtil、mybatis执行增删改查操作
一.了解myBatis的作用域和生命周期[错误的使用会导致非常严重的并发问题] (1)SqlSessionFactoryBuilder [ 作用:仅仅是用来创建SqlSessionFactory,作用 ...
- OracleHelper(对增删改查分页查询操作进行了面向对象的封装,对批量增删改操作的事务封装)
公司的一个新项目使用ASP.NET MVC开发,经理让我写个OracleHelper,我从网上找了一个比较全的OracleHelper类,缺点是查询的时候返回DataSet,数据增删改要写很多代码(当 ...
- 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式
一. 背景 说起EF的增删改操作,相信很多人都会说,有两种方式:① 通过方法操作 和 ② 通过状态控制. 相信你在使用EF进行删除或修改操作的时候,可能会遇到以下错误:“ The object c ...
随机推荐
- 项目源码--Android视频MV类网站客户端
下载源码 技术要点: 1.视频MV类网站客户端框架 2.底部TAB功能模块 3.用户管理模块 4.结合优质动画技术,良好的用户体验 5.用户设置模块 6.sqlite数据库灵活的应用 7.源码带有非常 ...
- git无法连接bitbucket/github时,出现"Permission deied(publickey)"
Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you ha ...
- WEB免费打印控件推荐
在WEB系统中,打印的确是个烦人的问题. 要么自己开发打印控件,如果项目时间紧,肯定来不及. 要么购买成熟的打印控件,如果是大项目可以考虑,但如果项目只有几K到1.2W之间,这就麻烦了. 前段时间有机 ...
- IIS 之 HTTP错误 404.17 - Not Found(请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理。)
问题描述:HTTP 404.17 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理 . 出现这种情况的原因通常是因为先安装了Framew ...
- 微信js获得签名signature
服务器端: 1 获取微信js accessToken 备注:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token. 开发者需要进行妥善保存.access_ ...
- solr4.x配置IK2012FF智能分词+同义词配置
本文配置环境:solr4.6+ IK2012ff +tomcat7 在Solr4.0发布以后,官方取消了BaseTokenizerFactory接口,而直接使用Lucene Analyzer标准接口T ...
- 【Android 界面效果32】ImageView中XML属性src和background的区别
background会根据ImageView组件给定的长宽进行拉伸,而src就存放的是原图的大小,不会进行拉伸. src是图片内容(前景),bg是背景,可以同时使用. 此外:scaleType只对sr ...
- 从敏捷开发到小团队SVN
一.敏捷之惑 敏捷开发,有一个很好的实践,“每天都可以产生一个可用于发布的版本”. 以前对这句话感到非常的困惑,因为我们手中的项目是残缺的,基本只是程序的一个功能片段,在未集成之前如何发布得了?当然这 ...
- windows下mongoengine报错False is not a read preference.的解决办法
mongoengine是基于pymongo的,后者的3.0版本在windows下似乎会有这个问题,解决方法就是降级: pip install pymongo==2.8 来源:upgrade to py ...
- chrom浏览器避免弹出“确定要离开此面吗?”提示框
一.避免弹出提示框 在网上搜了很多,答案大都是设置window.onbeforeunload=null ,但是试用之后无效. 这个问题放了两天之后返回来再次想,终于找到了答案,在此和大家分享一下: 解 ...