C#中ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter應該怎么用?


對於C#初學者來說,我們通常遇到ExecuteReader、ExecuteNonQuery、ExecuteScalar、SqlDataReader、SqlDataAdapter這些對象或者方法的時候就開始犯暈,不知道哪個對象適合用增刪改,哪個對象適合查詢的時候用,本人通過 網上搜索和個人的一些理解,整理了一下,有錯誤的地方希望大家能給出指正。

一、
//數據庫連接字符串
    private readonly static string connectionString =      ConfigurationManager.ConnectionStrings["MyConnection"].ToString();

    ///
    /// 執行增,刪,改的方法,支持存儲過程
    ///
    /// 連接字符串,自滿足,請用SqlHelper.connString賦值
    /// 命令類型,如果是sql語句,則為CommandType.Text,否則為   CommandType.StoredProcdure
    /// SQL語句或者存儲過程名稱
    /// SQL參數,如果沒有參數,則為null
    /// 受影響的行數
    public static int ExecuteNonQuery(CommandType commandType, string cmdText, params  SqlParameter[] para)
    {
        using (SqlConnection conn = new SqlConnection(connectionString))
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandType = commandType;
            cmd.CommandText = cmdText;
            if (para != null)
            {
                cmd.Parameters.AddRange(para);
            }
            conn.Open();
            return Convert.ToInt32(cmd.ExecuteNonQuery());
        }
    }
注:1、ExecuteNonQuery()執行命令對象的SQL語句,返回一個int 類型的變量,返回數據庫操作之后影響的行數。適合用來驗證對數據庫進行增刪改的情況。

         2、ExecuteScalar()也可以執行sql語句。如果SQL語句是Select查詢,則僅僅返回查詢結果集中第一行第一列,而忽略其他行和列。如果SQL語句不是Select查詢,則這個返回結果沒任何作用。(建議查詢數據庫時使用)  由於不知道sql語句到底是什么樣的結構(有可能是int,有可能是Char等其它,)所以ExecuteScalar()方法返回一個最基本的類型Object,這個類型是所有類型的基類,可以轉換為任意類型,所以所以用前需強制轉換。一般用在插入語句后加上一個 select @@identity; 返回插入ID

二、    

///

    /// 執行查詢的方法,支持存儲過程

    /// SQL參數,如果沒有參數,則為null      

    /// 返回查詢結果的第一行第一列

    public static object GetScalar(CommandType commandType, string cmdText, params SqlParameter[] para)

    {

        object result = null;

        using (SqlConnection conn = new SqlConnection(connectionString))

        {

            SqlCommand cmd = new SqlCommand();

            cmd.Connection = conn;

            cmd.CommandType = commandType;

            cmd.CommandText = cmdText;

            if (para != null)

            {

                cmd.Parameters.AddRange(para);

            }

            conn.Open();

            result = cmd.ExecuteScalar();

        }

        return result;

    }

 

}

注:ExecuteScalar()也返回一個int型變量。如果SQL語句是Select查詢,則僅僅返回查詢結果集中第一行第一列,而忽略其他行和列。如果SQL語句不是Select查詢,則這個返回結果沒任何作用。(建議查詢數據庫時使用)  由於不知道sql語句到底是什么樣的結構(有可能是int,有可能是Char等其它,)所以ExecuteScalar()方法返回一個最基本的類型Object,這個類型是所有類型的基類,可以轉換為任意類型,所以用前需強制轉換。

 

 

三:

///

    /// 執行查詢的方法,支持存儲過程

    /// SQL參數,如果沒有參數,則為null

    /// 讀取器SqlDataReader

    public static SqlDataReader ExecuteReader(CommandType commandType, string cmdText, params SqlParameter[] para)

    {

        SqlConnection conn = new SqlConnection(connectionString);

        SqlDataReader dr = null;

        SqlCommand cmd = new SqlCommand();

        cmd.Connection = conn;

        cmd.CommandType = commandType;

        cmd.CommandText = cmdText;

        if (para != null)

        {

            cmd.Parameters.AddRange(para);

        }

        conn.Open();

        dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);

        return dr;

注:1、ExecuteReader方法存在的目的:盡可能快的對數據庫進行查詢並得到結果

         2、ExecuteReader 返回一個DataReader對象,如果在SqlCommand對象中調用,

則返回SqlDataReader,如果在OledbCommand對象中調用,返回的是OledbDataReader,可以調用DataReader的方法和屬性迭代處理結果集。

 

 

四:

///

        /// 執行查詢的方法,支持存儲過程

    /// SQL語句或者存儲過程名稱

    /// SQL參數,如果沒有參數,則為null

    /// 數據集

    public static DataSet GetDataSet(CommandType commandType, string cmdText, params SqlParameter[] para)

    {

        using (SqlConnection conn = new SqlConnection(connectionString))

        {

            SqlDataAdapter da = new SqlDataAdapter();

            da.SelectCommand = new SqlCommand();

            da.SelectCommand.Connection = conn;

            da.SelectCommand.CommandText = cmdText;

            da.SelectCommand.CommandType = commandType;

            if (para != null)

            {

                da.SelectCommand.Parameters.AddRange(para);

            }

            DataSet  ds = new DataSet();

            conn.Open();

            da.Fill(ds);

            return ds;

        }

}

 

SqlDataReader與SqlDataAdapter+DataSet的區別

一,SqlDataReader //基於連接,只讀訪問 適合數據量較小。(連接模式)

      SqlDataAdapter //基於非連接,適於數據量較大時,可以另行修改,最后再把修改結果返回給數據庫。要求資源也大一點  (斷開模式)

二,SqlDataAdapter 讀取數據后將數據集放入DataSet ,DataSet 的數據存在本地客服機內存。

三,SqlDataReader返回的是一個數據讀寫器,只能一條條的讀,操作起來不靈活,一般在只讀的時候才用到。

      SqlDataAdapter返回的是數據集或者表,可以對其中的數據作任意操作

四,寫法上不同:

     SqlDatReader執行前須先打開數據庫,然后須生成一個command對象。再由command.ExecuteReader()方法賦值。完成后須手動關閉聯接。

     SqlCommand cmd = new SqlCommand("select * from stu", conn);

            conn.Open();

            SqlDataReader rdr = cmd.ExecuteReader();

            。。。。。

            conn.close();

       SqlDataAdapter 執行時,自動打數據庫,且不用Command的ExecuteReader方法進行賦值,完成后自動斷開聯接。

            SqlDataAdapter adptr = new SqlDataAdapter(sql, conn);

            DataSet ds = new DataSet();

            adptr.Fill(ds, "stu");

   

   

實例:

1,運用SqlDataReader 讀取數據

class DataReader

    {

        static void Main()

        {

            string str = "server=localhost;uid=sa;pwd=123;database=northwind";

            SqlConnection conn = new SqlConnection(str);

            SqlCommand cmd = new SqlCommand("select * from stu", conn);

            conn.Open();

            SqlDataReader rdr = cmd.ExecuteReader();

             DataTable table=new Datable();

            table.Load(rdr);

             rdr.Close();

            conn.Close();

        }

2,運用SqlDataAdapter +DataSet 讀取修改數據

        

    class SqlDataAdapter

    {

        static void Main()

        {

            string str = "server=localhost;uid=sa;pwd=123;database=northwind";

            SqlConnection conn = new SqlConnection(str);

            string sql = "select * from stu";

            SqlDataAdapter adptr = new SqlDataAdapter(sql, conn);//Adepter對象

            DataSet ds = new DataSet();//DataSet對象

            adptr.Fill(ds, "stu");//填充DataSet 並為當前表命名

            DataTableReader rdr = ds.CreateDataReader();

            while (rdr.Read())//讀取表中數據

            {

                for (int i = 0; i < rdr.FieldCount; i++)

                {

                    Console.Write(rdr.GetName(i) + "\t" + rdr.GetValue(i) + "\t");

                }

                Console.WriteLine();

            }

        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM