近日和小火伴們在進行機房合作,我負責的是D層。在重新寫sqlhelper時,發(fā)現(xiàn)查詢操作用到的是SqlDataAdapter對象,我記得還有個SqlDataReader對象也是履行對數(shù)據(jù)庫的查詢操作。還有增刪改方法除ExecuteNonQuery()還有無其他方法,返回值integer和boolean有甚么不同。個人重構時沒好好研究,現(xiàn)在好好總結1下,歡迎各位斧正。
我們在對數(shù)據(jù)庫進行增刪改操作時1般使用sqlcommand命令對象,這個對象的方法有3個。非別是ExecuteNonQuery()、ExecuteReader()、ExecuteScalar()。其中ExecuteNonQuery();它的返回值類型為int型。多用于履行增加,刪除,修改數(shù)據(jù)。返回受影響的行數(shù)。
具體來講,此方法用于履行任何不從數(shù)據(jù)庫返回結果集的SQL操作命令,包括INSERT INTO、UPDATE、DELETE語句、沒有返回數(shù)值的存儲進程、CREATE TABLE和CREATEINDEX之類的DDL語句。ExecuteNonQuery方法對UPDATE、INSERT INTO和DELETE這些操作語句,其返回值為該命令所影響的行數(shù)。對所有其他類型的語句,返回值為⑴。如果產生回滾,返回值也為⑴。所以如果讓其履行查詢語句,返回值為⑴,無意義。我在個人重構時返回的是Boolean型。實際上是1樣的,當返回值為非零時,說明數(shù)據(jù)庫中受影響的行不為零,所以履行增刪改操作True. 當返回值為零或負值時,說明該操作沒有履行成功。
我們知道sqlcommand對象中有2個查詢的方法,分別是ExecuteReader()、ExecuteScalar(),但是我們在寫sqlhelper時1般用到的是SqlDataAdapter對象,這3者有甚么不同呢?
ExecuteScalar()返回1個int型變量。如果SQL語句是Select查詢,則僅僅返回查詢結果集中第1行第1列,而疏忽其他行和列。如果SQL語句不是Select查詢,則這個返回結果沒任何作用。由于不知道sql語句究竟是甚么樣的結構(有多是int,有多是Char等其它,)所以ExecuteScalar()方法返回1個最基本的類型Object,這個類型是所有類型的基類,可以轉換為任意類型,所以用前需強迫轉換。
ExecuteReader 返回1個DataReader對象,如果在SqlCommand對象中調用,則返回SqlDataReader,如果在OledbCommand對象中調用,返回的是OledbDataReader,可以調用DataReader的方法和屬性迭代處理結果集。ExecuteReader方法存在的目的:盡量快的對數(shù)據(jù)庫進行查詢并得到結果。
還有SqlDataAdapter對象,下面主要講它和SqlDataReaderr的區(qū)分。
我們重構都用SqlDataAdapter+DataSet。SqlDataReader咋了,招誰惹誰了,為啥沒人用。這實際上是適合不適合的問題,就像電視劇中常常出現(xiàn)的那句臺詞“你是個好人,但是我們不適合”。他倆具體合適哪些情況呢。
1.SqlDataReader //基于連接,只讀訪問合適數(shù)據(jù)量較小。(連接模式)
SqlDataAdapter //基于非連接,適于數(shù)據(jù)量較大時,可以另行修改,最后再把修改結果返回給數(shù)據(jù)庫。要求資源也大1點 (斷開模式)
2.SqlDataAdapter 讀取數(shù)據(jù)后將數(shù)據(jù)集放入DataSet ,DataSet 的數(shù)據(jù)存在本地客服機內存。
3.SqlDataReader返回的是1個數(shù)據(jù)讀寫器,只能1條條的讀,操作起來不靈活,1般在只讀的時候才用到。
SqlDataAdapter返回的是數(shù)據(jù)集或表,可以對其中的數(shù)據(jù)作任意操作
4.寫法上不同:
SqlDatReader履行前須先打開數(shù)據(jù)庫,然后須生成1個command對象。再由command.ExecuteReader()方法賦值。完成后須手動關閉聯(lián)接。
SqlCommand cmd = newSqlCommand("select * from stu", conn);
conn.Open();
SqlDataReader rdr= cmd.ExecuteReader();
conn.close();
SqlDataAdapter 履行時,自動打數(shù)據(jù)庫,且不用Command的ExecuteReader方法進行賦值,完成后自動斷開聯(lián)接。
SqlDataAdapteradptr = new SqlDataAdapter(sql, conn);
DataSet ds = newDataSet();
adptr.Fill(ds,"stu");
回想1年前就看了紅皮書,就簡單了解了觸及SQLSERVER數(shù)據(jù)庫操作的7個對象,對現(xiàn)在每次遇到時都有新的收獲。覺自己知之甚少,嘆其之強大。