ADO.NET讀書筆記系列之------SqlCommander和SqlDataReader對象

來源:互聯網
上載者:User
ado|command|筆記|對象
一、特點介紹

⒈SqlCommand:表示要對SQL Server資料庫執行的一個Transact-SQL語句或預存程序。

⒉SqlDataReader:提供一種從資料庫讀取只進的行流的一種方式。若要建立SqlDataReader,必須調用SqlCommand對象的ExecuteReader方法,而不直接使用建構函式。應該儘可能迅速的關閉SqlDataReader對象。

⒊SqlParameter:表示SqlCommand的參數,也可以是它到DataSet列的映射。

 

二、使用介紹

⒈建立SqlCommand對象:

    string strConn,strSQL;

    strConn=”…………”;

    strSQL=”Select CustomerID,CompanyName from Customers”;

    SqlConnection cn = new SqlConnection(strConn);

    cn.Open();

    SqlCommand cmd;

   

    cmd=new SqlCommand();

    cmd.CommandText=strSQL;

    cmd.Connection=cn;

 

    cmd=new SqlCommand(strSQL,cn); 

⒉執行無返回行的查詢:

    string strConn,strSQL;

    strConn=”……”;

strSQL=”Update Customers SET CompanyNme=’NewName’where CustomersID=’ALFKI’”;

    SqlConnection cn=new SqlConnection(strConn);

    cn.Open();

    SqlCommand cmd=new SqlCommand(strSQL,cn);

    int RecordsAffercted=cmd.ExecuteNonQuery();

    if(RecordsAffercted ==1)

       ……

    else

      …………

⒊用SqlDataReader對象檢查查詢結果:

①    擷取結果

string strConn,strSQL;

  strConn=”……”;

    SqlConnection cn=new SqlConnection(strConn);

  cn.Open();

  strSQL=”Select CustomerID,CompanyName from Customers”;

    SqlCommand cmd=new SqlCommand(strSQL,cn);

SqlDataReader rdr=cmd.ExecuteReader();

     While(rdr.Read())

      Console.Writeline(rdr[“CustomerID”]+rdr[“CompanyName”]);

  Rdr.Close(); 

②    更快擷取

Ⅰ使用基於序號的尋找

    ……

    SqlDataReader rdr=cmd.ExecuteReader();

    int CustomerIDOrdinal = rdr.GetOrdinal(“CustomerID”);

    int CompanyNameOrdinal = rdr.GetOrdinal(“CompanyName”);

    while(rdr.Read())

        Console.WriteLine(rdr[CustomerIDOrdinal]+rdr[CompanyNameOrdinal]);

    rdr.Close();

Ⅱ使用適當的類型指定Get方法

    ……

    SqlDataReader rdr=cmd.ExecuteReader();

    int CustomerIDOrdinal = rdr.GetOrdinal(“CustomerID”);

   int CompanyNameOrdinal = rdr.GetOrdinal(“CompanyNameOrdinal”);

    while(rdr.Read())

        Console.WriteLine(rdr.GetString(CustomerIDOrdinal)+rdr.GetString(CompanyNameOrdinal));

    rdr.Close(); 

③擷取多個結果

    …

    cn.Open();

    string strSQL =”select CustomerID,CompanyName from Customers;”+“select OrderID,CustomerID from Orders;”;

    SqlCommand cmd=new SqlCommand(strSQL,cn);

    SqlDataReader rdr=cmd.ExecuteReader();

    do

    {

        while(rdr.Read())

           Console.WriteLine(rdr[0]+rdr[1]);

        Console.WriteLine();

    }while(rdr.NextResult()); 

⒋執行返回單值的查詢:

    …

    cn.Open();

    SqlCommand cmd=new SqlCommand(“select count(*) from customers",cn);

    int Customres = Convert.ToInt32(cmd.ExecuteScalar());   

⒌執行參數化查詢和調用預存程序:

    SqlCommand cmd = new SqlCommand("DelQXRY", cn);

    cmd.CommandType = CommandType.StoredProcedure;

    SqlParameter parameterRoleID = new SqlParameter("@ID", SqlDbType.Int, 4);

    parameterRoleID.Value = 444;

    cmd.Parameters.Add(parameterRoleID);  

    cn.Open();

    cmd.ExecuteNonQuery(); 

⒍ 從 輸出參數中擷取資料:

    Create Procedure GetCustomer(@CompanyName nvarchar(30) output,@CustomerID nchar(5)) AS SELECT @CompanyName=CompanyName from Customers where CustomerID=@CustomerID

    …

cmd.Parameters[“@CompanyName”].Direction =ParameterDirection.Output; 

 

⒎在Transaction中執行查詢:

    …

    cn.Open();

    SqlTransaction txn=cn.BeginTransaction();

    String strSQL=”Insert into Customers(…)values(…)”;

    SqlCommand cmd=new SqlCommand(strSQL,cn,txn);

    int RecordAffected = cmd.ExecuteNonQuery();

    if(RecordAffected ==1)

    {

        txn.Commit();

    }

    else

    {

        txn.RollBack();

    }

 

三、屬性方法事件介紹

⒈SqlCommand

Ⅰ屬性

    ①CommandText: 要執行的 Transact-SQL 陳述式或預存程序。預設為空白字串。

    ②CommandTimeOut: 等待命令執行的時間(以秒為單位)。預設為 30 秒。

    ③CommandType: CommandType 值之一。預設值為 Text。



    ④Connection: 與資料來源的串連。預設值為空白引用

    ⑤Parameters: Transact-SQL 陳述式或預存程序的參數。預設為空白集合。

    ⑥Transaction:指定用於查詢的交易處理

    ⑦UpdateRowSource:如果通過調用DataAdapter對象的Update方法來使用Command,那麼該屬性就用於控制影響當前DataRow的查詢結果(預設值為Both)

 

Ⅱ方法

①Cancel: 試圖取消SqlCommand的執行。如果沒有要取消的內容,則什麼都不會發生。但如果有命令正在執行,而取消嘗試失敗,則不會產生異常。Cancel方法還會導致Command對象刪除DataReader對象上所有未讀的行。

②CreateParameter:為查詢建立一個新參數。

③ExecuteNonQuery:對串連執行Transact-SQL語句並返回受影響的行數。對於 UPDATE、INSERT 和 DELETE 語句,傳回值為該命令所影響的行數。對於所有其他類型的語句,傳回值為 -1。如果發生復原,傳回值也為 -1。

④ExecuteReader:將CommandText發送到Connection並產生一個SqlDataReader。

  public SqlDataReader ExecuteReader(CommandBehavior);



⑤ExecuteScalar:執行查詢,並返回查詢所返回的結果集中第一行的第一列。忽略額外的列或行。

⑥ExecuteXmlReader:將CommandText發送到Connection並產生一個XmlReader。

⑦PrePare:在 SQL Server 的執行個體上建立命令的一個準備版本。在調用 Prepare 之前,應指定要準備的語句中的每個參數的資料類型。

⑧ResetCommandTimeOut:將CommandTimeout屬性設定為預設值30秒。

 

Ⅲ事件

⒉SqlDataReader

Ⅰ屬性

①Depth:擷取一個值,該值指示當前行的嵌套深度。最外層表的深度為零。SQL Server .NET Framework 資料提供者不支援嵌套並總是返回零值。

②FieldCount:擷取當前行中的列數。如果未放在有效記錄集中,則為 0;否則為當前行中的列數。預設值為 -1。執行不返回行的查詢後,FieldCount 返回 0。

③HasRows:如果SqlDataReader包含一行或多行,則為true;否則為false。

④IsClosed:如果SqlDataReader已關閉,則為true;否則為false。

⑤Item:擷取以原生格式表示的列的值。

⑥RecordsAffected:已更改、插入或刪除的行數;如果沒有任何行受到影響或語句失敗,則為 0;-1 表示 SELECT 語句。

Ⅱ方法

①Close:關閉SqlDataReader對象。如果傳回值和查詢影響的記錄的數量不重要,則可以在調用Close方法前調用關聯的SqlCommand對象的Cancel方法,從而減少關閉SqlDataReader所需要的時間。

②GetName:擷取指定列的名稱。

③GetOrdinal:在給定列名稱的情況下擷取列序號。

④GetValue:擷取以原生格式表示的指定列的值。

⑤GetValues:擷取當前行的集合中的所有屬性列。

⑥IsDBNull:擷取一個值,該值指示列中是否包含不存在的或缺少的值。如果指定的列值與DBNull等效,則為true;否則為false。

⑦NextResult:當讀取批處理 Transact-SQL 陳述式的結果時,使資料讀取器前進到下一個結果。如果存在多個結果集,則為 true;否則為 false。

⑧Read:使SqlDataReader前進到下一條記錄,如果存在多個行,則為true;否則為false。必須調用Read來開始訪問任何資料。在某一時間,每個關聯的SqlConnection只能開啟一個SqlDataReader,在上一個關閉之前,開啟另一個的任何嘗試都將失敗。

Ⅲ事件

⒊SqlParameter

Ⅰ屬性

①DbType:擷取或設定參數的DbType。預設值為String。

②Direction:擷取或設定一個值,該值指示參數是只可輸入、只可輸出、雙向還是預存程序傳回值參數。預設值為 Input。



③IsNullable:擷取或設定一個值,該值指示參數是否接受空值。如果接受空值,則為 true;否則為 false。預設為 false。

④ParameterName:擷取或設定 SqlParameter 的名稱。

⑤Size:擷取或設定列中資料的最大大小(以位元組為單位)。預設值是從參數值推匯出的。

⑥SqlDbType:擷取或設定參數的SqlDbType。預設為NVarChar。SqlDBType和DbType是相互串連的。設定DBtype會將SqlDbType更改為支援的SqlDbType。

⑦Value:擷取或設定該參數的值。預設為空白。

Ⅱ方法

Ⅲ事件


相關文章

Beyond APAC's No.1 Cloud

19.6% IaaS Market Share in Asia Pacific - Gartner IT Service report, 2018

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。