ADONET提供了Connection來連接數據庫同時也提供了Command對象來查詢數據庫同Connection對象一樣Command也有兩種OleDbCommand和SqlCommand其區別同Connection對象
要操縱數據庫必須先使用Connection來連接到數據庫再創建一個Command來查詢有幾種創建方式例
SqlCommand cmd
string strCon=server=localhostdatabase=NorthwindTrusted_Connection=Yesstring strqry=select * from CategoriesSqlConnection con=new SqlConnection(strCon)conOpen()cmd=conCreateCommand() //這裡使用用Connection對象的CreateCommand方法來創建一個Command對象
cmdCommandText=strqry// SqlDataReader reader=cmdExecuteReader()
cmd=new SqlCommand() //直接使用new 關鍵字來創建cmdCommandText=strqrycmdConnection=con //設置與數據庫的連接
cmd=new SqlCommand(strqrycon) //直接在new的時候帶兩個參數來創建
執行方式
(主要有這麼幾種cmdExecuteReader()cmdExecuteNonQuery()cmdExecuteScalar()cmdExecuteXmlReader())
1ExecuteReader()返回一個SqlDataReader對象或OleDbDataReader對象這個看你的程序的需要去 做可以通過這個對象來檢查查詢結果它提供了游水式的執行方式即從結果中讀取一行之後移動到另一行則前一行就無法再用有一點要注意的是執行之後要等到手動去調用Read()方法之後DataReader對象才會移動到結果集的第一行同時此方法也返回一個Bool值表明下一行是否可用返回True則可用返回False則到達結果集末尾
使用DataReader可以提高執行效率有兩種方式可以提高代碼的性能一種是基於序號的查找一個是使用適當的Get方法來查找因為查詢出來的結果一般都不會改變除非再次改動查詢語句因此可以通過定位列的位置來查找記錄用這種方法有一個問題就是可能知道一列的名稱而不知道其所在的位置這個問題的解決方案是通過調用DataReader 對象的GetOrdinal()方法此方法接收一個列名並返回此列名所在的列號例
int id=readerGetOrdinal(CategoryName)while(readerRead())
{ ResponseWrite(reader[id])} readerClose()
至於第二種方式很直觀例
while(readerRead())
{ ResponseWrite(readerGetInt()ToString()+ +readerGetString()ToString()+ <br>)}
DataReader的GetInt()和GetString()通過接收一個列號來返回一個列的值這兩種是最常用的其中 還有很多其它的類型
(注DataReader對象在調用Close()方法即關閉與數據庫的連接如果在沒有關閉之前又重新打開第二個連接則會產生一條異常信息)
ExecuteNonQuery() 這個方法並不返回一個DataReader對象而是返回一個int類型的值即在執行之後在數據庫中所影響的行數
例
int affectrows=cmdExecuteNonQuery()ResponseWrite(affectrows + 條記錄受影響)
ExecuteScalar() 這個方法不接受任何參數僅僅返回查詢結果集中的第一行第一列而忽略了其它的行和列而且返回的是一個object類型在使用之前必須先將它強制轉換為所需類型如果返回的僅僅是一個單獨的數據元則可以使用此方法來提高代碼的性能例
string strCon=server=localhostdatabase=NorthwindTrusted_Connection=Yesstring strqry=select count(*) from CategoriesSqlConnection con=new SqlConnection(strCon)conOpen()SqlCommand cmd=conCreateCommand()int i=ConvertToInt(cmdExecuteScalar()) //必須強制轉換
ExecuteXmlReader() 此方法用於XML操作返回一個XmlReader對象由於系統默認沒有引用 SystemXml名空間因此在使用前必須前引入例
string strCon=server=localhostdatabase=NorthwindTrusted_Connection=YesSqlConnection con=new SqlConnection(strCon)conOpen()SqlCommand cmd = new SqlCommand(select * from Categories FOR XML AUTO XMLDATA con)XmlReader xr=cmdExecuteXmlReader()ResponseWrite(xrAttributeCount) //這裡獲取當前節點上的屬性個數
xrClose()
執行完畢之後照樣要顯式地調用Close()方法否則會拋出異常
使用參數化的查詢
先看一段SQL語句select CategoryIDDescription from Categories where CategoryID=? 其中的問號就是一個參數但在使用的時候必須是帶有@前綴的命名參數因為NET數據提供程序不支持這個通用的參數標記?使用參數化的查詢可以大大地簡化編程而且執行效率也比直接查詢字符串要高也更方便很多情況下都需要更改查詢字符串這種方式就提供了方便只需更改參數的值即可例
string strCon=server=localhostdatabase=NorthwindTrusted_Connection=YesSqlConnection con=new SqlConnection(strCon)conOpen()string strqry=select * from Categories where CategoryID=@CategoryID //帶參數的查詢SqlCommand cmd=new SqlCommand(strqrycon)cmdParametersAdd(@CategoryIDSqlDbTypeInt) //給參數賦於同數據庫中相同的類型cmdParameters[@CategoryID]Value= //給參數賦值可靈活改變SqlDataReader r=cmdExecuteReader()while(rRead())
{ ResponseWrite(rGetString()+<br>) //取出指定參數列的值} conClose() //切記關閉
使用存儲過程進行查詢
From:http://tw.wingwit.com/Article/program/net/201311/13317.html