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)以及操作系统的,这时我们就需要查询他们的一些设置和内容,下面讲 ...
随机推荐
- swift注意
赋值的时候要想为空 可以用 ? 例如 var age1:Int? // ?表示age1的类型为可选类型,其值可以为空print(age1) 判断一个字符串为空字符串if str_empty.isE ...
- duilib绘制边框
在使用Duilib时,有时候需要绘制边框,绘制边框时候,上下左右都会有边框线:可在使用时,有时候不需要绘制四边(如果绘制四边,两个有边框的控制放在一起,就有一边会很粗),那该如何处理?,其实用法很简单 ...
- Java设计和实现方法
方法签名 方法名是驼峰命名 方法名最好能说明该方法主要做什么 方法参数的名字最好能说明该参数的意义 方法参数个数最好低于6个 例如: public void setTitleVisible(int l ...
- 二cha树
void porder(BTree *b) { BTree *St[MaxSize],*p; ; if(b!=NULL) { top++; St[top]=b; ) { p=St[top]; top- ...
- groovy学习(五) 命令行输入输出
isr = new InputStreamReader(System.in);br = new BufferedReader(isr);name = br.readLine();println(&qu ...
- CLAHE的实现和研究
CLAHE算法对于医学图像,特别是医学红外图像的增强效果非常明显. CLAHE https://en.wikipedia.org/wiki/Adaptive_histogram_equalizati ...
- android列表停止滚动,加载图片,较为通用的一种办法
在Adapter的itemView里面,判断列表是否在滚动中,其实是比较麻烦的,可能耦合性会比较严重. 所以考虑了下,是否能在itemView里面,检测列表的滚动状态,并监听停止状态加载图片,实现it ...
- canvas绘图不清晰的解决方案
现象描述 同样大小的图片(60x60px)用canvas和DOM绘制,结果发现canvas的画面质量要差很多.结果如下图所示. 上图中,左侧红框中的金币采用DOM绘制,右侧和下方的金币和文字等使用ca ...
- Android 退出多Activity的application的方式
在开发过程中,我们常常需要一个退出功能,来退出该应用的所有Activity.下面,我们列举一些退出应用的几种方式.以下用的源码点击查看源码地址 欢迎star,欢迎fork 利用ActivityCont ...
- Android Realm数据库使用指南
Android Realm数据库使用指南 Realm数据库, 目前有Java, Objective‑C, React Native, Swift, Xamarin的几种实现, 是一套用来取代SQLit ...