首頁  >  文章  >  後端開發  >  什麼是ado.net以及其簡單實作詳解

什麼是ado.net以及其簡單實作詳解

伊谢尔伦
伊谢尔伦原創
2017-05-31 14:32:273463瀏覽

一、介紹

     ado.net是.net framework的資料提供程序,它主要有SqlConnection、SqlCommand、SqlDataAdapter、SqlDataReader和DataSet五大物件構成,結構如下圖

  1.SqlConnection類別表示一個sql server資料庫的一個連接

    連接字串格式一般有以下兩種形式,具體參數可參考msdn

               1)Persist Security Info=False;Integrated Security=true;Initial Catalog=Northwind;server=(local)

# . =sa;Password=123;

    建立一個連線如下

      SqlConnection## conn = Connection SqlConnection## conn = Connection ##(connString);  

2.SqlCommand

類別表示資料庫執行指令物件          1)用來設定需要執行的sql腳本或預存程序、逾時時間、參數和交易等。

          2)建立方式如下

          

   

SqlConnectionc();            //

## CreateCommand();            

 

//方式二

 SqlCommand cmd = new

 

SqlCommand();## cmd.CommandText = "select * from table" ;

            cmd.Connection = conn; 3)幾個主要方法            ExecuteNonQuery:對連線執行sql語句並傳回受影響行數,主要執行增、刪和改運算

            ExecuteReader:執行查詢返回SqlDataReader物件

            ExecuteScalar:執行查詢結果集的第一行與第一列結果中的第一行與第一列表示Adapter類別用來填入DataSet與更新資料庫資料指令與資料庫連線

          此類別有4種建構子如下

       

 

#public##       

 

#        #        

#o

##' #SqlDataAdapter();       

 

1 SqlDataAdapter(#SqlCommandselectCommand);selectCommand);selectCommand);selectCommand);selectCommand);selectCommand);

       

#public SqlDataAdapter(string #selectCommandText, SqlConnectionSqlConnection#selectConnection);

       

 

public SqlDataAdapter(

string selectCommandText,

 

string

 

selectConnectionString);

     

4.SqlDataReader

類別提供一個資料流只會讀取#     ##類別提供一個資料流只進方式讀取

     

5.DataSet

類別表示資料在記憶體中的快取


二、ADO.NET簡單實作

     下方實作一個增、刪除、變更、查的例子

public class EasySqlHelper
    {
        //web.config来配置
        //private static string connString = ConfigurationManager.AppSettings["SqlConnectionString"];
        private static string connString = "Server=.;Database=demodb;User=sa;Password=123;";

        public static int ExecuteNonQuery(string sql)
        {
            using (SqlConnection conn = new SqlConnection(connString))
            {
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (conn.State != ConnectionState.Open)
                    {
                        conn.Open();
                    }

                    return cmd.ExecuteNonQuery();
                }
            }
        }

        public static SqlDataReader ExecuteReader(string sql)
        {
            SqlConnection conn = new SqlConnection(connString);
            SqlCommand cmd = new SqlCommand(sql, conn);
            SqlDataReader rdr = null;

            try
            {
                if (conn.State != ConnectionState.Open)
                {
                    conn.Open();
                }

                rdr = cmd.ExecuteReader();
            }
            catch (SqlException ex)
            {
                conn.Dispose();
                cmd.Dispose();

                if (rdr != null)
                {
                    rdr.Dispose();
                }

                throw ex;
            }
            finally
            {
                cmd.Dispose();
            }

            return rdr;
        }

        public static DataTable ExecuteDataTable(string sql)
        {
            using (SqlConnection conn = new SqlConnection(connString))
            {
                using (SqlCommand cmd = new SqlCommand(sql, conn))
                {
                    if (conn.State != ConnectionState.Open)
                    {
                        conn.Open();
                    }

                    SqlDataAdapter adp = new SqlDataAdapter(cmd);
                    DataSet ds = new DataSet();
                    adp.Fill(ds);

                    return ds.Tables[0];
                }
            }
        }
    }

  上面程式碼中使用using來確保資源釋放,所有實作IDisposable介面的類別都可以用using來釋放,即使在呼叫物件的方法上發生異常也會釋放。

三、建立不同提供者的資料來源類別實例

     上面程式碼只對sql server有效,如果要實作不同資料庫如oracle則又需要另外寫一套代碼,.Net提供了DbProviderFactory類別來建立不同資料庫實例。      同時上面5大物件也要換成DbConnection、DbCommand、DbDataReader、DbDataAdapter把特定sql server物件抽象化成更具體和資料庫類型無關物件。

//// <summary>
    /// 连接信息
    /// </summary>
    public class ConnectionInfo
    {
        private string _connectionString;
        private string _providerName;

        /// <summary>
        /// 连接字符串
        /// </summary>
        public string ConnectionString
        {
            get { return _connectionString; }
        }

        /// <summary>
        /// 提供程序的固定名称
        /// </summary>
        public string ProviderName
        {
            get { return _providerName; }
        }

        public ConnectionInfo(string connectionString, string providerName)
        {
            _connectionString = connectionString;
            _providerName = providerName;
        }
    }

    public class MySqlHelper
    {
        private static DbProviderFactory dbProvider;

        private static readonly ConnectionInfo connInfo = new ConnectionInfo("Server=.;Database=demodb;User=sa;Password=123;", "System.Data.SqlClient");

        private static void GetProvider()
        {
            dbProvider = DbProviderFactories.GetFactory(connInfo.ProviderName);
        }

        static MySqlHelper()
        {
            GetProvider();
        }

        public static int ExecuteNonQuery(string sql, DbParameter[] parameters)
        {
            int flag = 0;

            using (DbConnection conn = dbProvider.CreateConnection())
            {
                conn.ConnectionString = connInfo.ConnectionString;
                conn.Open();

                using (DbCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;

                    if (parameters != null && parameters.Length > 0)
                    {
                        cmd.Parameters.AddRange(parameters);
                    }

                    flag = cmd.ExecuteNonQuery();
                }
            }

            return flag;
        }

        public static void ExecuteReader(string sql, DbParameter[] parameters, Action<IDataReader> action)
        {
            IDataReader rdr = null;
            
            using (DbConnection conn = dbProvider.CreateConnection())
            {
                conn.ConnectionString = connInfo.ConnectionString;
                conn.Open();

                using (DbCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;

                    if (parameters != null && parameters.Length > 0)
                    {
                        cmd.Parameters.AddRange(parameters);
                    }

                    rdr = cmd.ExecuteReader();

                    action(rdr);

                    rdr.Close();
                }
            }
        }

        public static DataTable ExecuteDataTable(string sql, DbParameter[] parameters)
        {
            DataTable dt = null;

            using (DbConnection conn = dbProvider.CreateConnection())
            {
                conn.ConnectionString = connInfo.ConnectionString;
                conn.Open();

                using (DbCommand cmd = conn.CreateCommand())
                {
                    cmd.CommandText = sql;

                    if (parameters != null && parameters.Length > 0)
                    {
                        cmd.Parameters.AddRange(parameters);
                    }

                    IDataReader rdr = cmd.ExecuteReader();

                    dt = new DataTable();
                    dt.Load(rdr);

                    rdr.Close();
                    
                }

                return dt;
            }
        }
    }

四、其它第三方框架

  有Dapper、IBatis.Net等等,可以參考學習下

【相關推薦】

1. ###ASP.NET免費影片教學##########2. ###C#使用Ado.Net更新並新增資料到Excel表格的方法#########3. ###ADO.NET 讀取EXCEL的實作碼((c#))#########4. ###ADO.NET呼叫儲存過程#########5. ###ado.net 連線vs 資料庫程式碼#######

以上是什麼是ado.net以及其簡單實作詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn