3.设计数据存储策略:ADO.NET 2.0及其他

来源:互联网 发布:网络言论自由有度作文 编辑:程序博客网 时间:2024/05/16 08:18

使用DataReader
– 相对简单的调用方式
– 同Command对象配合
– 适用相对简单的数据环境

使用DataSet
- 离线数据类型
- 同DataAdapter配合
- 适用复杂的数据环境

无论使用什么数据源控件,都会添加bindingsource控件,对数据进行封装 。
UI层是不能越过业务逻辑层,直接对数据层进行访问,而是通过存储过程、视图或者自定义函数进行访问。
同样,数据层也不会直接对数据库进行访问,而是通过数据组件进行访问。


publick class student
{
 public stirng _name;
 public int _id;
 public int _age;
}
数据直接暴露在外面,因此,必须对数据进行封装,修改为属性。
private string _name;
public int Name
{
 get {return int _id;}
}
同样可以添加对属性的设置条件
private int _age;
public int age
{
 get {return _age}
 set
 {
 if(value >0 && value <100)
   _age =value;
 else
   //抛出异常 
 }
}


接下来可以对数据进行读取,可以用下面的代码:
void student()
{
  SqlConection conn = new ...;
  sqlDatacommand sqlcmd = ...
  sqlDatareader reader = ...
  string strcmd = "select ....."
  //接下来就可以对数据进行读取等操作
}
但是,直接把数据读取写在逻辑层中,会导致紧耦合,如数据进行修改,就必须对代码进行全部修改。
interface IDBProvider
{
 void GetStudent(student s);
 void savestudent(student s);
}

public class sqlDBProvider:IDBProvider
{
 void GetStudent(student s);
 void savestudent(student s);
}

public class AcessDBProvider:IDBProvider
{
 void GetStudent(student s);
 void savestudent(student s);
}


这样,我们通过接口对student数据进行读取,而当要数据发生变化时,如要采用Oracle数据库,我们只需要增加:
public class OracleDBProvider:IDBProvider
{
 void GetStudent(student s);
 void savestudent(student s);
}
而接口保持不变,因此,业务逻辑层不需要发生变化。

student函数可以修改为如下代码:
void student(IDBProvider dbp)
{
 dbp.GetStudent(this); 
 .... ...
}
我们就可以新建student对象:
student s1 = new student((IDBProvider)new sqlDbProvider())
下面就可以对该student对象使用,而不需要关系他是什么类型的数据库。

其实,我们还可以把要访问的数据组件或者名称写到config文件中,然后用
Appsetting.getresource来把字符串读取出来,然后用.net中的类工厂反射,
Assembly.load(....),new typeof(..)来实现完全的松散耦合。


提高数据库性能:
----硬盘、CPU
----建立索引,采用存储过程,这些都是编译的代码,在执行时,能够提高性能
----层次不要太多,层次多,耦合少,但是性能会降低。在层次和性能上要做出折衷。 

原创粉丝点击