本篇博客默認你看了【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命令,命令是對着的,但怎么還有局部變量,這些局部變量又是什么時候替換的呢?
未完待續====================================
我也不知道是什么時候替換的【這個是笑哭的表情,可惜這里沒有這個表情】。。



