C#與資料庫訪問技術總結(五)之Command物件的常用方法

[0]發表於2014-10-31

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

相關文章