SqlCommandBuilder类是如何构建T-Sql语句
本篇博客默认你看了【DataTable中AcceptChanges()方法的DataRowRowState属性】这篇博客。
在使用SqlCommandBuilder很简单,就是创建一个SqlCommandBuilder对象,然后设置它的DataAdapter属性即可,但实际上,SqlCommandBuilder对象为我们做了很多事,也就是构建T-Sql命令,使我们的数据库能够与我们的操作同步,在调用SqlDataAdapter实例的Update()方法时,SqlCommandBuilder实例会遍历我们曾经修改或增加行,根据行的RowState这个标志位,构建不同的T-Sql命令。
下面我们就来看下,SqlCommandBuilder实例到底构建了哪些Sql命令:
老规矩代码上来先
--建库建表
create database student;
use student;
create table student(
sname varchar(10) not null,
sno int not null,
sage int not null,
ssex varchar(2) not null
);
alter table student
add constraint PK_sno primary key (sno),
constraint CK_ssex check(ssex = '男' or ssex = '女'),
constraint CK_sage check(sage > 8 and sage < 40) insert into student values('张三', 103, 23, '男');
insert into student values('李四', 104, 24, '男');
insert into student values('王五', 105, 25, '男');
insert into student values('赵六', 106, 26, '男');
insert into student values('朱七', 107, 27, '男');
select * from student;
delete student;

C#代码:
public static void AdapterAndSqlCommand()
{
//第一步:获取数据库配置信息
String connStr = ConfigurationManager.ConnectionStrings["connStr"].ToString();
//第二步:构建SqlCommand查询语句
SqlCommand command = new SqlCommand("select * from student;");
command.Connection = new SqlConnection(connStr);
//第三步:创建SqlDataAdapter
SqlDataAdapter adapter = new SqlDataAdapter(command);
//第四步:创建DataSet和DataTable
DataSet dataSet = new DataSet();
DataTable dataTable = new DataTable();
//第五步:填充数据
adapter.Fill(dataTable);
dataSet.Tables.Add(dataTable);
//修改第一行数据中的姓名为小红,并将其性别改为女
dataTable.Rows[0]["sname"] = "小红";
dataTable.Rows[0]["ssex"] = "女";
//删除第二行数据
dataTable.Rows[1].Delete();
//构建一个新的行,并添加到表中去
dataTable.Rows.Add(new object[] {"小明", 108, 18, "男" });
//创建SqlCommandBuilder对象,并绑定一个SqlDataAdapter对象
SqlCommandBuilder scb = new SqlCommandBuilder(adapter);
//打印输出SqlCommandBuilder对象的增删改sql命令语句
Console.WriteLine("SqlCommandBuilder实例的Insert命令: " + scb.GetInsertCommand().CommandText);
Console.WriteLine("SqlCommandBuilder实例的Delete命令: " + scb.GetDeleteCommand().CommandText);
Console.WriteLine("SqlCommandBuilder实例的Update命令: " + scb.GetUpdateCommand().CommandText);
//将有变动的行同步到数据库中
adapter.Update(dataTable.GetChanges());
//保存修改
dataTable.AcceptChanges();
//下面是一个遍历输出datatable中的数据
foreach (DataTable table in dataSet.Tables)
{
foreach(DataRow row in table.Rows)
{
Console.WriteLine(row[0] + ", " + row[1] + ", " + row[2] + ", " + row[3]);
}
}
}
运行打印输出的结果如下:内存中数据变化符合预期

数据库中呢?查看下:

也是正常的,已经同步到了数据库中。修改了一个,删除了一个,新增了一个。
但是我们看那个控制台打印的sql命令,命令是对着的,但怎么还有局部变量,这些局部变量又是什么时候替换的呢?
未完待续====================================
我也不知道是什么时候替换的【这个是笑哭的表情,可惜这里没有这个表情】。。
SqlCommandBuilder类是如何构建T-Sql语句的更多相关文章
- [04] 利用注解生成实体类对应的建表sql语句
1.实现功能 我们已经对注解有了基本的认识,知道了如何自定义注解,如何使用和最基本的处理注解. 本篇主要介绍,如何使用运行时级别的注解,配合反射来自动生成建表的sql语句.如下例: 我们有实体类Stu ...
- trim配合prefix,prefixOverrides,suffix,suffixOverrides构建动态sql语句
1.在接口构建方法 public interface EmployeeMapperDynamicSQL { //携带了哪个字段查询条件就带上这个字段的值 public List<Employee ...
- 【二十四】使用mysqli扩展类批量执行多条sql语句
批量处理多个sql语句 <?php //批量执行多个dml语句 // $mysqli=new mysqli("localhost","root",&quo ...
- 提升开发效率的notepad++一些快捷方法(实体类的创建和查询sql语句的编写)
新手要创建数据库表中,对应字段名的实体类,是不是感觉很麻烦,可以用notepad++快速的把实体类中的字段名进行排版,随后直接粘入idea使用 下面是navicat的演示 选择一个表,右键选择设计表 ...
- Mybatis之动态构建SQL语句
今天一个新同事问我,我知道如何利用XML的方式来构建动态SQL,可是Mybatis是否能够利用注解完成动态SQL的构建呢?!!答案是肯定的,MyBatis 提供了注解,@InsertProvider, ...
- Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化
知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...
- 使用Sql语句快速将数据表转换成实体类
开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare ...
- 记sql语句空格带来的问题
在做分页的时候,引用了一个分页类.在一条sql语句出发生错误,没查出数据,代码如下 $sql="select * from sw_goods".$page->limit; 正 ...
- sql server 运维时CPU,内存,操作系统等信息查询(用sql语句)
我们只要用到数据库,一般会遇到数据库运维方面的事情,需要我们寻找原因,有很多是关乎处理器(CPU).内存(Memory).磁盘(Disk)以及操作系统的,这时我们就需要查询他们的一些设置和内容,下面讲 ...
随机推荐
- Vue.js 系列教程 4:Vuex
这是关于 JavaScript 框架 Vue.js 五个教程的第四部分.在这一部分,我们会学习使用 Vuex 进行状态管理. 这不是一个完整的指南,而是基础知识的概述,所以你可以了解 Vue.js 以 ...
- PHP基础学习
PHP基础学习 <?php //类型 $test=123; var_dump($test);//打印出类型和数值 echo '<hr/>'; echo gettype($test); ...
- 【原创】NuGet 出现“无法初始化 PowerShell 主机,如果将你的 PowerShell 执行策略设置设置为 AllSigned ,请先打开程序包管理控制台以初始化该主机” 错误的解决方法
现象: 网上的设置 AllSigned 等方法都无效..后来考虑可能跟命令行版本兼容性有关系,然后在注册表命令行配置里发现一 ForceV2 设置项,抱着试一试的心态改了下,果然解决了! 解决方法:修 ...
- java 解析json
例<解析评论> //post方式请求 String url=“http://product.dangdang.com/comment/comment.php?product_id=6056 ...
- [NOI2007]货币兑换Cash(DP+动态凸包)
第一次打动态凸包维护dp,感觉学到了超级多的东西. 首先,set是如此的好用!!!可以通过控制一个flag来实现两种查询,维护凸包和查找斜率k 不过就是重载运算符和一些细节方面有些恶心,90行解决 后 ...
- 中间自适应,左右定宽的两种经典布局 ---- 圣杯布局 VS 双飞翼布局
一.引子 最近学了些js框架,小有充实感,又深知如此节奏的前提需得基础扎实,于是回头想将原生CSS和Javascript回顾总结一番,先从CSS起,能集中它的就在基础的布局上,便查阅了相关资料,将布局 ...
- memcached学习总结
一.介绍1.基于libevent的事件处理 libevent是一套跨平台的事件处理接口的封装,能够兼容包括这些操作系统:Windows/Linux/BSD/Solaris 等操作系统的的事件处理.包装 ...
- Asp.net mvc 知多少(九)
本系列主要翻译自<ASP.NET MVC Interview Questions and Answers >- By Shailendra Chauhan,想看英文原版的可访问http:/ ...
- dedecms织梦自定义表单提交之后如何发送到邮箱!
但是往往一些客户需要做一些提交信息到后台并发送到指定的邮箱. 一.直接打开plus下面的diy.php文件: 85行:$query = "INSERT INTO `{$diy->ta ...
- FineUIMvc随笔(5)UIHelper是个什么梗?
声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. UIHelper.Result 在 FineUIMvc 的每一个 HttpPost 的控制器方法里面,你都会看到 UIHelpe ...