数据库操作

数据库操作:ADO.NET

一:需要用到命名空间:using system.Data;和 using system.Data.SqlClient;

using system.Data.OleDb或ODBC是通用的数据访问类,所有数据库都可以用OleDb,SqlClient针对SQL优化的数据访问类。

ODBC--open database connection 开放式数据互联。(慢,需要配置,现在基本不用了,一般是用OleDb)。

二:步骤

1.编写连接字符串,建立连接对象:建一个通向数据库的通道。

2.打开通道

3.操作数据库

4.关闭通道

三:类及使用

连接字符串:server=.;(本机) database=mydb;(数据库名) uid=sa;(用户名) pwd=123;(密码)

分号隔开,不加引号,如果没密码等号结束就可以了

(一)连接对象:SqlConnection:连接数据库的类

1.构造函数:SqlConnection();或SqlConnection(connectionString);

2.属性:ConnectionString和state

3.方法:打开open() 关闭close()
conn.CreateCommand();生成一个通过本链接对象来访问数据库的SqlCommand实例。

可以这样用:SqlCommand cmd = conn.CreateCommand();

(二) 命令对象

SqlCommand:数据库操作的命令对象

1.构造函数
SqlCommand(); 推荐
SqlCommand(sql)
SqlCommand(sql,连接对象)

2.属性
CommandText:字符串类型,要执行的SQL命令(SQL语句,存储过程)
commandType: 枚举类型,CommandType.Text执行的是SQL语句,CommandType.StoredProcedure执行的是存储过程
Connection:SqlConnection类型,通过哪个连接访问数据库
Parameters:为SQL命令里的局部变量赋值

3.方法
ExecuteNonQuery();执行增删改的方法,返回影响的行数
ExecuteReader();执行查询的方法,返回SqlDataReader对象,用来执行查询。
ExecuteScalar();返回首行首列object类型,一般用于执行统计查询

(三)读取器对象

获得数据库中的数据,它在内存中只占用一条数据的空间。SqlDataReader

1.构造函数:
构造函数不是public,无法new出来。它只有一种实例化方式:SqlDataReader dr = cmd.ExecuteReader();

2.属性:
HasRows:返回bool型数据,判断读取器是都能读出数据

3.方法:
Read();读一行,然后指向下一行
Read();把数据读取到SqlDataReader对象中来,如果成功返回true,如果失败返回false;
dr["列名"] dr["索引号"] :读取内存中当前SqlDataReader对象中的某列数据,读出来是Object类型。
dr.GetString(索引号), dr.GetInt(索引号); 也是读,用的少
close();关闭读取器。

四:SQL注入攻击:

原理:用户可以巧妙的编写一段输入代码,与程序中的SQL语句产生匹配,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL注入。
规避办法:
1.单引号替换为双引号。
2.修改查询语句,使用SQLsever的局部变量来传递参数(cmd.Parameters.AddWithValue)
cmd.Parameters.AddWithValue(局部变量,参数)

五:如何调用存储过程?
1.把commandText赋为存储过程的名;
2.把commandType赋为CommandType.StoredProcedure;
3.使用cmd.Parameters.AddWithValue()为存储过程参数赋值。

六:面向对象设计的六大原则:
1.单一职责:就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因。
2.里氏代换:很严格的原则,规则是子类必须能够替换基类,否则不应当设计为其子类。也就是说,子类只能去扩展基类,而不是隐藏或覆盖基类。
3.依赖倒转:“设计要依赖于抽象而不是具体化”。换句话说就是设计的时候我们要用抽象来思考,而不是一上来就开始划分我需要哪些哪些类,因为这些是具体。
4.开闭原则:对扩展开放,对修改关闭。
5.接口分离:使用多个专一功能的接口比使用一个的总接口总要好。
6.迪米特法则:对象与对象之间应该使用尽可能少的方法来关联,避免千丝万缕的关系。

七:装箱与拆箱:

值类型数据与引用类型数据间的转换

装箱,值类型变为引用类型:int n = 20; object obj = n; 把数据由栈空间转移到堆空间。
拆箱,引用类型变为值类型:int m = (int)obj; 把数据由堆空间转到栈空间。

有什么坏处?
装箱:占空间,占时间,运行慢。 拆箱:占时间,可能出现类型异常。

八:异常处理:

异常:不一定是错误,与正常情况有差异。
处理异常:
try //试一试
{
可能会出现异常的代码
}
catch (异常类型 异常对象) //捕获
{
一旦发生异常,将会进入此处
对错误信息进行处理,比如写日志文件或者友好显示出来。
}
finally //最终
{
不管上面的执不执行一定会执行,一般写关闭数据库连接
}

九:其它小知识点:

属性简单的写法:public string name(get;set;)

泛型集合:List<>; List<info>; 只能放info的,list出来不用强转,因为它里面必须放指定类型的。

十:数据访问相关类的封装:连接类,实体类,数据访问类

几个类的网盘连接:http://pan.baidu.com/s/1eQnG7pK

原文地址:https://www.cnblogs.com/Alvin-ftd/p/4045628.html