Command對象的常用方法
說明:上篇總結了Command對象的幾個數據成員,這節總結Command對象的常用方法。
同樣,在不同的數據提供者的內部,Command對象的名稱是不同的,在SQL Server Data Provider里叫SqlCommand,而在OLE DB Data Provider里叫OleDbCommand。
下面將詳細介紹Command類型對象的常用方法,包括構造函數、執行不帶返回結果集的SQL語句方法、執行帶返回結果集的SQL語句方法和使用查詢結果填充DataReader對象的方法。
1.構造函數
構造函數用來構造Command對象。對於SqlCommand類型的對象,其構造函數說明如表 2-6所示。
函數定義 |
參數說明 |
函數說明 |
SqlCommand() |
不帶參數 |
創建SqlCommand對象 |
SqlCommand(string cmdText) |
cmdText: SQL 語句字符串 |
根據SQL語句字符串,創建SqlCommand對象 |
SqlCommand(string cmdText, SqlConnection connection) |
cmdText: SQL 語句字符串 connection: 連接到的數據源 |
根據數據源和SQL語句,創建SqlCommand對象 |
SqlCommand(string cmdText, SqlConnection connection, SqlTransaction transaction) |
cmdText: SQL語句字符串 connection: 連接到的數據源 transaction: 事務對象 |
根據數據源和SQL語句和事務對象,創建SqlCommand對象 |
(1) 第一個構造函數不帶任何參數
SqlCommand cmd=newe SqlCommand(); cmd.Connection=ConnectionObject;
string CommandText=" select *from studentInfo "; cmd.CommandText=CommandText;
上面代碼段使用默認的構造函數創建一個SqlCommand對象。然后,把已有的Connection對象ConnectionObject和命名文本CommandText分別賦給了Command對象的Connection屬性和CommandText屬性。
除此之外,許多關系型數據庫,例如SQL Server 和Oracle,都支持存儲過程。可以把存儲過程的名稱指定為命名文本。例如,使用編寫 GetAllStudent存儲過程為命名文本:
string CommandText=" GetAllStudent "; cmd.CommandType=CommandType.StoredProcedure;
cmd.CommandText=CommandText;
(2) 第二個構造函數可以接受一個命令(SQL)文本
string CommandText=" select *from studentInfo "; SqlCommand cmd=newe SqlCommand(CommandText); cmd.Connection=ConnectionObject;
上面的代碼實例化了一個Command對象,並使用給定命令文本對Command對象的CommandText屬性進行了初始化。
然后,使用已有的Connection 對象對Command對象的Connection屬性進行了賦值。(這種方法在上一篇說過,不建議使用,使用最多的是下面的方法)
(3) 第三個構造函數接受一個Connection和一個命名文本
SqlCommand cmd=newe SqlCommand(CommandText, ConnectionObject);
注意這兩個參數的順序,第一個為string類型的命令文本,第二個為Connection對象。
(4) 第四個構造函數接受三個參數,第三個參數是SqlTransaction對象,這里不做討論。
另外,Connection 對象提供了CreateCommand方法,該方法將實例化一個Command對象,並將其Connection屬性賦值為建立該Command對象的Connection對象。
無論在什么情況下,當把Connection對象賦值給Command對象的Connection屬性時,並不需要Connection對象是打開的。但是,如果連接沒有打開,則在命令執行之前必須首先打開連接。
而對於OleDbCommand類型的對象,其構造函數如下表所示。同樣可以看出,它們和SqlCommand類的構造函數非常相似。
函數定義 |
參數說明 |
函數說明 |
OleDbCommand() |
不帶參數 |
創建OleDbCommand對象 |
OleDbCommand(string cmdText) |
cmdText: SQL語句字符串 |
根據SQL語句字符串,創建OleDbCommand對象 |
OleDbCommand(string cmdText,OleDbConnection connection) |
cmdText: SQL語句字符串 connection:連接到的數據源 |
根據數據源和SQL語句,創建OleDbCommand對象 |
OleDbCommand(stringcmdText, OleDbConnection connection , OleDbTransaction transaction) |
cmdText: SQL語句字符串 connection:連接到的數據源 transaction:事務對象 |
根據數據源和SQL語句和事務對象,創建OleDbCommand對象 |
命令對象構造完成后,就可以執行命令對數據庫進行操作了。命令對象所提供的用於執行命令的方法有很多種,具體使用哪個方法取決於命令的執行結果返回什么樣的數據。
SqlCommand 提供了4個執行方法:ExecuteNonQuery()、ExecuteScalar()、ExecuteReader()、ExecuteXmlReader()。
詳細見下面相關部分。
命令對象提供的用於執行命令的方法及其含義如表
方法 |
含義 |
Cancel |
試圖取消命令的執行 |
ExecuteNonQuery |
對連接執行SQL語句並返回受影響的行數 |
ExecuteReader |
執行查詢,將查詢結果返回到數據讀取器(DataReader)中 |
ExecuteScalar |
執行查詢,並返回查詢所返回的結果集中第一行的第一列。忽略額外的列或行 |
ExecuteXmlReader |
執行查詢,將查詢結果返回到一個XmlReader對象中 |
2.ExecuteNonQUery方法
ExecuteNonQuery方法用來執行Insert、Update、Delete等非查詢語句和其他沒有返回結果集的SQL語句,並返回執行命令后影響的行數。
如果Update和Delete命令所對應的目標記錄不存在,返回0。如果出錯,返回-1。
String cnstr="server=(local);database=student; Integrated Security=true"; SqlConnection cn=new SqlConnection(cnstr); cn.Open(); string sqlstr="update student set name='Jone' where name='Bill' "; SqlCommand cmd=new SqlCommand(sqlstr, cn); cmd.ExecuteNonQuery(); cn.Close();
3.ExecuteScalar()方法
在許多情況下,需要從SQL語句返回一個結果,例如客戶表中記錄的個數,當前數據庫服務器的時間等。
ExecuteScalar方法執行一個SQL命令,並返回結果集中的首行首列(執行返回單個值的命令)。如果結果集大於一行一列,則忽略其他部分。
根據該特性,這個方法通常用來執行包含Count、Sum等聚合函數的SQL語句。
下面的代碼讀取數據庫中表student的記錄個數,並把它輸出到控制台上。 String cnstr="server=(local);database=student; Integrated Security=true"; SqlConnection cn=new SqlConnection(cnstr); cn.Open(); string sqlstr="select count(*) from student"; SqlCommand cmd=new SqlCommand(sqlstr, cn); object count=cmd.ExecuteScalar(); Console.WriteLine(count.ToString()); cn.Close(); ExecuteScalar()方法的返回值類型是Object,根據具體需要,可以將它轉換為合適的類型。
4.ExecuteReader()方法
ExecuteReader()方法執行命令,並使用結果集填充DataReader對象。
ExecuteReader()方法用於執行查詢操作,它返回一個DataReader對象,通過該對象可以讀取查詢所得的數據。
ExecuteReader()方法在Command對象中用得比較多,通過DataReader類型的對象,應用程序能夠獲得執行SQL查詢語句后的結果集。
該方法的兩種定義為:
ExecuteReader(),不帶參數,直接返回一個DataReader結果集。
ExecuteReader(CommandBehavior behavior),根據behavior的取值類型,決定DataReader的類型。
如果behavior取值是CommandBehavior.SingleRow這個枚舉值,則說明返回的ExecuteReader只獲得結果集中的第一條數據。
如果取值是CommandBehavior.SingleResult,則說明只返回在查詢結果中多個結果集里的第一個。
一般來說,應用代碼可以隨機訪問返回的ExecuteReader列,
但如果behavior取值為 CommandBehavior.SequentialAccess,則說明對於返回的ExecuteReader對象只能順序讀取它包含的列。
也就是說,一旦讀過該對象中的列,就再也不能返回去閱讀了。這種操作是以方便性為代碼換取讀數據時的高效率,需謹慎使用。
String cnstr="server=(local);database=student; Integrated Security=true"; SqlConnection cn=new SqlConnection(cnstr); cn.Open(); string sqlstr="select * from student"; SqlCommand cmd=new SqlCommand(sqlstr, cn); SqlDataReader dr=cmd.ExecuteReader();//建立SqlDataReader 對象 while(dr.Read())//循環輸出每一條記錄 { String name=dr["姓名"].ToString();//讀取姓名子段 Console.WriteLine(name);//控制台輸出 } dr.Close();//關閉結果集 cn.Close();//關閉數據庫連接
這段代碼從數據庫的student表中讀取全部數據,並把該表的“姓名”字段的數據全部輸出到控制台上。
ExecuteXmlReader
SqlCommand特有的方法,OleDbCommand無此方法。該方法執行將返回XML字符串的命令。它將返回一個包含所返回的XML的System.Xml.XmlReader對象。