ado.net提供了豐富的數(shù)據(jù)庫(kù)操作,在這些操作中SqlConnection和SqlCommand類是必須使用的,但接下來可以分為兩類操作:
一類是用SqlDataReader直接一行一行的讀取數(shù)據(jù)庫(kù)。
第二類是SqlDataAdapter聯(lián)合DataSet來讀取數(shù)據(jù)。
兩者比較:
SqlDataReader由于是直接訪問數(shù)據(jù)庫(kù),所以效率較高。但使用起來不方便。
SqlDataAdapter可以把數(shù)據(jù)庫(kù)的數(shù)據(jù)緩存在內(nèi)存中,以數(shù)據(jù)集的方式進(jìn)行填充。這種方式使用起來更方,便簡(jiǎn)單。但性能較第一種稍微差一點(diǎn)。(在一般的情況下兩者的性能可以忽略不計(jì)。)
先看一個(gè)比較簡(jiǎn)單的代碼:
public void SqlAdapterDemo1(string connStr) { SqlConnection conn = new SqlConnection(connStr);//連接對(duì)象 SqlCommand cmd = conn.CreateCommand();//sql命令對(duì)象 cmd.CommandType = CommandType.Text; cmd.CommandText = "select * from products = @ID";//sql語(yǔ)句 cmd.Parameters.Add("@ID", SqlDbType.Int); cmd.Parameters["@ID"].Value = 1;//給參數(shù)sql語(yǔ)句的參數(shù)賦值 SqlDataAdapter adapter = new SqlDataAdapter();//構(gòu)造SqlDataAdapter adapter.SelectCommand = cmd;//與sql命令對(duì)象綁定,這個(gè)必不可少 DataSet ds = new DataSet(); adapter.Fill(ds,"table1");//填充數(shù)據(jù)。第二個(gè)參數(shù)是數(shù)據(jù)集中內(nèi)存表的名字,可以與數(shù)據(jù)庫(kù)中的不同 //Fill方法其實(shí)是隱藏的執(zhí)行了Sql命令對(duì)象的CommandText //填充完了后,就可以方便的訪問數(shù)據(jù)了。例如 WriteLine(ds.Tables["table1"].Rows[0][1]);} 怎么樣?是不是很簡(jiǎn)單?
以上代碼有一個(gè)地方需要注意,就是沒有顯示的調(diào)用連接對(duì)象的Open()方法。只是因?yàn)樵诿看握{(diào)用Fill()方法的時(shí)候會(huì)自己去維護(hù)連接。調(diào)用Fill()方法并不會(huì)改變之前連接對(duì)象的狀態(tài)。
//連接對(duì)象和sql命令對(duì)象單從上面的代碼只有查詢語(yǔ)句,沒有其他的操作。那么接下來我就針對(duì)其他的操作來進(jìn)一步說明SqlDataAdapter的用法。其他操作(如:增加,修改,刪除等操作)可以分為兩種情況一個(gè)是單表操作,一個(gè)是多表操作。
先來看單表操作:
//直接把上面的代碼賦值過來 public void SqlAdapterDemo1(string connStr) { SqlConnection conn = new SqlConnection(connStr);//連接對(duì)象 多表操作的片段代碼 cmd.Parameters.Add("@ID", SqlDbType.Int); cmd.Parameters["@ID"].Value = 1;//給參數(shù)sql語(yǔ)句的參數(shù)賦值 SqlDataAdapter adapter = new SqlDataAdapter();//構(gòu)造SqlDataAdapter adapter.SelectCommand = cmd;//與sql命令對(duì)象綁定,這個(gè)必不可少 SqlCommandBuilder builder = new SqlCommandBuilder(adapter);//在構(gòu)造好了SqlDataAdapter對(duì)象 //加上此句代碼 DataSet ds = new DataSet(); adapter.Fill(ds,"table1");//填充數(shù)據(jù)。第二個(gè)參數(shù)是數(shù)據(jù)集中內(nèi)存表的名字,可以與數(shù)據(jù)庫(kù)中的不同 //Fill方法其實(shí)是隱藏的執(zhí)行了Sql命令對(duì)象的CommandText //填充完了后,就可以方便的訪問數(shù)據(jù)了。例如 WriteLine(ds.Tables["table1"].Rows[0][1]); //修改操作 ds.Tables["table1"].Rows[0][1] = "Sample2";//此句代碼只是修改了數(shù)據(jù)集中某夠值 //更新到數(shù)據(jù)庫(kù) adapter.Update(ds, "table1");//把內(nèi)存中的數(shù)據(jù)同步到數(shù)據(jù)庫(kù)中 上面的修改代碼很簡(jiǎn)單,原理就是修改了內(nèi)存中數(shù)據(jù)集的數(shù)據(jù),然后調(diào)用一下Update()方法就同步到數(shù)據(jù)庫(kù)中去了。SqlDataAdapter幫我們自動(dòng)生成了Sql語(yǔ)句,并且在這里Update()方法是帶了事務(wù)處理功能的。其他的刪除,增加操作同理,在對(duì)內(nèi)存中的數(shù)據(jù)集進(jìn)行相關(guān)修改后,只需要調(diào)用一下Update()方法即可同步到數(shù)據(jù)庫(kù)中去。但遺憾的是,目前這種方式只支持單表的操作,不支持任何與多表相關(guān)的操作(包括同一視圖中來自不同表的列)。
|
|