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命令,命令是對着的,但怎么還有局部變量,這些局部變量又是什么時候替換的呢?

未完待續====================================

我也不知道是什么時候替換的【這個是笑哭的表情,可惜這里沒有這個表情】。。

【點擊此處回到主頁】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM