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物件。