1. 程式人生 > >ADO.NET系列之Command物件

ADO.NET系列之Command物件

上一篇《ADO.NET系列之Connection物件》簡單介紹了ADO.NET的概念以及Connection物件的方法屬性和使用方法,這篇我們將介紹ADO.NET中另一個重要的物件:Command

Command物件

   ADO.NET主要的作用就是供我們對資料來源統一的訪問方式,對資料來源的增刪改查操作,Connection物件只是給我們建立了一個連線資料來源的通道,但是要執行什麼操作應該怎麼辦呢? 這個時候就要用到Command物件了。跟Connection一樣,不同的資料來源,ADO.NET提供了不同的Command物件

。所有Command物件都是繼承於DbCommand基類。DbCommand位於名稱空間:System.Data.Common,同樣.NET提供了四種Command物件:

  1.   針對Sql Server的SqlCommand,位於名稱空間System.Data.SqlClient下
  2.   針對Oledb連結的OledbCommand,位於名稱空間System.Data.Oledb下
  3.   針對MySql的MySqlCommand,位於名稱空間System.Data.MySqlClient下(需要引用MySql.Data.dll)
  4.   針對Oracle的OracleCommand,位於名稱空間Oracle.ManagedDataAccess.Client(需引用Oracle.ManagedDataAccess.dll)

Command物件幾個常用的方法:

  • ExecuteNonQuery():        對連線執行 Transact-SQL 語句並返回受影響的行數。返回結果:受影響的行數。
  • ExecuteScalar():              執行查詢,並返回查詢所返回的結果集中第一行的第一列。忽略其他列或行.返回結果:結果集中第一行的第一列.
  • ExecuteReader():             生成一個 System.Data.SqlClient.SqlDataReader物件

下面我們以示例的方式解讀下這幾個方法的使用和作用。

ExecuteNonQuery:

根據上面的意思我們可以發現ExecuteNonQuery()方法可以執行對資料庫增刪改的操作,ExecuteNonQuery()示例如下:

 //新增操作
            string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                try
                {
                    con.Open();
                    string sql = "insert into table values(@name,@loginname)";
                    SqlParameter[] paras = new SqlParameter[] {
                        new SqlParameter("@name",SqlDbType.NVarChar,50),
                        new SqlParameter("@loginname",SqlDbType.NVarChar,50)
                    };
                    paras[0].Value = "2";
                    paras[1].Value = "222";
                    SqlCommand com = new SqlCommand(sql, con);
                    com.Parameters.AddRange(paras);
                    int rows = com.ExecuteNonQuery();
                    if (rows > 0)
                        Console.WriteLine("新增資料成功");
                }
                catch (SqlException ex)
                {
                    Console.WriteLine("新增過程中出現錯誤:" + ex.Message);
                }
            }

SqlParameter表示 System.Data.SqlClient.SqlCommand 的引數,我們這行學習ADO.NET的時候老師一而再再而三強調的就是SQL語句中的引數千萬不要拼裝成SQL語句字串,要記得使用引數物件來傳遞引數,因為直接拼裝存在注入危險,具體的什麼危險,咱們下面查詢的時候再討論。

SqlParameter就是執行SqlCommand命令過程中需要的引數。 

 //修改操作
            string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                try
                {
                    con.Open();
                    string sql = "update  table set [email protected] where [email protected]";
                    SqlParameter[] paras = new SqlParameter[] {
                        new SqlParameter("@name",SqlDbType.NVarChar,50),
                        new SqlParameter("@id",SqlDbType.Int)
                    };
                    paras[0].Value = "abc";
                    paras[1].Value = 1;
                    SqlCommand com = new SqlCommand(sql, con);
                    com.Parameters.AddRange(paras);
                    int rows = com.ExecuteNonQuery();
                    if (rows > 0)
                        Console.WriteLine("修改資料成功");
                }
                catch (SqlException ex)
                {
                    Console.WriteLine("修改過程中出現錯誤:" + ex.Message);
                }
            }
 //刪除操作
            string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                try
                {
                    con.Open();
                    string sql = "delete  table where [email protected]";
                    SqlParameter[] paras = new SqlParameter[] {                       
                        new SqlParameter("@id",SqlDbType.Int)
                    };
                    paras[0].Value =1;
                    SqlCommand com = new SqlCommand(sql, con);
                    com.Parameters.AddRange(paras);
                    int rows = com.ExecuteNonQuery();
                    if (rows > 0)
                        Console.WriteLine("刪除資料成功");
                }
                catch (SqlException ex)
                {
                    Console.WriteLine("刪除過程中出現錯誤:" + ex.Message);
                }
            }

 ExecuteScalar:

ExecuteScalar: 執行查詢,並返回查詢所返回的結果集中第一行的第一列。忽略其他列或行.返回結果:結果集中第一行的第一列。比如我們查詢表中資料量的行數就可以使用ExecuteScalar。

            string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                try
                {
                    con.Open();
                    string sql = "select count(1) from table ";                  
                    SqlCommand com = new SqlCommand(sql, con);                  
                    object rows = com.ExecuteScalar();
Console.WriteLine(
"查詢表中共{0}條資料",rows); } catch (SqlException ex) { Console.WriteLine("查詢過程中出現錯誤:" + ex.Message); } }

 ExecuteReader:

   查詢資料select的時候我們可以使用ExecuteReader()方法,ExcuteReader方法返回一個DataReader物件,

   DataReader是一個快速的,輕量級,只讀的遍歷訪問每一行資料的資料流。使用DataReader時,需要注意以下幾點:

  • DataReader一次遍歷一行資料,並返回一個包含列名字集合。
  • 第一次呼叫Read()方法獲取第一行資料,並將遊標指向下一行資料。當再次呼叫該方法時候,將讀取下一行資料。
  • 當檢測到不再有資料行時,Read()方法將返回false。
  • 通過HasRows屬性,我們知道查詢結果中是否有資料行。
  • 當我們使用完DataReader時,一定要注意關閉。SQL Server預設只允許開啟一個DataReader
 string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                con.Open();
                string sql = "select id,name,loginname from table";
                SqlCommand com = new SqlCommand(sql, con);
                SqlDataReader dreader = com.ExecuteReader(CommandBehavior.CloseConnection);
                while (dreader.Read())
                {
                    Console.WriteLine(String.Format("{0}, {1},{2}",dreader[0], dreader[1], dreader[2]));
                }
                dreader.Close();
            }

   在這介紹一個SqlDataReader 的GetOrdinal方法:在給定列名稱的情況下獲取列序號。上面的示例我們也可以這樣:

  string connectionString = "Data Source=.;Initial Catalog=ax_log;User Id=sa;Password=sa123;";
            using (SqlConnection con = new SqlConnection(connectionString))
            {
                con.Open();
                string sql = "select id,name,loginname from table";
                SqlCommand com = new SqlCommand(sql, con);
                SqlDataReader dreader = com.ExecuteReader(CommandBehavior.CloseConnection);
                int id = dreader.GetOrdinal("id");
                int nameid = dreader.GetOrdinal("name");
                int loginnameid = dreader.GetOrdinal("loginname");
                while (dreader.Read())
                {
                    Console.WriteLine(String.Format("{0}, {1},{2}",dreader[id], dreader[nameid], dreader[loginnameid]));
                }
                dreader.Close();
            }

 總結:本文只是介紹了SqlCommand的用法,還有OledbCommand,MySqlCommand,OracleCommand物件,使用起來跟SqlCommand大同小異,大家可以自己研究下。