一、数据库
/*==============================================================*/
/* DBMS name: Microsoft SQL Server 2000 */
/*==============================================================*/
if exists (select 1
from sysobjects
where id = object_id('newsContent')
and type = 'U')
drop table newsContent
go
/*==============================================================*/
/* Table: newsContent */
/*==============================================================*/
create table newsContent (
ID int identity(1,1) primary key,
Title nvarchar(50) not null,
Content ntext not null,
AddDate datetime not null,
CategoryID int not null
)
go
二、项目文件架构
实现步骤为:4-3-6-5-2-1
ID | 项目 | 描述 | 用途 | 项目引用关系 | 实例所需文件 | 相关方法 |
1 | Web | 表现层 | Web页和控件 | 引用BLL | WebUI.aspx WebUI.aspx.cs | GetContent() |
2 | BLL | 业务逻辑层 | 业务逻辑组件 | 引用 IDAL,Model,使用DALFactory创建实例 | Content.cs | ContentInfo GetContentInfo(int id) |
3 | IDAL | 数据访问层接口定义 | 每个DAL实现都要实现的一组接口 | 引用 Model | IContent.cs | ContentInfo GetContentInfo(int id) |
4 | Model | 业务实体 | 传递各种数据的容器 | 无引用 | ContentInfo.cs | |
5 | DALFactory | 数据层的抽象工厂 | 创建反射,用来确定加载哪一个数据库访问程序集的类 | 引用IDAL,通过读取web.config里设置的程序集,加载类的实例,返回给BLL使用。 | Content.cs | IDAL.Icontent create() |
6 | SQLServerDAL | SQLServer数据访问层 | Microsoft SQL Server特定的Pet Shop DAL实现,使用了IDAL接口 | 引用 Model和IDAL,被DALFactory加载的程序集,实现接口里的方法。 | SqlHelper.cs Content.cs | SqlDataReader ExecuteReader() PrepareCommand() ContentInfo GetContentInfo(int id) |
OracleDAL | Oracle数据访问层 |
7 | DBUtility | 数据库访问组件基础类 | GetSqlServerConnectionString得到数据库连接字符串,也可省去该项目,在SQLServerDAL.SqlHelper中用static readonly string SqlConnectionString代替。 | 无引用 | | |
实现步骤过程
1、创建Model,实现业务实体。
2、创建IDAL,实现接口。
3、创建SQLServerDAL,实现接口里的方法。
4、增加web.config里的配置信息,为SQLServerDAL的程序集。
5、创建DALFactory,返回程序集的指定类的实例。
6、创建BLL,调用DALFactory,得到程序集指定类的实例,完成数据操作方法。
7、创建WEB,调用BLL里的数据操作方法。
注意:
1、web.config里的程序集名称必须与SQLServerDAL里的输出程序集名称一致。
2、DALFactory里只需要一个DataAccess类,可以完成创建所有的程序集实例。
3、项目创建后,注意修改各项目的默认命名空间和程序集名称。
4、注意修改解决方案里的项目依赖。
5、注意在解决方案里增加各项目引用。
三、各层间的访问过程
1、传入值,将值进行类型转换(为整型)。
2、创建BLL层的content.cs对象c,通过对象c访问BLL层的方法GetContentInfo(ID)调用BLL层。
3、BLL层方法GetContentInfo(ID)中取得数据访问层SQLServerDAL的实例,实例化IDAL层的接口对象dal,这个对象是由工厂层DALFactory创建的,然后返回IDAL层传入值所查找的内容的方法dal.GetContentInfo(id)。
4、数据工厂通过web.config配置文件中给定的webdal字串访问SQLServerDAL层,返回一个完整的调用SQLServerDAL层的路径给 BLL层。
5、到此要调用SQLServerDAL层,SQLServerDAL层完成赋值Model层的对象值为空,给定一个参数,调用SQLServerDAL层的SqlHelper的ExecuteReader方法,读出每个字段的数据赋值给以定义为空的Model层的对象。
6、SqlHelper执行sql命令,返回一个指定连接的数据库记录集,在这里需要引用参数类型,提供为打开连接命令执行做好准备PrepareCommand。
7、返回Model层把查询得到的一行记录值赋值给SQLServerDAL层的引入的Model层的对象ci,然后把这个对象返回给BLL。
8、回到Web层的BLL层的方法调用,把得到的对象值赋值给Lable标签,在前台显示给界面
四、项目中的文件清单
代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->
1
、DBUtility项目 (
1
)connectionInfo.cs
using
System;
using
System.Configuration;
namespace
Utility {
///
<summary>
///
ConnectionInfo 的摘要说明。
///
</summary>
public
class
ConnectionInfo {
public
static
string
GetSqlServerConnectionString() {
return
ConfigurationSettings.AppSettings[
"
SQLConnString
"
]; } } }
代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->
2
、SQLServerDAL项目 (
1
)SqlHelper.cs抽象类
using
System;
using
System.Data;
using
System.Data.SqlClient;
using
DBUtility;
namespace
SQLServerDAL {
///
<summary>
///
SqlHelper 的摘要说明。
///
</summary>
public
abstract
class
SqlHelper {
public
static
readonly
string
CONN_STR
=
ConnectionInfo.GetSqlServerConnectionString();
///
<summary>
///
用提供的函数,执行SQL命令,返回一个从指定连接的数据库记录集
///
</summary>
///
<remarks>
///
例如:
///
SqlDataReader r = ExecuteReader(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
///
</remarks>
///
<param name="connectionString">
SqlConnection有效的SQL连接字符串
</param>
///
<param name="commandType">
CommandType:CommandType.Text、CommandType.StoredProcedure
</param>
///
<param name="commandText">
SQL语句或存储过程
</param>
///
<param name="commandParameters">
SqlParameter[]参数数组
</param>
///
<returns>
SqlDataReader:执行结果的记录集
</returns>
public
static
SqlDataReader ExecuteReader(
string
connString, CommandType cmdType,
string
cmdText,
params
SqlParameter[] cmdParms) { SqlCommand cmd
=
new
SqlCommand(); SqlConnection conn
=
new
SqlConnection(connString);
//
我们在这里用 try/catch 是因为如果这个方法抛出异常,我们目的是关闭数据库连接,再抛出异常,
//
因为这时不会有DataReader存在,此后commandBehaviour.CloseConnection将不会工作。
try
{ PrepareCommand(cmd, conn,
null
, cmdType, cmdText, cmdParms); SqlDataReader rdr
=
cmd.ExecuteReader(CommandBehavior.CloseConnection); cmd.Parameters.Clear();
return
rdr; }
catch
{ conn.Close();
throw
; } }
///
<summary>
///
为执行命令做好准备:打开数据库连接,命令语句,设置命令类型(SQL语句或存储过程),函数语取。
///
</summary>
///
<param name="cmd">
SqlCommand 组件
</param>
///
<param name="conn">
SqlConnection 组件
</param>
///
<param name="trans">
SqlTransaction 组件,可以为null
</param>
///
<param name="cmdType">
语句类型:CommandType.Text、CommandType.StoredProcedure
</param>
///
<param name="cmdText">
SQL语句,可以为存储过程
</param>
///
<param name="cmdParms">
SQL参数数组
</param>
private
static
void
PrepareCommand(SqlCommand cmd, SqlConnection conn, SqlTransaction trans, CommandType cmdType,
string
cmdText, SqlParameter[] cmdParms) {
if
(conn.State
!=
ConnectionState.Open) conn.Open(); cmd.Connection
=
conn; cmd.CommandText
=
cmdText;
if
(trans
!=
null
) cmd.Transaction
=
trans; cmd.CommandType
=
cmdType;
if
(cmdParms
!=
null
) {
foreach
(SqlParameter parm
in
cmdParms) cmd.Parameters.Add(parm); } } } } (
2
)Content.cs类
using
System;
using
System.Data;
using
System.Data.SqlClient;
using
Model;
using
IDAL;
namespace
SQLServerDAL {
///
<summary>
///
Content 的摘要说明。
///
</summary>
public
class
Content:IContent {
private
const
string
PARM_ID
=
"
@ID
"
;
private
const
string
SQL_SELECT_CONTENT
=
"
Select ID, Title, Content, AddDate, CategoryID From newsContent Where ID = @ID
"
;
public
ContentInfo GetContentInfo(
int
id) {
//
创意文章内容类
ContentInfo ci
=
null
;
//
创建一个参数
SqlParameter parm
=
new
SqlParameter(PARM_ID, SqlDbType.BigInt,
8
);
//
赋上ID值
parm.Value
=
id;
using
(SqlDataReader sdr
=
SqlHelper.ExecuteReader(SqlHelper.CONN_STR, CommandType.Text, SQL_SELECT_CONTENT, parm)) {
if
(sdr.Read()) { ci
=
new
ContentInfo(sdr.GetInt32(
0
),sdr.GetString(
1
), sdr.GetString(
2
), sdr.GetDateTime(
3
), sdr.GetInt32(
4
), sdr.GetInt32(
5
), sdr.GetString(
6
)); } }
return
ci; } } }
代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->
3
、Model项目 (
1
)contentInfo.cs
using
System;
namespace
Model {
///
<summary>
///
Class1 的摘要说明。
///
</summary>
public
class
ContentInfo {
private
int
_ID;
private
string
_Content;
private
string
_Title;
private
string
_From;
private
DateTime _AddDate;
private
int
_clsID;
private
int
_tmpID;
///
<summary>
///
文章内容构造函数
///
</summary>
///
<param name="id">
文章流水号ID
</param>
///
<param name="content">
文章内容
</param>
///
<param name="title">
文章标题
</param>
///
<param name="from">
文章来源
</param>
///
<param name="clsid">
文章的分类属性ID
</param>
///
<param name="tmpid">
文章的模板属性ID
</param>
public
ContentInfo(
int
id,
string
title,
string
content,
string
from,DateTime addDate,
int
clsid,
int
tmpid ) {
this
._ID
=
id;
this
._Content
=
content;
this
._Title
=
title;
this
._From
=
from;
this
._AddDate
=
addDate;
this
._clsID
=
clsid;
this
._tmpID
=
tmpid; }
//
属性
public
int
ID {
get
{
return
_ID; } }
public
string
Content {
get
{
return
_Content; } }
public
string
Title {
get
{
return
_Title; } }
public
string
From {
get
{
return
_From; } }
public
DateTime AddDate {
get
{
return
_AddDate; } }
public
int
ClsID {
get
{
return
_clsID; } }
public
int
TmpID {
get
{
return
_tmpID; } } } }
代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->
4
、IDAL项目 (
1
)Icontent.cs
using
System;
using
Model;
namespace
IDAL {
///
<summary>
///
文章内容操作接口
///
</summary>
public
interface
IContent {
///
<summary>
///
取得文章的内容。
///
</summary>
///
<param name="id">
文章的ID
</param>
///
<returns></returns>
ContentInfo GetContentInfo(
int
id); } }
5
、DALFactory项目 (
1
)Content.cs
using
System;
using
System.Reflection;
using
System.Configuration;
using
IDAL;
namespace
DALFactory {
///
<summary>
///
工产模式实现文章接口。
///
</summary>
public
class
Content {
public
static
IDAL.IContent Create() {
//
这里可以查看 DAL 接口类。
string
path
=
System.Configuration.ConfigurationSettings.AppSettings[
"
WebDAL
"
].ToString();
string
className
=
path
+
"
.Content
"
;
//
用配置文件指定的类组合
return
(IDAL.IContent)Assembly.Load(path).CreateInstance(className); } } }
代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->
6
、BLL项目 (
1
)Content.cs
using
System;
using
Model;
using
IDAL;
namespace
BLL {
///
<summary>
///
Content 的摘要说明。
///
</summary>
public
class
Content {
public
ContentInfo GetContentInfo(
int
id) {
//
取得从数据访问层取得一个文章内容实例
IContent dal
=
DALFactory.Content.Create();
//
用DAL查找文章内容
return
dal.GetContentInfo(id); } } }
代码
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ -->
7
、Web项目
1
、Web.config:
<
appSettings
>
<
add key
=
"
SQLConnString
"
value
=
"
Data Source=localhost;Persist Security info=True;Initial Catalog=newsDB;User ID=sa;Password=
"
/>
<
add key
=
"
WebDAL
"
value
=
"
SQLServerDAL
"
/>
</
appSettings
>
2
、WebUI.aspx
<%
@ Page language
=
"
c#
"
Codebehind
=
"
WebUI.aspx.cs
"
AutoEventWireup
=
"
false
"
Inherits
=
"
Web.WebUI
"
%>
<!
DOCTYPE HTML PUBLIC
"
-//W3C//DTD HTML 4.0 Transitional//EN
"
>
<
HTML
>
<
HEAD
>
<
title
>
WebUI
</
title
>
<
meta name
=
"
GENERATOR
"
Content
=
"
Microsoft Visual Studio .NET 7.1
"
>
<
meta name
=
"
CODE_LANGUAGE
"
Content
=
"
C#
"
>
<
meta name
=
"
vs_defaultClientScript
"
content
=
"
JavaScript
"
>
<
meta name
=
"
vs_targetSchema
"
content
=
"
http://schemas.microsoft.com/intellisense/ie5
"
>
</
HEAD
>
<
body MS_POSITIONING
=
"
GridLayout
"
>
<
form id
=
"
Form1
"
method
=
"
post
"
runat
=
"
server
"
>
<
FONT
"
>宋体
"
></
FONT
>
<
table width
=
"
600
"
border
=
"
1
"
>
<
tr
>
<
td style
=
"
WIDTH: 173px
"
>&
nbsp;
</
td
>
<
td
>&
nbsp;
<
asp:Label id
=
"
lblTitle
"
runat
=
"
server
"
></
asp:Label
></
td
>
</
tr
>
<
tr
>