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