zoukankan      html  css  js  c++  java
  • 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;
    复制代码

    AcceptChange1

    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]);
                    }
                }
            }
    复制代码

    运行打印输出的结果如下:内存中数据变化符合预期

    1

    数据库中呢?查看下:

    2

    也是正常的,已经同步到了数据库中。修改了一个,删除了一个,新增了一个。

    但是我们看那个控制台打印的sql命令,命令是对着的,但怎么还有局部变量,这些局部变量又是什么时候替换的呢?

    未完待续====================================

    我也不知道是什么时候替换的【这个是笑哭的表情,可惜这里没有这个表情】。。

    【点击此处回到主页】

  • 相关阅读:
    痛苦之旅——安装Eric4
    如何把自己写的python程序给别人用
    (转)史上最好的Python线程指南
    (转)python编码问题
    Beautiful Soup的一些中文资料
    oracle监听配置
    redhat6.5安装oracle 11g
    《深入浅出MFC》– Document-View深入探讨
    CAS解扰小结
    ts包、表、子表、section的关系
  • 原文地址:https://www.cnblogs.com/wl-blog/p/13183895.html
Copyright © 2011-2022 走看看