SqlCommandBuilder类是如何构建T-Sql语句

本篇博客默认你看了【DataTable中的RowState属性】这篇博客。

在使用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命令,命令是对着的,但怎么还有局部变量,这些局部变量又是什么时候替换的呢?

时间: 2024-08-13 03:05:55

SqlCommandBuilder类是如何构建T-Sql语句的相关文章

Mybatis之动态构建SQL语句

今天一个新同事问我,我知道如何利用XML的方式来构建动态SQL,可是Mybatis是否能够利用注解完成动态SQL的构建呢?!!答案是肯定的,MyBatis 提供了注解,@InsertProvider,@UpdateProvider,@DeleteProvider 和@SelectProvider,来帮助构建动态 SQL 语句,然后让MyBatis 执行这些 SQL 语句. 1.@InsertProvider 1.1简单示例使用 创建一个 TutorDynaSqlProvider.java 类,以

使用Sql语句快速将数据表转换成实体类

开发过程中经常需要根据数据表编写对应的实体类,下面是使用sql语句快速将数据表转换成对应实体类的代码,使用时只需要将第一行'TableName'引号里面的字母换成具体的表名称就行了: declare @TableName sysname = 'TableName' declare @Result varchar(max) = 'public class ' + @TableName + ' {' select @Result = @Result + ' public ' + ColumnType

记sql语句空格带来的问题

在做分页的时候,引用了一个分页类.在一条sql语句出发生错误,没查出数据,代码如下 $sql="select * from sw_goods".$page->limit; 正确的代码如下 $sql="select * from sw_goods ".$page->limit; 看看这两条语句的差别,是不是很难查找.这里其实就是sw_goods后边有个空格. 我通过输出sql语句看到的差别 正确的 错误的sql语句的暑促

SQL语句性能优化--LECCO SQL Expert

SQL语句的优化是将性能低下的SQL语句转换成目的相同的性能优异的SQL语句. 人工智能自动SQL优化就是使用人工智能技术,自动对SQL语句进行重写,从而找到性能最好的等效SQL语句. 数据库性能的优化   一个数据库系统的生命周期可以分成:设计.开发和成品三个阶段.在设计阶段进行数据库性能优化的成本最低,收益最大.在成品阶段进行数据库性能优化的成本最高,收益最小. 数据库的优化通常可以通过对网络.硬件.操作系统.数据库参数和应用程序的优化来进行.最常见的优化手段就是对硬件的升级.根据统计,对网

T-SQL - 记录01_基础sql语句操作

时间:2017-12-25 整理:byzqy 最近详细学习了一下MS SQL Server相关的知识,收获不小,在此记录一下,可能有点零散,后续会慢慢整理! 1.对数据库的一些认识 数据库中只认命令(脚本),所有的可视化操作实质上都是执行的SQL命令. 2.简单复习 1.数据库(要是使用数据库,首先需要打开服务),表(即数据表) 安装了几个数据库实例,就有几个数据库服务(服务器名称,貌似就是数据库实例名称) 2.创建数据库,创建表 3.数据类型 --带var表示不固定长度,不带var表示固定长度

动态SQL语句:Mybaties SqlProvider

1.注解 @UpdateProvider(type = ClassName.class,method = "methodName")//更新 @InsertProvider//插入 @SelectProvider//选择 @DeleteProvider//删除   2.写法 package net.xdclass.xdvidio.provider; /** * @Author Pandas * @Date 2020/3/31 21:03 * @Version 1.0 * @Descri

Mybatis——SQL语句构建器类

SQL语句构建器类 问题 Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句.这么来做通常是由于SQL语句需要动态来生成-否则可以将它们放到外部文件或者存储过程中.正如你已经看到的那样,MyBatis在它的XML映射特性中有一个强大的动态SQL生成方案.但有时在Java代码内部创建SQL语句也是必要的.此时,MyBatis有另外一个特性可以帮到你,在减少典型的加号,引号,新行,格式化问题和嵌入条件来处理多余的逗号或 AND 连接词之前.事实上,在Java代码中来动态生成SQL

SQL语句构建器类

问题 Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句.这么来做通常是由于SQL语句需要动态来生成-否则可以将它们放到外部文件或者存储过程中.正如你已经看到的那样,MyBatis在它的XML映射特性中有一个强大的动态SQL生成方案.但有时在Java代码内部创建SQL语句也是必要的.此时,MyBatis有另外一个特性可以帮到你,在减少典型的加号,引号,新行,格式化问题和嵌入条件来处理多余的逗号或 AND 连接词之前.事实上,在Java代码中来动态生成SQL代码就是一场噩梦.例

SQL语句构建器

SQL语句构建器类 问题 Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句.这么来做通常是由于SQL语句需要动态来生成-否则可以将它们放到外部文件或者存储过程中.正如你已经看到的那样,MyBatis在它的XML映射特性中有一个强大的动态SQL生成方案.但有时在Java代码内部创建SQL语句也是必要的.此时,MyBatis有另外一个特性可以帮到你,在减少典型的加号,引号,新行,格式化问题和嵌入条件来处理多余的逗号或 AND 连接词之前.事实上,在Java代码中来动态生成SQL