学生管理系统(简易)7/25
面向对象:当你需要完成某一个功能时候,自己不能实现,那么就去找能够实现这个功能的对象,调用这个对象的方法,面向对象是一种思想,面向对象是抽象的,每一个人对面向对象的理解都是不一样的;
SqlConnection comm=new SqlConnection();
comm.Dispose();//销毁连接通道,只要销毁了就不能再打开了,彻底解决占用的资源问题;
using(SqlConnection comm=new SqlConnection(query//执行命令,敲入command,conn//连接数据库的代码);){ };//在这个函数中,结束后,自动运行comm.dispose();方法语句
(ADO)在与数据库进行传递接收数据时候的一些问题:
SqlConnection --通道-路
SqlCommand --1.传递命令到服务器 2.接收从服务器返回的数据
数据操作只有四种:下面是方法
增加删除修改:
返回N行受影响 ExecuteNonQuery();(Exucute 执行 Non空 Query查询 就是不执行查询,那就剩下增删查改了)
查询:
1.多行多列结果集 ExcuteReader--SqlDataRreader
2.单个值 ExecuteScalar() __结果集第一行第一列值--object
以上三种方法均是ADO.NET中COMMAND对象的方法;

重要:
参数化查询:在设计与数据库链接兵交互数据时,在需要填入数值或数据的地方,使用参数来给值,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL Injection) 的攻击手法的防御方式;
以前的交互数据的代码,使用拼接:string sql = "select COUNT(*) from Person where PLoginName='" + name + "' and PPwd='" + pass + "'";
参数化查询例子:
SqlCommand comm = new SqlCommand();
comm.Connection=conn;//此处添加入链接语句的对象,才能实现对数据库的连接;
//参数化查询,这个方法目前已被视为最有效可预防SQL注入攻击 (SQL Injection) 的攻击手法的防御方式
comm.CommandText = "select COUNT(*) from Person where PLoginName=@Name and PPwd=@Pass";
comm.Parameters.AddRange(
new SqlParameter[] {
new SqlParameter("@Name",SqlDbType.VarChar) { Value="name"},
new SqlParameter("@Pass", SqlDbType.VarChar) {Value="pass" }
}
);
return comm.ExecuteScalar();
补充:
错误认识2.参数化查询时是否指定参数类型、参数长度没什么区别:
为了提高sql执行速度,请为SqlParameter参数加上SqlDbType和size属性,在参数化查询代码编写过程中很多开发者忽略了指定查询参数的类型,这将导致托管代码在执行过程中不能自动识别参数类型,进而对该字段内容进行全表扫描以确定参数类型并进行转换,消耗了不必要的查询性能所致。
示例:
comm.Parameters.Add(new SqlParameter("@UserName", SqlDbType.VarChar,50) { Value = "username" });
string sql = "select pid,pcid,ptype,ploginname,pcname,ppwd,pgender,pemail,pareas,pisdel,paddtime from person where ploginname=@name and pisdel=@isdel";
SqlParameter p = new SqlParameter("@name", name);
SqlParameter p2 = new SqlParameter("isdel",false);
SqlDataReader reader = SqlHelper.ExecuteReader(sql,p,p2); **//params SqlParameter[] ps 这一句要加入到调用的SqlDateReader ExecuteReader()当中
SqlParameter这个命令参数可以说是参数化查询的重中之重(个人见解)

浙公网安备 33010602011771号