ASP.Net提供了三个数据控件,;这三个控件属于数据Web控件,分别是DataGrid,DataList和Repeater。

ASP.Net提供了三个数据控件,使得原本在ASP中繁杂的工作变得简单。
这三个控件属于数据Web控件,分别是DataGrid,DataList和Repeater。
一般都是从datagrid开始的(至少我是这样开始的),每种数据控件
都有其自身的缺陷,因此在程序设计中并不存在最完美的选择。你必
须权衡三种控件的优缺点并决定哪一种更加适合你的程序。

三者共同点
1。都是用来显示数据
2。都需要来进行绑定
dataWebControlID.DataSource=someDataSource
dataWebControlID.DataBind()
someDataSource 一般是指数据控件的数据源,包括dataset,SqlDataReader
OleDbDataReader或一组数据
DataBind() 遍历一个特点的DataSource中的记录,并对其中的每条
记录,建立一个对应的Item集。数据控件中的每条记录将成为一个实例。
例如,DataGrid中的每个条目是DataGridItem类的一个实例,而Repeater
中的条目则是RepeaterItem类的一个实例。
3。每种控件都被允许使用模板显示数据。
不同点
DataList 和 Repeater 控件必须使用
模板来输出数据,DataGrid允许通过TemplateColumn 而只使用模板来显示一列
DataList放弃了DataGrid中列表显示数据的概念,而是使用事先定义好的模板
(Template)来定制显示:
<asp:DataList runat="server" id="myDataList">
     <ItemTemplate>
     <%# DataBinder.Eval(Container.DataItem, "CompanyName") %>
   </ItemTemplate>
   </asp:DataList>

ItemTemplate还支持其它其它6种模板:
   ·AlternatingItemTemplate
   ·EditItemTemplate
   ·FooterTemplate
   ·HeaderTemplate
   ·ItemTemplate
   ·SelectedItemTemplate
   ·SeparatorTemplate
 通过EditItemIndex模板和EditCommand,UpdateCommand以及CancelCommand
事件,DataList将支持记录编辑的功能。
DataList的性能要比DataGrid好一些,特别是当DataList被包含在Form当中时
Repeater控件
Repeater控件是三种数据控件中在HTML输出方面最为灵活的控件,使用模板来
指定输出样式。Repeater支持如下五种模板:
   ·AlternatingItemTemplate
   ·FooterTemplate
   ·HeaderTemplate
   ·ItemTemplate
   ·SeparatorTemplate
Repeater类不是继承自WebControl类的,这一点与DataGrid和DataList不同。
Repeater唯一优于DataGrid和DataList的特点是它的性能,尤其明显优于DataGrid

DataGrid提供了最多的功能,如允许访问者对记录编辑、排序或分页。同时它也是
最容易使用的,甚至于简单到只需要将之添加到页面中而不必额外编写代码。不过
这些易用性是以性能的损失为代价的。DataGrid在三种控件中是效率最低的,特别
是在使用Web Form的情况下。

  通过使用模板,DataList提供了比DataGrid更加优秀的界面效果。不过这需要以牺
牲一定的开发时间为代价。为了添加排序、分页和编辑功能,程序员不得不花费比
使用DataGrid更多的精力来进行编码,虽然它的性能要优于DataGrid。

  最后,Repeater允许对数据记录作最大限度的HTML定制。通常,使用Repeater来显
示数据记录比使用DataGrid和DataList要耗费更长的开发时间。另外,它不支持内
建的编辑、排序和分页功能。所幸的是,Repeater在性能上要优于其它两种控件,
特别是明显优于DataGrid。

- 作者: 高首 2005年03月8日, 星期二 17:46  回复(0) |  引用(0) 加入博采

1 FreeTextBox 1.6.3 中文版

中文版:http://www.percyboy.com/w/ftb/
(最近有些忙,让大家久等了。)

发表于 Tuesday, November 25


中文版:http://www.percyboy.com/w/ftb/
(最近有些忙,让大家久等了。)

发表于 Tuesday, November 25

- 作者: 高首 2005年03月7日, 星期一 02:25  回复(0) |  引用(0) 加入博采

1 微软开发者系列讲座下载
本页内容
1、Windows窗体应用程序开发1、Windows窗体应用程序开发
2、Delegates and Events2、Delegates and Events
3、XML与SOAP3、XML与SOAP
4、.NET数据库高级应用:数据缓存;连接池管理;分布式事务4、.NET数据库高级应用:数据缓存;连接池管理;分布式事务
5、WEB Service高级应用5、WEB Service高级应用
6、NET中的I/O管理:Data Streams and Fils6、NET中的I/O管理:Data Streams and Fils
7、ADO.NET访问Oracle数据库7、ADO.NET访问Oracle数据库
8、.NET 组件开发8、.NET 组件开发
9、.NET序列化9、.NET序列化
10、与非托管代码交互操作10、与非托管代码交互操作
11、.NET Remoting

11、.NET Remoting

http://www.microsoft.com/china/msdn/events/featureevents/2004/MSDevTrainingCourse.mspx


1、Windows窗体应用程序开发

VS.NET IDE是一个高度可视化,集成和高效的开发环境。她能提供设计、开发、调试和部署Windows应用程序和Web应用程序所需的各种工具。比起VS6.0,她又提供了许多功能强大的组件并采用了很多新的特性,使得开发人员能够轻松简单高效的创建Windows窗体应用程序。

本讲座主要介绍VS.NET2003的新控件和新特性,包括ContextMenu, ToolTip, Splitter, NotifyIcon在内的一系列新控件的使用方法和诸如Anchoring,Docking等一些新的特性。并讨论了如何在VS.NET中集成原有的ActiveX控件,如何进行可视化的继承和怎样开发多文档界面的应用程序。

 

2、Delegates and Events

Microsoft .NET框架使用一种称为Delegate代理的技术来提供回调函数机制,从而极大地增加了应用程序的灵活性。同时,代理还集成了按序调用多个方法的能力,并且同时支持调用静态方法和实例方法。

本讲座详细解释了代理实现的机制及如何声明、实例化和使用代理,并在此基础上引入了单播代理和多播代理、代理链的概念。最后,介绍了事件的实现机制。

 

3、XML与SOAP

XML是一种具有良好开放性、简单性和可扩展性的语言,它能够用来描述非结构化的数据,目前现在广泛的应用于企业应用集成、电子商务和数据交换领域。XML与HTTP是SOAP简单对象访问协议的基础。SOAP主要用于基于Internet环境下的远程过程调用,它使用HTTP协议进行传输,因此较好的解决了跨越企业防火墙的问题,

本讲座主要介绍了XML的概念,语法,XML Schema,XML文档的定义和验证,XML的解析器,XSLT扩展样式语言、XPath等一系列XML相关的内容,并在此基础上简要的介绍了SOAP协议及其实现过程。

 

4、.NET数据库高级应用:数据缓存;连接池管理;分布式事务

数据库访问的性能总是开发人员非常关心的问题。本讲座主要介绍了使用ADO.NET访问数据库的高级应用技术,包括ADO.NET中的连接池管理,各种策略的数据缓存,两种在.NET中实现事务的机制,并讨论了如何实现分布式事务以及优缺点。

 

5、WEB Service高级应用

Web Service是一种新型的Web应用程序。它是自适应、自我描述、模块化的应用程序,这些应用程序可以跨越Web进行发部、定位和调用。Web Service所执行的功能可以是从简单的请求到复杂的商业过程中的任何事。简单的Web Service可以提供股票报价或处理信用卡交易。一旦部署了 Web Service,其它的应用程序可以发现和调用该Web Service。Web Serivce的开发涉及到相当多的技术,包括XML、SOAP、WSDL、UDDI等。

本讲座深入浅出的介绍了Web Service概述和体系结构,如何开发和使用Web Service,以及如何使用Web Service作为数据访问层组件的数据提供者返回复杂的数据类型。最后介绍了Web Service高级开发技术,Web Service Enhancement相关的内容,包括如何对SOAP消息进行加密、签名等。

 

6、NET中的I/O管理:Data Streams and Fils

.NET很好的封装了与数据流和文件操作有关的类,如Stream、FileStream、File、FileInfo等类,并提供了诸如FileSystemWatcher文件系统监控器组件来对文件进行实时的监控与管理。

本讲座主要介绍了.NET中与数据流和文件操作相关的内容,首先介绍了流的概念,接着介绍了如何使用Reader和Writer对象来操作流。最后结合实例对.NET中与文件操作相关的一些基本的类和组件及其使用方法进行了阐述。

 

7、ADO.NET访问Oracle数据库

在ADO.NET中访问Oracle数据库基本的原理与访问SQL Server数据库相同,这个得益于一个专门为Oracle数据库开发的Microsoft .NET Framework Data Provider for Oracle组件,该组件为我们使用.NET访问Oracle数据库提供了极大的方便。 使得那些使用.NET和Oracle的开发人员再也不必使用那个并不十分"专业"的OLEDB来访问Oracle数据库了。

本讲座主要介绍了如何使用Microsoft .NET Framework Data Provider for Oracle组件提供的OracleConnection、OracleCommand、OracleDataReader对象来操作Oracle数据库,并重点介绍了如何访问Oracle数据库中的特殊数据类型以及如何执行Oracle中的储存过程,这个与执行SQL Server的存储过程之间存在相当大的不同。

 

8、.NET 组件开发

组件的开发提供了代码的可重用性,使得应用程序的开发可以像搭积木一样简单和方便。在.NET下可以方便的开发出组件,并可以将其用在控制台应用程序、Windows应用程序、Web应用程序甚至是SmartPhone、Pocket PC上。

本讲座在介绍了.NET Framework开发技术的基础上结合实例介绍了创建和使用.NET组件的步骤和方法。

 

9、.NET序列化

序列化是一个把类的实例转换成一个文件或XML格式的数据流的过程,反序列化则相反。.NET对于序列化的操作进行很好的封装,在.NET下能够非常方便把一个对象序列化成文件或者XML文件。

本讲座主要介绍了序列化的概念、属性,如何把一个或一组具有层次结构的对象序列化成文件,解释了序列化的过程,并举例说明如何执行序列化和反序列化,在讲座的最后,讨论了与序列化相关的安全性的问题。

 

10、与非托管代码交互操作

传统的COM组件和Windows32 API在.NET平台下过时了吗?回答是否定的。许多现存的COM组件和Win32 API在.NET代码中仍然是可用的宝贵资源,.NET对访问这些资源提供了一系列支持,使得这些组件不必重写就能应用于.NET应用程序中。

本讲座全面的介绍了在.NET中调用COM组件和非托管的DLL函数的原理及机制,特别阐述了如何传递结构、类等参数和DLLImport属性的重要选项,并演示了如何向.NET公开COM组件和使用Win32 API。

 

11、.NET Remoting

.NET Remoting提供了一种允许对象通过应用程序域与另一对象进行交互的框架。通过.NET Remoting,两个应用间的通信将变得非常简单,使用上也相当灵活。

本讲座由浅入深的介绍了.NET Remoting的开发技术,首先介绍了Remoting技术的一些基本概念,如远程对象、序列化、客户端和服务器端的激活模式等,其次,详细解释了Remoting的实现机制以及如何使用Remoting技术来设计和实现分布式应用程序,最后通过一个具体的Demo来展示在.NET中实现远程通信是多么的简单。

 

下载 下载 下载 下载 下载 下载 下载 下载 下载 下载 下载

- 作者: 高首 2005年01月24日, 星期一 20:56  回复(0) |  引用(0) 加入博采

1 一个经典的ADO.NET入门例子

众所周知,ADO.NET相对于ADO的最大优势在于对于数据的更新修改可以在与数据源完全断开联系的情况下进行,然后再把数据更新情况传回到

数据源。这样大大减少了连接过多对于数据库服务器资源的占用。下面是我在《ADO.NET实用指南》这本书上看到的一个例子,比较清楚的讲解

了ADO.NET的使用方法。


Imports System.Data.SqlClient
Imports System.Data
Imports System.Data.Common

Public Class Form1
Inherits System.Windows.Forms.Form

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim conn As New SqlConnection("data source=localhost;initial catalog=StudentCourse;" & _
"User ID=;Password=;")
Dim ds As New DataSet
Try
conn.Open() '在形成SqlDataAdapter前打开conn
Dim daAuthors As New SqlDataAdapter("Select * From SC", conn)
Dim bldr As New SqlCommandBuilder(daAuthors)
daAuthors.Fill(ds,"SC")
conn.Close() '在填充完ds后关闭连接,接着对ds进行操作

Dim tbl As New DataTable
tbl = ds.Tables("SC")

Dim rowVals(3) As Object
rowVals(0) = "5"
rowVals(1) = "00003"
rowVals(2) = "0001"
rowVals(3) = 99
Dim insertedRow As DataRow
insertedRow = tbl.Rows.Add(rowVals) '添加一行

tbl.Rows(0).Delete() '删除一行

tbl.Rows(1).BeginEdit()
tbl.Rows(1)("score") = 89 '修改一行
tbl.Rows(1).EndEdit()

conn.Open()
daAuthors.Update(ds.Tables("SC")) '须将结果传回数据源时打开连接,update
conn.Close()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
End Class


- 作者: 高首 2005年01月20日, 星期四 01:01  回复(0) |  引用(0) 加入博采

1 Visual Studio 2005 Express Beta 使用
第一次使用vs, 由于偶的本本太老啦 不敢装太大的东西 所以以前做项目全部用dw的


后来从网上发现啦vc# 高兴的不得了 想着终于可以不装vs就用啦 嘿嘿
后来研究了老长时间就是不知道如何用vc#建立web应用程序
郁闷了好久 到csdn发贴子问高手 能否用vc#建立web应用程序 高手们回答俺
可以 。。。。。。当时真的怀疑我的智商是不是有问题 他们说能 我为什么没有
找到在那里那
今天终于解决啦
用vc#只能建立winform,要建webform是不行的
如果大家喜欢可以到网站下载Visual Web Developer 2005 Express Editio 才可以

大家到网上找一下 肯定能找到下载地址的

 

- 作者: 高首 2005年01月10日, 星期一 01:21  回复(1) |  引用(0) 加入博采

1 virtual这个关键字
在C#中,如果你在声明一个方法的时候用了virtual这个关键字,那么,在派生类中,你就可以使用override或者new关键字来弃用它或是忽略它.如果你在父类中用了virtual这个关键字,而在其派生类中又没有用override或new关键字,而直接引用一个同名方法的话,编译器将会报错,并将以new方式,即忽略派生类中的方法的方式来运行.下面的例子可以帮助你来理解:

 


000: // Versioning/versioning.cs
001: public class MyBase
002: {
003: public virtual string Meth1()
004: {
005: return "MyBase-Meth1";
006: }
007: public virtual string Meth2()
008: {
009: return "MyBase-Meth2";
010: }
011: public virtual string Meth3()
012: {
013: return "MyBase-Meth3";
014: }
015: }
016:
017: class MyDerived : MyBase
018: {
019: public override string Meth1()
020: {
021: return "MyDerived-Meth1";
022: }
023: public new string Meth2()
024: {
025: return "MyDerived-Meth2";
026: }
027: public string Meth3() // 系统在这里将会有一个警告,并且将会隐藏方法Meth3()
028:
029:
030: {
031: return "MyDerived-Meth3";
032: }
033:
034: public static void Main()
035: {
036: MyDerived mD = new MyDerived();
037: MyBase mB = (MyBase) mD;
038:
039: System.Console.WriteLine(mB.Meth1());
040: System.Console.WriteLine(mB.Meth2());
041: System.Console.WriteLine(mB.Meth3());
042: }
043: }

输出:

MyDerived-Meth1
MyBase-Meth2
MyBase-Meth3
可以很明显地看出来,后两个new关键字的输出是父类中的方法的输出,所以可以看出,new这个关键字的作用是如果在以前的版本中有这个方法,就沿用以前的方法,而不用我现在方法内容.而virtual的方法的作用正好相反,它的作用是如果在父类中有这样一个方法,则用我现在写的方法内容,让以前的滚蛋!不过,这里用new好象不太好,让人误解(糟了,盖痴又要打我了!&*%$#@).

如果你把第037行去掉,把039-041中的mB全部改为mD,输出又变为:

MyDerived-Meth1
MyDerived-Meth2
MyDerived-Meth3

这又说明了什么呢,说明了派生类的对象只有在被父类重塑的时候,override和new关键字才会生效.呵呵,这样说的确有点难以理解,大家只有自己动手,才能搞清楚这其中的机关,所谓"实践是检验C#的唯一标准",哈哈!

在C#中,你可以自由地为在派生类中为加入一个方法,或者覆盖父类的方法,如下所示,非常地简单:

class Base {}
class Derived: Base
{
public void F() {}
}
和:

class Base
{
public void F() {}
}
class Derived: Base
{
public void F() {}
}

- 作者: 高首 2005年01月4日, 星期二 16:58  回复(0) |  引用(0) 加入博采

1 petshop研究 1
petshop3.0研究
注册系统(CreateAccount.aspx)


昨天我们先从大体上研究了petshop的框架(是从网上找的,嘿嘿,因为我也是个新手,很多东西
都需要从网上翻)
petshop3.0的注册页面是createaccount.aspx,可以看到CreateAccount.aspx的注册是由三部分
组成的My Account, My Address, My Preferences
My Account 是由 是CreateAccount.aspx页面自带的,为:
User ID,Password,E-mail Address三个属性
My Address 和My Perferences 是分别由
<Controls:addressui id="addr" runat="server" />和
<Controls:preferences id="prefs" runat="server"/>两个控件控制的
下面我们研究一下 <Controls:addressui id="addr" runat="server" />
在controls文件夹下有addressui.ascx,该文件是firstname.......的注册窗体,其codebehind代
码作用是获得一个addressinfo对象,。方法是(详细见createAccount.aspx.cs)
1。建立address对象 AddressInfo address = addr.Address;
2。AccountInfo accountInfo = new AccountInfo(userId, password, email, address, language, favCategory, showFavorites, showBanners);
petshop的解释是 // Store all the customers information in an account business entity

ProcessFlow.AccountController accountController = new ProcessFlow.AccountController();
调用ProcessFlow.AccountController的createaccount方法来完成注册
3。if (!accountController.CreateAccount(accountInfo))
{
// Tell the user they have failed to create an account
valUserId.ErrorMessage = MSG_FAILURE;
valUserId.IsValid = false;
}CreateAccount接收的参数自然是一个AddressInfo类型的对象,返回类型为bool。通过它来
判断是不是正确添加了用户
4。业务实体AccountInfo一层的往下传,最后到达SQLServerDAL层,这里的Insert方法执行最后的操作。
PetSop.Web.ProcessFlow.AccountController : (嘿嘿,为了这么点东西费好多劲,我尽量把我
所知道的写详细,以便大家参考,不对之处请指正,有些地方我也不是很清楚,还要慢慢研究)

public bool CreateAccount(AccountInfo newAccountInfo){

try {
// Creata a new business logic tier
Account account = new Account();

// Call the insert method
account.Insert(newAccountInfo); 调用PetShop.BLL.Account : insert方法 如(5。)

// Store the data in session state and store the authenticated cookie
HttpContext.Current.Session[ACCOUNT_KEY] = newAccountInfo;
FormsAuthentication.SetAuthCookie(newAccountInfo.UserId, false);

file://Finally forward to the welcome page
HttpContext.Current.Response.Redirect(URL_ACCOUNTCREATE, true);

}catch {
return false;
}

return true;
}
file://注意在这里捕获异常,说明用户名已存在。详细描述见下面
catch
{
return false;
)
return true;
}

5。insert方法如下
/// <summary>
/// A method to insert a new Account
/// </summary>
/// <param name="account">An account entity with information about the new account</param>
public void Insert(AccountInfo account) {

// Validate input
if (account.UserId.Trim() == string.Empty)
return;

// Get an instance of the account DAL using the DALFactory
IAccount dal = PetShop.DALFactory.Account.Create();

// Call the DAL to insert the account
dal.Insert(account);
}
6。调用DalFactory.Account.create()方法,读取数据库路径
public static PetShop.IDAL.IAccount Create()
{
/// Look up the DAL implementation we should be using
string path = System.Configuration.ConfigurationSettings.AppSettings[ "WebDAL"];
string className = path + ".Account";

// Using the evidence given in the config file load the appropriate assembly and class
return (PetShop.IDAL.IAccount) Assembly.Load(path).CreateInstance(className);
}
7。
最后进入实际的数据操作层

PetShop.SQLServerDAL.Account :
public void Insert(AccountInfo acc) {
SqlParameter[] signOnParms = GetSignOnParameters();
SqlParameter[] accountParms = GetAccountParameters();
SqlParameter[] profileParms = GetProfileParameters();

signOnParms[0].Value = acc.UserId;
signOnParms[1].Value = acc.Password;

SetAccountParameters(accountParms, acc);
SetProfileParameters(profileParms, acc);

using (SqlConnection conn = new SqlConnection(SQLHelper.CONN_STRING_NON_DTC)) {
conn.Open();
using (SqlTransaction trans = conn.BeginTransaction()) {
try {
SQLHelper.ExecuteNonQuery(trans, CommandType.Text, SQL_INSERT_SIGNON, signOnParms);
SQLHelper.ExecuteNonQuery(trans, CommandType.Text, SQL_INSERT_ACCOUNT, accountParms);
SQLHelper.ExecuteNonQuery(trans, CommandType.Text, SQL_INSERT_PROFILE, profileParms);
trans.Commit();

}
file://违反约束,抛出异常
catch {
trans.Rollback();
throw;
}
}
}
}
由于水平有限,确实写不出什么高深的东西,有兴趣的话,大家共同讨论

- 作者: 高首 2004年12月29日, 星期三 02:45  回复(0) |  引用(0) 加入博采

1 petshop研究
先到 http://msdn.microsoft.com/library/en-us/dnbda/html/bdasamppet.asp 下载petshop3.0

 

具体的.NET Project实现列表
Project Purpose

BLL Home for business logic components

ConfigTool Administration application used to encrypt connection strings and create event log source

DALFactory Classes used to determine which database access assembly to load

IDAL Set of interfaces which need to be implemented by each DAL implementation

Model Thin data classes or business entities

OracleDAL Oracle specific implementation of the Pet Shop DAL which uses the IDAL interfaces

Post-Build Project to run post compile actions such as adding assemblies to the GAC or COM+

Pre-Build Project to remove assemblies from the GAC or unregister assemblies from COM+

SQLServerDAL Microsoft SQL Server specific implementation of the Pet Shop DAL which uses the IDAL interfaces

Utility Set of helper classes including a wrapper for the DPAPI

Web Web pages and controls

Solution Items Miscellaneous items used to build the application such as Pet Shop.snk key file used to sign application assemblies

一:Data Access Layer:
1 PetShop.Utility如下
ConnectionInfo.cs
DataProtector.cs
AssemblyInfo.cs
这个名字空间有三个类一个是ConnectionInfo用于加密解密数据库连接信息,另一个DataProtector调用了
Crypt32.dll和kernel32.dll实现一些底层数据安全操作,这个类要在下面的PetShop.XXXDAL名字空间中调用
,可见Petshop.Utility只是起到的是数据访问辅助工具的作用。
2 PetShop.SQLServerDAL ――系统结构图中DAL层中的SqlServer DAL子层实现
SqlHelper类实际上是封装了关于此系统中数据库操作访问的一些常用功能,其中它还会调用上面的PetShop.Utility中的ConectionInfo类方法加密解密连接字符 串。Account类对用户帐户进行操作如Insert,Update,SignIn,其中这些对数据库的操作,使用了上面的SqlHelper类来实现。
3 PetShop.IDAL 数据访问接口――对应系统结构图中DAL Interface
接口是一种系列‘功能'的声明或名单,接口没有实现细节,如下接口IAccount定义也可以看出IAccount只有声明:

using System;

using PetShop.Model;

 

namespace PetShop.IDAL

{

// Inteface for the Account DAL

public interface IAccount

{

// Authenticate a user

AccountInfo SignIn(string userId, string password);

/// Get a user's address stored in the database

AddressInfo GetAddress(string userId);

/// Insert an account into the database

void Insert(AccountInfo account);

/// Update an account in the database

void Update(AccountInfo Account);

}

}

 

您只需要调用接口,而不用管接口是如何实现的那么接口没有实现,调用它有什么用?实际上接口的实现是由某个类来做的,那么这里的IAccount接口是由PetShop.SqlServerDAL.Account类或是PetShop.OracleDAL.Account类来实现的,从他们的定义可以看到:

public class Account : IAccount {.......}

5 PetShop.DALFactory 数据访问工厂
MSPetShop3.0用工厂模式来实现了对SqlServer和Oracle数据库访问的操作,而用户(business Logic Layer)不用知道也不用关心后台用的是哪一种数据库,它只要用接口就行了,接口中定义了要用的方法,当调用接口时会根据具体的情况再去调用底层数据访问操作。而现在这个DALFactory就是关键,当BLL层要操作数据库时,DALFactory会根据具体情况再去使用本文上面介绍的SqlServerDAL和OracleDAL中的一个。这样系统上层只管调用,而下层来实现细节,上级只管发号施令,下级去干活。对于上层来说实现细节被隐藏了。
以下是PetShop.DALFactory.Account类的实现:

namespace PetShop.DALFactory {

 

/// <summary>

/// Factory implementaion for the Account DAL object

/// </summary>

public class Account

{

public static PetShop.IDAL.IAccount Create() file://<<<<ß----这里返回接口

{

/// Look up the DAL implementation we should be using

string path = System.Configuration.ConfigurationSettings.AppSettings["WebDAL"];

string className = path + ".Account";

 

// Using the evidence given in the config file load the appropriate assembly and class

return (PetShop.IDAL.IAccount) Assembly.Load(path).CreateInstance(className);

}

}

}

以下则是web.config中<appSettings>节点中的一部分:

<add key="WebDAL" value="PetShop.SQLServerDAL" />

<add key="OrdersDAL" value="PetShop.SQLServerDAL" />

<add key="Event Log Source" value=".NET Pet Shop" />

上面的Create()方法返回IAccount接口,用System.Configuration.ConfigurationSettings.AppSettings["WebDAL"];则可以得到Web.config的<appsettings>节点中的关于系统中应该使用哪个数据访问层(SqlserverDAL还是OracleDAL)的信息。因为我在安装PetShop3.0时选择的是Sqlserver所以在此是:value="PetShop.SQLServerDAL",如果用的是Oracle那就是value="PetShop.OracleDAL" 了吧!而且这个文件也应该是可以更改的。接下来className=path+".Account"返回的应该是PetShop.SQLServerDAL.Account,然后再用Assembly.Load加载PetShop.SQLServerDAL.dll,同时创建PetShop.SQLServerDAL.Account的实例,并以接口(PetShop.IDAL.IAccount)类型返回。这样BLL调用IAccount接口时就会用PetShop.SQLServerDAL.Account类的实现代码。
6 PetShop.ConfigTool
PetShop/ConfigTool/中有一个app.config文件,看一下其中内容,分别定义了两种数据库的联接字符串,在app.config中有一行 <add key="WebConfigFileLocation" value="Web/Web.config" /> 则标识出给asp.net程序使用的web.config配置文件的相对位置。然后看一下PetShopConnectionString的EncryptConnectionString方法的源码,这个类中先是从当前目录的app.config文件中读出web.config文件的位置,如下:

public static readonly string CONFIGFILE = ConfigurationSettings.AppSettings["WebConfigFileLocation"];

 

然后语句

XmlDocument doc = new XmlDocument();

doc.Load(CONFIGFILE);

加载Web.config文件,最后将加密的连接字符串写入Web.config对应的XML节点中
7 PetShop.Model 业务实体模型
类似现在所说的O-R MAPPING,但O-R MAPPING比这种简单的数据到对象的持久化要复杂。据说可以在表结构有变化的情况下,上层应用程序代码不用更改,只要改O-R MAPPING的相关设置就可以了。

上面第2节中已看到Petshop的SqlServerDal和OracleDal中定义的sql语句,然后根据上层的调用,把sql语句传给SqlHelper执行,再来看看SqlServerDal的一段程序:

private void SetAccountParameters(SqlParameter[] parms, AccountInfo acc) {

parms[0].Value = acc.Email;

parms[1].Value = acc.Address.FirstName;

parms[2].Value = acc.Address.LastName;

parms[3].Value = acc.Address.Address1;

parms[4].Value = acc.Address.Address2;

parms[5].Value = acc.Address.City;

parms[6].Value = acc.Address.State;

parms[7].Value = acc.Address.Zip;

parms[8].Value = acc.Address.Country;

parms[9].Value = acc.Address.Phone;

parms[10].Value = acc.UserId;

}

parms[x]就是那些有声明为常量的有参数的Sql语句中的参数,这里用Model中的AccountInfo的各Field和这些参数Mapping。所以对于BLL层,只知道这些Model就可以了,反正最后在SqlServerDAL或是OracleDAL中Model的成员们会Mapping到参数中以存取数据库(为什么不直接Mapping到数据集的字段呢?我想应该是因为这里数据库操作直接给SqlHeper的原因,不然就没必要用SqlHelper了。于是才又多了图中的xxx DAAB层,这样Mapping给参数再传给DAAB来处理)

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值