ADO.NET基础

一、介绍

     ado.net是.net framework的数据提供程序,它主要有SqlConnection、SqlCommand、SqlDataAdapter、SqlDataReader和DataSet五大对象构成,结构如下图(l来自msdn)
 
ADO.NET基础
   1.SqlConnection类表示一个sql server数据库的一个连接
    连接字符串格式一般有如下两种形式,具体参数可以参照msdn
               1)Persist Security Info=False;Integrated Security=true;Initial Catalog=Northwind;server=(local)
               2)Server=.;Database=demodb;User=sa;Password=123;
    创建一个连接如下     
      SqlConnection  conn =  new  SqlConnection (connString );
   2.SqlCommand类表示数据库执行命令对象
          1)用来设置需要执行的sql脚本或存储过程、超时时间、参数和事务等。
          2)创建方式如下
               SqlConnection  conn =  new  SqlConnection ();
             // 方式一
            conn.CreateCommand();
 
             // 方式二
             SqlCommand  cmd =  new  SqlCommand ();
            cmd.CommandText =  "select * from table"  ;
            cmd.Connection = conn;
          3)几个主要方法
            ExecuteNonQuery:对连接执行sql语句并返回受影响行数,主要执行增、删和改操作
            ExecuteReader:执行查询返回SqlDataReader对象
            ExecuteScalar:执行查询返回结果集中的第一行和第一列
    
      3.SqlDataAdapter类用来填充DataSet和更新数据库数据命令和数据库连接
          该类有4种构造函数如下
         public  SqlDataAdapter();
         public  SqlDataAdapter( SqlCommand  selectCommand);
         public  SqlDataAdapter( string  selectCommandText,  SqlConnection  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];

                }

            }

        }

    }
View Code

  上面代码中使用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;

            }

        }

    }
View Code

四、其它第三方框架

  有Dapper、IBatis.Net等等,可以参考学习下

你可能感兴趣的:(.net)