黑马程序员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: