ADO.NET的数据库查询2009-12-07 02:20 P.M.ADO.NET的数据库查询
生活随笔
收集整理的這篇文章主要介紹了
ADO.NET的数据库查询2009-12-07 02:20 P.M.ADO.NET的数据库查询
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ADO.NET的數(shù)據(jù)庫查詢
2009-12-07 02:20 P.M.
| ADO.NET的數(shù)據(jù)庫查詢 一.SqlCommand對象 1:創(chuàng)建SqlCommand對象 l???????? 使用New關(guān)鍵字創(chuàng)建對象的新實(shí)例,然后設(shè)置實(shí)例的屬性; l???????? 使用構(gòu)造函數(shù)指定查詢的Sql語句和SqlCommand對象; l???????? 調(diào)用SqlConnection對象的CreaterCommand方法; 2:使用SqlCommand執(zhí)行查詢 l???????? 執(zhí)行返回記錄行的查詢-ExecuteReader 設(shè)置SqlCommand對象的CommandText屬性設(shè)置為Sql查詢字符串,然后調(diào)用SqlCommand的ExecuteReader 方法返回一個(gè)SqlDateReader對象,SqlDateReader對象包含查詢結(jié)果集。讀取結(jié)果集前先調(diào)用SqlDateReader的Read 方法,如果結(jié)果集有數(shù)則返回True,并將結(jié)果集游標(biāo)置于第上行;如果結(jié)果集沒有數(shù)據(jù),Read方法則返回False。 l???????? 執(zhí)行獲取單一值的查詢-ExecuteScalar 設(shè)置SqlCommand對象的CommandText屬性設(shè)置為Sql查詢字符串,調(diào)用SqlCommand的ExecuteScalar方法,返回結(jié)果集的第一行第一列的值,此值為Object數(shù)據(jù)類型,應(yīng)用時(shí)根據(jù)實(shí)際情況進(jìn)行數(shù)據(jù)類型的顯式轉(zhuǎn)換。 l???????? 執(zhí)行不返回結(jié)果集的查詢-ExecuteNonQuery 此類型查詢包括兩大類:數(shù)據(jù)操作語言(DML)查詢-INSERT、UPDATE、DELETE;數(shù)據(jù)定義(DDL)查詢-CREATE、ALTER、DROP。 調(diào)用SqlCommand的ExecuteNonQuery方法執(zhí)行DML查詢時(shí)其返回為int類型,代表查詢影響的行數(shù);如果執(zhí)行DML以外的查詢返回值為-1。 l???????? 批量操作查詢 SqlCommand對象的ExecuteReader和ExecuteNonQuery兩種方法都支持批量查詢操作,即一次可以執(zhí)行一條以上的 Sql語句;SqlCommand的StatementCompleted事件(屬性)可以收集批量查詢中的每條語句所影響的記錄數(shù)。 二.SqlDataReader對象 1:查檢結(jié)果集 l???????? 讀取結(jié)果集中的內(nèi)容前需要調(diào)用Read方法,將結(jié)果集的游標(biāo)移動(dòng)到記錄集的第一行;傳入結(jié)果集的字段序號(hào)或字段名稱,即可讀取相應(yīng)的字段值,默認(rèn)情況下SqlDataReader使用Object數(shù)據(jù)類型返回列的內(nèi)容。 l???????? 結(jié)果集的數(shù)據(jù)讀取后,應(yīng)該關(guān)閉結(jié)果集對象,可將SqlDataReader對象置于Using代碼塊內(nèi),這樣可以實(shí)現(xiàn)系統(tǒng)自動(dòng)清理關(guān)閉對象。 2:結(jié)果集架構(gòu) l????????? 結(jié)果集字段的數(shù)量 SqlDataReader的FieldCount屬性用來確定返回的結(jié)果集字段的數(shù)量,如果SqlCommand的CommandText的Sql語句為UPDATE等類型時(shí)將不返回任何字段。 l???????? 字段名稱 SqlDataReader的GetName方法接受字段序號(hào)參數(shù)(從0開始),返回相應(yīng)的字段名稱。 l???????? 字段數(shù)據(jù)類型 SqlDataReader的GetFieldType方法和GetDataTypeName方法均接受字段序號(hào)參數(shù)(從0開始),分別返回對應(yīng)字段的.Net數(shù)據(jù)類型名稱和該字段在數(shù)據(jù)庫中數(shù)據(jù)類型名稱。 l???????? 確定字段序號(hào) 基于字段序號(hào)從結(jié)果集中獲取數(shù)據(jù)能夠提高代碼的性能,當(dāng)知道字段的名稱但不知道其序號(hào)時(shí),可以使用SqlDataReader的GetOrdinal方法,此方法的參數(shù)為字段名稱的字符串,返回值為相應(yīng)字段在結(jié)果集中的序號(hào)。 l???????? 結(jié)果集其它附加架構(gòu)信息 詳細(xì)的架構(gòu)信息可由SqlDataReader的GetSchemaTable方法獲取,此方法返回一個(gè)DataTable對象。 l???????? 使用CommandBehavior SqlCommand類的ExecuteReader方法被重載,接受CommandBehavior的枚舉值作為參數(shù)來控制返回的內(nèi)容;無參數(shù) 的ExecuteReader方法返回的SqlDataReader對象包含查詢的結(jié)果及基本架構(gòu)信息;以 CommandBehavior.SchemaOnly作為參數(shù)的ExecuteReader方法只返回結(jié)果集的架構(gòu)信息(相當(dāng)于表頭),返回的 SqlDataReader沒有數(shù)據(jù)行。 3:結(jié)果集的字段數(shù)據(jù)類型問題 l???????? 強(qiáng)類型Getter 以O(shè)bject數(shù)據(jù)類型作為中間數(shù)據(jù)類型從SqlDataReader中獲取數(shù)據(jù)存在裝箱與開箱的過程,為減少此不必要的系統(tǒng)開銷,使用 SqlDataReader的強(qiáng)類型Get方法(GetString、GetInt32、GetDateTime等)分別獲取與結(jié)果集數(shù)據(jù)類型相同的數(shù)據(jù) 可以提供數(shù)據(jù)獲取速度。 l???????? 處理Null值 當(dāng)數(shù)據(jù)庫的字段值為null時(shí),使用SqlDataReader的強(qiáng)類型Get方法去獲取數(shù)據(jù)時(shí)會(huì)產(chǎn)生一個(gè)SqlNullValueException錯(cuò)誤,因此對于數(shù)據(jù)庫中可以為空的字段獲取數(shù)據(jù)之前一定要檢查其值是否為null。 如果數(shù)據(jù)庫某字段的值為null,在.Net環(huán)境下,它被設(shè)置為DBNull.Value。 SqlDataReader的IsDBNull方法確定結(jié)果集中的某列是否為Null值,接受列序號(hào)的整數(shù)為參數(shù),返回值為True和False, 4:SqlTypes l???????? 數(shù)據(jù)溢出問題 SqlDataReader從數(shù)據(jù)庫中獲取數(shù)據(jù)并將數(shù)據(jù)轉(zhuǎn)換成對應(yīng)的.Net數(shù)據(jù)類型,此過程可以產(chǎn)生 OverflowException錯(cuò)誤,例如SQL中的Decimal數(shù)據(jù)利用SqlDataReader的GetDecimal方法轉(zhuǎn)換成Net的 Decimal時(shí)有發(fā)生數(shù)據(jù)溢出的可能。SqlTypes類用來解決此類問題。 l???????? SqlTypes的強(qiáng)類型Getter SqlDataReader的SqlTypes的強(qiáng)類型的Get方法(GetSqlDecimal、GetSqlInt32等)從結(jié)果集中返回SqlTypes類型的數(shù)據(jù),而且這些已經(jīng)具備處理Null值的能力,在獲取數(shù)據(jù)前不用檢查是否為null值。 SqlTypes類位于System.Data.SqlTypes命名空間下。 5:處理查詢結(jié)果的多個(gè)結(jié)果集 當(dāng)SqlCommand的CommandText屬性多條Sql語句時(shí),其執(zhí)行ExecuteReader方法時(shí)產(chǎn)生的SqlDataReader對象將包含多個(gè)結(jié)果集,SqlDataReader的NextResult方法能夠使游標(biāo)指針在不同的結(jié)果集中遍歷。 三.參數(shù)化查詢 1:非參數(shù)化的查詢存在安全問題 ?????? 當(dāng)應(yīng)用系統(tǒng)的用戶信息以一個(gè)表的形式存儲(chǔ)在數(shù)據(jù)庫中,用戶登陸應(yīng)用系統(tǒng)時(shí)用以下語句來判斷用戶是否合法: Select Count(*) From Userinfo where UserName=’txt1.text’ And PassWord=’txt2.text’ 其中txt1和txt2為兩個(gè)text控件,當(dāng)惡意用戶輸入“×××’ Or 1=1 --”Sql語句如下: Select Count(*) From Userinfo where UserName=’ ×××’ Or 1=1 --’ And PassWord=’txt2.text’ 雙連字符“--”在SQL Server中表示后面的內(nèi)容為注釋,如此惡意用戶可以正常進(jìn)入系統(tǒng)。 2: 構(gòu)成參數(shù)化查詢的兩種方式 查詢語句如下:StrSql=”Select * from Orders where CustomerID=@CustomerID”,其中“@CustomerID”代表一個(gè)查詢參數(shù)。 在.Net對象模型下執(zhí)行一個(gè)參數(shù)化查詢,需要像SqlCommand對象的Parameters集合中添加Parameter對象。 l???????? AddWithValue方法 例如cmd.Parameters.AddWithValue(“@CustomerID”,”ALFKI”)。AddWithValue方法生成一個(gè)新的SqlParameter對象,并設(shè)置新對象的ParameterName和Value屬性。 l???????? 用New關(guān)鍵字創(chuàng)建新的參數(shù)對象 SqlParameter p=New SqlParameter(); p.ParameterName=@CustomerID; p.Value=”ALFKI”; cmd.Parameters.Add(p); 3:參數(shù)的數(shù)據(jù)類型 l???????? 推斷數(shù)據(jù)類型 在上述兩種構(gòu)成參數(shù)化查詢的兩種方法中都沒有設(shè)置參數(shù)的數(shù)據(jù)類型,這是因?yàn)镾qlParameter可以根據(jù)它的Value屬性的內(nèi)容判斷數(shù)據(jù)類型。 l???????? 顯式設(shè)置參數(shù)的數(shù)據(jù)類型 SqlParameter類的重載構(gòu)造方法可以接受SqlDbType的枚舉值來設(shè)置參數(shù)的類型以及int值確定參數(shù)的Size。例如: SqlParameter p=New SqlParameter(“@CustomerID”, SqlDbType.NVarChar,5); 4:參數(shù)方向 參數(shù)化查詢包括輸入?yún)?shù)和輸出參數(shù)兩種,可以利用參數(shù)化查詢的輸出參數(shù)達(dá)到SqlCommand的ExecuteScalar方法的功能,從數(shù)據(jù)庫中輸出單行單列的值。例如: Strsql=”Select @UnitPrice=UnitPrice from Products where ProductName=@ProductName”; SqlParameter pUnitPrice,pProductName; pUnitPrice=cmd.Parameters.Add(“@UnitPrice”,SqlDbType.Money); pUnitPrice.Direction=ParameterDirection.Output; …… cmd.ExecuteNonQuery(); pUnitPrice.Value 即為所需要的結(jié)果,如果查詢結(jié)果沒有記錄行,則pUnitPrice.Value的值為DBNull.Value 。 5:存儲(chǔ)過程 利用SqlCommand對象調(diào)用存儲(chǔ)過程,將SqlCommand對象的CommandText屬性 設(shè)置為存儲(chǔ)過程名;CommandType屬性設(shè)置為CommandType.StoredProcedure;向SqlCommand對象的 Parameters集合中添加SqlParameters,其中對應(yīng)的存儲(chǔ)過程中的輸入輸出參數(shù)只要正確設(shè)置參數(shù)的Dirction屬性即可。 |
總結(jié)
以上是生活随笔為你收集整理的ADO.NET的数据库查询2009-12-07 02:20 P.M.ADO.NET的数据库查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript获取asp.net服
- 下一篇: asp.net ajax中文乱码的解决?