sql數據庫查詢

ADO.NET的數據庫查詢
一.SqlCommand對象
1:創建SqlCommand對象

l         使用New關鍵字創建對象的新實例,然後設置實例的屬性;
l         使用構造函數指定查詢的Sql語句和SqlCommand對象;
l         調用SqlConnection對象的CreaterCommand方法;
2:使用SqlCommand執行查詢
l         執行返回記錄行的查詢-ExecuteReader
設置SqlCommand對象的CommandText屬性設置爲Sql查詢字符串,然後調用SqlCommand的ExecuteReader 方法返回一個SqlDateReader對象,SqlDateReader對象包含查詢結果集。讀取結果集前先調用SqlDateReader的Read 方法,如果結果集有數則返回True,並將結果集遊標置於第上行;如果結果集沒有數據,Read方法則返回False。
l         執行獲取單一值的查詢-ExecuteScalar 
設置SqlCommand對象的CommandText屬性設置爲Sql查詢字符串,調用SqlCommand的ExecuteScalar方法,返回結果集的第一行第一列的值,此值爲Object數據類型,應用時根據實際情況進行數據類型的顯式轉換。
l         執行不返回結果集的查詢-ExecuteNonQuery
此類型查詢包括兩大類:數據操作語言(DML)查詢-INSERT、UPDATE、DELETE;數據定義(DDL)查詢-CREATE、ALTER、DROP。
調用SqlCommand的ExecuteNonQuery方法執行DML查詢時其返回爲int類型,代表查詢影響的行數;如果執行DML以外的查詢返回值爲-1。
l         批量操作查詢
SqlCommand對象的ExecuteReader和ExecuteNonQuery兩種方法都支持批量查詢操作,即一次可以執行一條以上的 Sql語句;SqlCommand的StatementCompleted事件(屬性)可以收集批量查詢中的每條語句所影響的記錄數。
二.SqlDataReader對象
1:查檢結果集

l         讀取結果集中的內容前需要調用Read方法,將結果集的遊標移動到記錄集的第一行;傳入結果集的字段序號或字段名稱,即可讀取相應的字段值,默認情況下SqlDataReader使用Object數據類型返回列的內容。
l         結果集的數據讀取後,應該關閉結果集對象,可將SqlDataReader對象置於Using代碼塊內,這樣可以實現系統自動清理關閉對象。
2:結果集架構
l          結果集字段的數量
SqlDataReader的FieldCount屬性用來確定返回的結果集字段的數量,如果SqlCommand的CommandText的Sql語句爲UPDATE等類型時將不返回任何字段。
l         字段名稱
SqlDataReader的GetName方法接受字段序號參數(從0開始),返回相應的字段名稱。
l         字段數據類型
SqlDataReader的GetFieldType方法和GetDataTypeName方法均接受字段序號參數(從0開始),分別返回對應字段的.Net數據類型名稱和該字段在數據庫中數據類型名稱。
l         確定字段序號
基於字段序號從結果集中獲取數據能夠提高代碼的性能,當知道字段的名稱但不知道其序號時,可以使用SqlDataReader的GetOrdinal方法,此方法的參數爲字段名稱的字符串,返回值爲相應字段在結果集中的序號。
l         結果集其它附加架構信息
詳細的架構信息可由SqlDataReader的GetSchemaTable方法獲取,此方法返回一個DataTable對象。
l         使用CommandBehavior
SqlCommand類的ExecuteReader方法被重載,接受CommandBehavior的枚舉值作爲參數來控制返回的內容;無參數 的ExecuteReader方法返回的SqlDataReader對象包含查詢的結果及基本架構信息;以 CommandBehavior.SchemaOnly作爲參數的ExecuteReader方法只返回結果集的架構信息(相當於表頭),返回的 SqlDataReader沒有數據行。
3:結果集的字段數據類型問題
l         強類型Getter
以Object數據類型作爲中間數據類型從SqlDataReader中獲取數據存在裝箱與開箱的過程,爲減少此不必要的系統開銷,使用 SqlDataReader的強類型Get方法(GetString、GetInt32、GetDateTime等)分別獲取與結果集數據類型相同的數據 可以提供數據獲取速度。
l         處理Null值
當數據庫的字段值爲null時,使用SqlDataReader的強類型Get方法去獲取數據時會產生一個SqlNullValueException錯誤,因此對於數據庫中可以爲空的字段獲取數據之前一定要檢查其值是否爲null。
如果數據庫某字段的值爲null,在.Net環境下,它被設置爲DBNull.Value。
SqlDataReader的IsDBNull方法確定結果集中的某列是否爲Null值,接受列序號的整數爲參數,返回值爲True和False,
4:SqlTypes
l         數據溢出問題
       SqlDataReader從數據庫中獲取數據並將數據轉換成對應的.Net數據類型,此過程可以產生 OverflowException錯誤,例如SQL中的Decimal數據利用SqlDataReader的GetDecimal方法轉換成Net的 Decimal時有發生數據溢出的可能。SqlTypes類用來解決此類問題。
l         SqlTypes的強類型Getter
SqlDataReader的SqlTypes的強類型的Get方法(GetSqlDecimal、GetSqlInt32等)從結果集中返回SqlTypes類型的數據,而且這些已經具備處理Null值的能力,在獲取數據前不用檢查是否爲null值。
SqlTypes類位於System.Data.SqlTypes命名空間下。
5:處理查詢結果的多個結果集
       當SqlCommand的CommandText屬性多條Sql語句時,其執行ExecuteReader方法時產生的SqlDataReader對象將包含多個結果集,SqlDataReader的NextResult方法能夠使遊標指針在不同的結果集中遍歷。
三.參數化查詢
1:非參數化的查詢存在安全問題
      
當應用系統的用戶信息以一個表的形式存儲在數據庫中,用戶登陸應用系統時用以下語句來判斷用戶是否合法:
       Select Count(*) From Userinfo where UserName=’txt1.text’ And PassWord=’txt2.text’
其中txt1和txt2爲兩個text控件,當惡意用戶輸入“×××’ Or 1=1 --”Sql語句如下:
Select Count(*) From Userinfo where UserName=’ ×××’ Or 1=1 --’ And PassWord=’txt2.text’
雙連字符“--”在SQL Server中表示後面的內容爲註釋,如此惡意用戶可以正常進入系統。
2: 構成參數化查詢的兩種方式
       查詢語句如下:StrSql=”Select * from Orders where CustomerID=@CustomerID”,其中“@CustomerID”代表一個查詢參數。
       在.Net對象模型下執行一個參數化查詢,需要像SqlCommand對象的Parameters集合中添加Parameter對象。
l         AddWithValue方法
例如cmd.Parameters.AddWithValue(“@CustomerID”,”ALFKI”)。AddWithValue方法生成一個新的SqlParameter對象,並設置新對象的ParameterName和Value屬性。
l         用New關鍵字創建新的參數對象
SqlParameter p=New SqlParameter(); p.ParameterName=@CustomerID;
p.Value=”ALFKI”; cmd.Parameters.Add(p);
3:參數的數據類型
l         推斷數據類型
在上述兩種構成參數化查詢的兩種方法中都沒有設置參數的數據類型,這是因爲SqlParameter可以根據它的Value屬性的內容判斷數據類型。
l         顯式設置參數的數據類型
SqlParameter類的重載構造方法可以接受SqlDbType的枚舉值來設置參數的類型以及int值確定參數的Size。例如:
SqlParameter p=New SqlParameter(“@CustomerID”, SqlDbType.NVarChar,5);
4:參數方向
       參數化查詢包括輸入參數和輸出參數兩種,可以利用參數化查詢的輸出參數達到SqlCommand的ExecuteScalar方法的功能,從數據庫中輸出單行單列的值。例如:
       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 即爲所需要的結果,如果查詢結果沒有記錄行,則pUnitPrice.Value的值爲DBNull.Value 。
5:存儲過程
       利用SqlCommand對象調用存儲過程,將SqlCommand對象的CommandText屬性 設置爲存儲過程名;CommandType屬性設置爲CommandType.StoredProcedure;向SqlCommand對象的 Parameters集合中添加SqlParameters,其中對應的存儲過程中的輸入輸出參數只要正確設置參數的Dirction屬性即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章