黑马程序员--数据库开发及ADO.NET学习总结

来源:互联网 发布:电动汽车数据采集 编辑:程序博客网 时间:2024/06/11 11:17

---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------

         DBMS数据库管理系统,一般情况下说数据库即是指数据库管理系统,常见数据库管理系统有:SYBASE,ORACLE,MySQL,ACCESS,MS SQL Server,其中MS SQL Server是.NET开发常用数据库。

          ADO.NET类别 (Class) 位于 System.Data.dll 中,提供了对各种数据库的统一操作接口。ADO.NET中用于存取和管理资料的两个主要元件是 .NET Framework 资料提供者和 DataSet。

         .NET Framework 资料提供者:

           (1)Connection 物件会提供资料来源的连接,负责连接数据库;

           (2) Command 物件可让您存取资料库命令,负责对数据库执行命令;

           (3)DataReader 则可提供来自资料来源的高效能资料流。

           (4)使用 Command 物件与资料来源处执行 SQL 命令,以便将资料载入 DataSet,并且将 DataSet 内的资料变更调节回资料来源,即负责数据集和数据库的联系。

         DataSet:

          它可独立于任何资料来源外而存取资料,因此,它可与多个不同的资料里来源搭配使用、与 XML 资料搭配使用,DataSet 包含一或多个由资料列和资料行所组成的 DataTable物件集合,以及 DataTable 物件中的主索引键、外部索引键、条件约束 (Constraint) 及资料的相关资讯。

           下面对.NET Framework 资料提供者做详细介绍:

             sql server 的.NET Framework 资料提供者位于命名空间System.Data.SqlClient,有SqlConnection类,SqlCommand类,SqlDataAdapter类和SqlDataReader类。

             SqlConnection 对象用来创建数据库连接,SqlCommand对象执行数据库命令,SqlDataAdapter和SqlDataReader 变量用来存放SqlCommand对象执行数据库命令后返回的数据,

            SqlConnection,SqlCommand,SqlDataAdapter以及SqlDataReader在使用时都会创建链接,因此一旦这些类对应的对象完成操作,要关闭链接,否则会导致链接池中的链接不够用,

在我们创建一个连接的实例,并调用Open()方法时,连接池管理程序会在连接池中找到一个可用的连接;当调用Close()方法时,连接池管理程序又将连接返回到连接池中,以供下一次调用Open()方法时使用。

            连接数据库并执行相关命令:

            string ConnStr = "data source =.;Initial Catalog = BRC;user = sa;password = 123456";//连接字符串

             using ( SqlConnection sqlCon = new SqlConnection(ConnStr))//实例化一个SqlConnection对象,创建数据库连接,using范围之外,sqlCon的链接就被释放了。
            {
                //打开数据库连接
                sqlCon.Open();
                using ( SqlCommand  cmd = new SqlCommand("select * from pe_task"))//创建一个SqlCommand对象,在using范围之外,cmd的链接就被释放了。
                {
                    cmd.Connection = sqlCon;
                    SqlDataReader  dr = cmd.ExecuteReader();//创建一个SqlDataReader 对象读取数据库中的数据,ExecuteReader返回一个多行多列的结果集
             
                        if (dr.HasRows)
                        {
                            while (dr.Read())//逐行读取dr中的数据
                            {
                                int FID = dr.GetInt32(dr.GetOrdinal("FMID"));
                                Console.WriteLine("sqlCon:" + sqlCon.State.ToString());//sqlCon的状态为open
                                Console.WriteLine("dr:" + dr.IsClosed.ToString());//dr的状态为open
                            }
                        }
               
                    Console.WriteLine("sqlCon:" + sqlCon.State.ToString());//sqlCon的状态为open
                    Console.WriteLine("dr:" + dr.IsClosed.ToString());//dr的状态为open
                }
              
                Console.WriteLine("sqlCon:" + sqlCon.State.ToString());//sqlCon的状态为closed

                Console.WriteLine("dr:" + dr.IsClosed.ToString());//dr的状态为关闭
            }

                 通过这段程序可以看出:using 会释放对象的链接,并且当SqlConnection的链接被释放后,dr的链接对象变成了关闭状态。

           若使用SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);则当reader关闭连接后,sqlCon的链接也会被关闭。

       使用SqlDataAdapter填充数据集:

           string ConnStr = "data source =.;Initial Catalog = BRC;user = sa;password = 123456";
            using (SqlConnection sqlCon = new SqlConnection(ConnStr))//实例化一个SqlConnection对象,创建数据库连接
            {
                //打开数据库连接
                sqlCon.Open();
                using (SqlCommand cmd = new SqlCommand("select * from pe_task"))//
                {
                    cmd.Connection = sqlCon;
                    SqlDataAdapter dr = new SqlDataAdapter(cmd);
                    DataSet dst = new DataSet();
                    dr.Fill(dst);
                }
            }

sql 防漏洞:

例如在登录某一个需要用户名和密码的系统时,若简单的用拼接sql 语句的方法来查询用户名密码可能导致密码泄露

 如 sql = "select * from t_users where fname = "+name+" and fpassword = "+password+" or 1=1" 由于 后面的查询条件1=1永远是真,所以产生用户信息外泄的不安全情况,

但若将name 和password  用参数的形式传给数据库就不会出现这样的情况:

  sql = "select * from t_users where fname =@ name  and fpassword =  @password",这样就会直接在数据库中查询fname =@ name 并且fpassword =  @password的用户信息,而不是拼 sql语句。

       

---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ----------------------

 

原创粉丝点击