2012年11月11日星期日

黑马程序员ADO.NET学习

黑马程序员ADO.NET学习

//ADO.NET是一组向.NET程序员公开数据访问服务的类,它提供了一系列的方法用于支持对Microsoft SQL Server和

//无连接模型:将数据下载到客户机器上,并在客户机上将数据封装到内存中,然后可以像访问本地关系数据库一样访问内存中的数据(例如:DataSet)。

//连接模型:依赖于逐记录的访问,这种访问要求打开并保持与数据库的连接。

//ADO.NET被分割成两大类:一类是与数据库直接连接的联机对象(.NET Data Provider),其中包含了Command对象、DataReader对象以及DataAdapter对象等。另一类则是不用与数据库保持连接的断线对象,例如DataSet。

//SqlDataReader类似于指针,不会保存数据在电脑上,会在数据库服务器中一条条的读,服务器连接断开后就不能读取数据。优点,对程序占用内存没有影响,适合用在大数据量的数据操作

//SqlDataAdapter是DataSet和数据库之间沟通的桥梁。 数据集DataSet包含若干DataTable表,DataTable包含若干行DataRow。优点:将查询结果填充到本地内存中,即使连接断开也不会影响数据的读取。适合用在小数据量的数据操作,大量的数据操作会非常占用内存。

//使用参数化执行数据库操作可以防止一些SQL漏洞注入攻击。

配置Web.Config文件进行数据库连接:

<??><configuration>  <connectionStrings>  <add name="MSSqlDB"   connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Demo.mdf;Integrated Security=True;User Instance=True"/>    <add name="Demo" connectionString="Server=.\SQLEXPRESS;Database=Demo;User ID=sa;Password=123"/>  </connectionStrings></configuration>

使用SqlDataReader读取数据库中的数据:

string strConn = ConfigurationManager.ConnectionStrings["MSSqlDB"].ConnectionString;string sql = "SELECT * FROM T_Demo";          using (SqlConnection _SqlConn = new SqlConnection(strConn))//实例化数据库连接对象            {              using (SqlCommand _SqlCmd = _SqlConn.CreateCommand())//实例化数据库命令执行对象                {                    _SqlCmd.CommandText = sql;//设置要执行的sql语句                       _SqlConn.Open();//打开数据库连接                    using (SqlDataReader _SqlReader = _SqlCmd.ExecuteReader())//实例化数据库读取对象                    {                        while(_SqlReader.Read())//如果读取到数据则返回true                        {                            string name = _SqlReader.GetString(_SqlReader.GetOrdinal("Name"));//获取数据库中的字段                                 Response.Write(name);                        }                  }               }            }

使用SqlDataAdapter将数据库中读取的数据保存到数据集中:

string strConn = ConfigurationManager.ConnectionStrings["MSSqlDB"].ConnectionString;string sql = "SELECT * FROM T_Demo";          using (SqlConnection _SqlConn = new SqlConnection(strConn))//实例化数据库连接对象            {              using (SqlCommand _SqlCmd = new SqlCommand(sql,_SqlConn))//实例化数据库命令执行对象                {                 using (SqlDataAdapter _SqlAdapter= new SqlDataAdapter(_SqlCmd))//实例化数据适配器对象                    {                        DataTable data = new DataTable();//实例化数据集,这是一个在内存中的缓存数据                            _SqlAdapter.Fill(data);//使用数据适配器填充数据集                            foreach ( DataRow row in data.Rows)                        {                            Response.Write(row["Name"].ToString());                        }                  }               }           }

SQL漏洞注入攻击:SELECT * FROM T_User WHERE UserName = '1' AND Password = '1' or '1'='1'

参数化执行查询操作:

            string strConn = ConfigurationManager.ConnectionStrings["MSSqlDB"].ConnectionString;            string sql = "SELECT * FROM T_Demo WHERE Name=@name AND UserPwd=@pwd";            using (SqlConnection _SqlConn=new SqlConnection(strConn))            {                using (SqlCommand _SqlCmd=new SqlCommand(sql,_SqlConn))                {                     //这样写程序会把输入的值直接拿到数据库去比对,而不会去拼接字符串                       _SqlCmd.Parameters.Add(new SqlParameter("@name", "admin"));                    _SqlCmd.Parameters.Add(new SqlParameter("@pwd", "admin"));                    _SqlConn.Open();                    int result = Convert.ToInt32(_SqlCmd.ExecuteScalar());                    Response.Write(result);                }            }

参数化执行非查询操作:

        protected void btnDemo_Click(object sender, EventArgs e)        {            string sql = "INSERT INTO T_Demo (Name,Age,Sex)VALUES(@name,@age,@sex)";            Dictionary<string, object> paramValue = new Dictionary<string, object>();            paramValue.Add("@name", "张耕明");            paramValue.Add("@age", "28");            paramValue.Add("@sex", "男");            Response.Write(ExecuteNonQuery(sql, paramValue));        }        public int ExecuteNonQuery(string sql, Dictionary<string, object> paramValue)        {            string strConn = ConfigurationManager.ConnectionStrings["MSSqlDB"].ConnectionString;            using (SqlConnection _SqlConn=new SqlConnection(strConn))            {                using (SqlCommand cmd = new SqlCommand(sql, _SqlConn))                {                    foreach (var v in paramValue)                    {                        cmd.Parameters.Add(new SqlParameter(v.Key, v.Value));                    }                    _SqlConn.Open();                    return cmd.ExecuteNonQuery();                }               }        }




TAG: