对于B/S架构的三层架构的开发,可能很多的人都已经了解的是比较清楚的。哪么我在这里用的是最简单的三层架构。ui+bll+dal+dbsqlhelp+model.
从05出来以后由于功能明显比03夸张了很多,所以在开发的时候也就很方便。其中以数据的显示最为明显。通过sqldatasource可以几乎一行代码都不需要写,就能在GridView中显示出来数据,并且进行增删查改的操作,但是我个人总感觉这样做是有问题的。因为使用sqldatasource,就明显的破坏了3层架构的基本改变。哪么微软在05当中,很重点的推出了objectdatasource这个东西,就是专门用来结合三层架构开发的一个数据源绑定控件。 在层次之间传递的也是object,这样相对来说就比较好一些。
代码在具体的下边,其实主要就是DataList稍微麻烦一点,别的几个控件都可以自动 实现增删查改的功能,所以基本没什么写太多的代码。!
在这里主要是DataList的代码,以操作Jobs表为示例。
DbSqlHelp
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Data;
using
System.Data.SqlClient;
namespace
DbSqlHelp
{
public
abstract
class
DbSqlHelp
{
static
string
StrConn
=
@"
User ID=sa;Password=perishryu;Initial Catalog=pubs;Data Source=OATHRYUSQL2005
"
;
static
SqlDataAdapter da;
static
SqlCommand cmd;
static
SqlConnection conn;
static
DataSet ds;
public
static
DataSet Search(
string
sql)
{
using
(da
=
new
SqlDataAdapter(sql, StrConn))
{
using
(ds
=
new
DataSet())
{
da.Fill(ds);
return
ds;
}
}
}
public
static
bool
Make(
string
sql)
{
using
(conn
=
new
SqlConnection(StrConn))
{
using
(cmd
=
new
SqlCommand(sql, conn))
{
if
(conn.State
!=
ConnectionState.Closed)
{
conn.Close();
}
try
{
conn.Open();
cmd.ExecuteNonQuery();
return
false
;
}
catch
(System.Exception ex)
{
throw
ex;
}
finally
{
conn.Close();
}
}
}
}
}
}
Model
using
System;
using
System.Collections.Generic;
using
System.Text;
namespace
Model
{
public
class
Job_Model
{
public
Job_Model()
{
}
public
Job_Model(
int
id,
string
desc,
int
min,
int
max)
{
this
.job_desc
=
desc;
this
.job_id
=
id;
this
.min_lvl
=
min;
this
.max_lvl
=
max;
}
int
job_id;
public
int
Job_id
{
get
{
return
job_id; }
set
{ job_id
=
value; }
}
string
job_desc;
public
string
Job_desc
{
get
{
return
job_desc; }
set
{ job_desc
=
value; }
}
int
min_lvl;
public
int
Min_lvl
{
get
{
return
min_lvl; }
set
{ min_lvl
=
value; }
}
int
max_lvl;
public
int
Max_lvl
{
get
{
return
max_lvl; }
set
{ max_lvl
=
value; }
}
}
}
DAL
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Data;
namespace
DAL
{
public
class
Job_DAL
{
string
sql;
public
DataSet Select_Job_Dal(
string
jobid)
{
sql
=
"
select * from jobs where job_id='
"
+
jobid
+
"
'
"
;
return
DbSqlHelp.DbSqlHelp.Search(sql);
}
public
DataSet Select_Job_Dal()
{
sql
=
"
select * from jobs
"
;
return
DbSqlHelp.DbSqlHelp.Search(sql);
}
public
bool
Update_Job_Dal(Model.Job_Model job)
{
sql
=
"
update jobs set job_desc='
"
+
job.Job_desc
+
"
',min_lvl='
"
+
job.Min_lvl
+
"
',max_lvl='
"
+
job.Max_lvl
+
"
' where job_id='
"
+
job.Job_id
+
"
'
"
;
try
{
return
DbSqlHelp.DbSqlHelp.Make(sql);
}
catch
(System.Exception ex)
{
throw
ex;
}
}
public
bool
Insert_Job_Dal(Model.Job_Model job)
{
sql
=
"
insert into jobs values('
"
+
job.Job_desc
+
"
','
"
+
job.Min_lvl
+
"
','
"
+
job.Max_lvl
+
"
')
"
;
try
{
return
DbSqlHelp.DbSqlHelp.Make(sql);
}
catch
(System.Exception ex)
{
throw
ex;
}
}
public
bool
Delete_Job_Dal(Model.Job_Model job)
{
sql
=
"
delete from jobs where job_id='
"
+
job.Job_id
+
"
'
"
;
try
{
return
DbSqlHelp.DbSqlHelp.Make(sql);
}
catch
(System.Exception ex)
{
throw
ex;
}
}
}
}
BLL
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Data;
namespace
BLL
{
public
class
Job_BLL
{
DAL.Job_DAL jobdal;
public
DataSet Select_BLL()
{
jobdal
=
new
DAL.Job_DAL();
{
return
jobdal.Select_Job_Dal();
}
}
public
DataSet Select_BLL(
string
jobid)
{
jobdal
=
new
DAL.Job_DAL();
{
return
jobdal.Select_Job_Dal(jobid);
}
}
public
bool
Update_BLL(Model.Job_Model job)
{
jobdal
=
new
DAL.Job_DAL();
try
{
return
jobdal.Update_Job_Dal(job);
}
catch
(System.Exception ex)
{
throw
ex;
}
}
public
bool
Insert_BLL(Model.Job_Model job)
{
jobdal
=
new
DAL.Job_DAL();
try
{
return
jobdal.Insert_Job_Dal(job);
}
catch
(System.Exception ex)
{
throw
ex;
}
}
public
bool
Delete_BLL(Model.Job_Model job)
{
jobdal
=
new
DAL.Job_DAL();
try
{
return
jobdal.Delete_Job_Dal(job);
}
catch
(System.Exception ex)
{
throw
ex;
}
}
}
}
UI aspx页面
<%
@ Page Language
=
"
C#
"
AutoEventWireup
=
"
true
"
CodeFile
=
"
DataListDemo.aspx.cs
"
Inherits
=
"
DataListDemo
"
%>
<!
DOCTYPE html PUBLIC
"
-//W3C//DTD XHTML 1.0 Transitional//EN
"
"
http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd
"
>
<
html xmlns
=
"
http://www.w3.org/1999/xhtml
"
>
<
head runat
=
"
server
"
>
<
title
>
无标题页
</
title
>
</
head
>
<
body
>
<
form id
=
"
form1
"
runat
=
"
server
"
>
<
div
>
<
asp:DataList ID
=
"
DataList1
"
runat
=
"
server
"
DataSourceID
=
"
ObjectDataSource1
"
RepeatColumns
=
"
4
"
RepeatDirection
=
"
Horizontal
"
Width
=
"
720px
"
DataKeyField
=
"
job_id
"
OnCancelCommand
=
"
DataList1_CancelCommand
"
OnEditCommand
=
"
DataList1_EditCommand
"
OnUpdateCommand
=
"
DataList1_UpdateCommand
"
OnDeleteCommand
=
"
DataList1_DeleteCommand
"
>
<
ItemTemplate
>
job_id:
<
asp:Literal ID
=
"
Literal1
"
runat
=
"
server
"
Text
=
'
<%#Eval("job_id") %>
'
></
asp:Literal
><
br
/>
job_desc:
<
asp:Literal ID
=
"
Literal2
"
runat
=
"
server
"
Text
=
'
<%#Eval("job_desc") %>
'
></
asp:Literal
><
br
/>
min_lvl:
<
asp:Literal ID
=
"
Literal3
"
runat
=
"
server
"
Text
=
'
<%#Eval("min_lvl") %>
'
></
asp:Literal
><
br
/>
max_lvl:
<
asp:Literal ID
=
"
Literal4
"
runat
=
"
server
"
Text
=
'
<%#Eval("max_lvl") %>
'
></
asp:Literal
><
br
/>
<
asp:LinkButton ID
=
"
LinkButton1
"
runat
=
"
server
"
CommandName
=
"
Edit
"
>
编辑
</
asp:LinkButton
>&
nbsp;
&
nbsp;
&
nbsp;
&
nbsp;
<
asp:LinkButton ID
=
"
LinkButton2
"
runat
=
"
server
"
CommandName
=
"
delete
"
>
删除
</
asp:LinkButton
>
</
ItemTemplate
>
<
EditItemTemplate
>
job_id:
<
asp:Literal ID
=
"
Literal1
"
runat
=
"
server
"
Text
=
'
<%#Eval("job_id") %>
'
></
asp:Literal
><
br
/>
job_desc:
<
asp:TextBox ID
=
"
TextBox1
"
runat
=
"
server
"
Text
=
'
<%#Bind("job_desc") %>
'
></
asp:TextBox
><
br
/>
min_lvl:
<
asp:TextBox ID
=
"
TextBox2
"
runat
=
"
server
"
Text
=
'
<%#Bind("min_lvl") %>
'
></
asp:TextBox
><
br
/>
max_lvl:
<
asp:TextBox ID
=
"
TextBox3
"
runat
=
"
server
"
Text
=
'
<%#Bind("max_lvl") %>
'
></
asp:TextBox
><
br
/>
<
asp:LinkButton ID
=
"
LinkButton3
"
runat
=
"
server
"
CommandName
=
"
update
"
>
更新
</
asp:LinkButton
>
<
asp:LinkButton ID
=
"
LinkButton4
"
runat
=
"
server
"
CommandName
=
"
cancel
"
>
取消
</
asp:LinkButton
>
</
EditItemTemplate
>
</
asp:DataList
><
asp:ObjectDataSource ID
=
"
ObjectDataSource1
"
runat
=
"
server
"
DataObjectTypeName
=
"
Model.Job_Model
"
DeleteMethod
=
"
Delete_BLL
"
InsertMethod
=
"
Insert_BLL
"
SelectMethod
=
"
Select_BLL
"
TypeName
=
"
BLL.Job_BLL
"
UpdateMethod
=
"
Update_BLL
"
OnUpdating
=
"
ObjectDataSource1_Updating
"
OnDeleting
=
"
ObjectDataSource1_Deleting
"
OnUpdated
=
"
ObjectDataSource1_Updated
"
></
asp:ObjectDataSource
>
<
asp:Label ID
=
"
Label1
"
runat
=
"
server
"
Text
=
"
Label
"
Width
=
"
280px
"
></
asp:Label
>
&
nbsp;
&
nbsp;
</
div
>
</
form
>
</
body
>
</
html
>
UI CS代码
using
System;
using
System.Data;
using
System.Configuration;
using
System.Collections;
using
System.Web;
using
System.Web.Security;
using
System.Web.UI;
using
System.Web.UI.WebControls;
using
System.Web.UI.WebControls.WebParts;
using
System.Web.UI.HtmlControls;
using
System.ComponentModel;
public
partial
class
DataListDemo : System.Web.UI.Page
{
protected
void
Page_Load(
object
sender, EventArgs e)
{
}
protected
void
DataList1_EditCommand(
object
source, DataListCommandEventArgs e)
{
this
.DataList1.EditItemIndex
=
e.Item.ItemIndex;
DataBind();
}
protected
void
DataList1_CancelCommand(
object
source, DataListCommandEventArgs e)
{
this
.DataList1.EditItemIndex
=
-
1
;
DataBind();
}
protected
void
ObjectDataSource1_Updating(
object
sender, ObjectDataSourceMethodEventArgs e)
{
((Model.Job_Model)(e.InputParameters[
0
])).Job_id
=
job.Job_id;
((Model.Job_Model)(e.InputParameters[
0
])).Job_desc
=
job.Job_desc;
((Model.Job_Model)(e.InputParameters[
0
])).Min_lvl
=
job.Min_lvl;
((Model.Job_Model)(e.InputParameters[
0
])).Max_lvl
=
job.Max_lvl;
this
.DataList1.EditItemIndex
=
-
1
;
DataBind();
}
Model.Job_Model job;
protected
void
DataList1_UpdateCommand(
object
source, DataListCommandEventArgs e)
{
job
=
new
Model.Job_Model();
job.Job_id
=
Convert.ToInt32(((Literal)(
this
.DataList1.Items[e.Item.ItemIndex].FindControl(
"
Literal1
"
))).Text);
job.Job_desc
=
((TextBox)(
this
.DataList1.Items[e.Item.ItemIndex].FindControl(
"
TextBox1
"
))).Text;
job.Min_lvl
=
Convert.ToInt32(((TextBox)(
this
.DataList1.Items[e.Item.ItemIndex].FindControl(
"
TextBox2
"
))).Text);
job.Max_lvl
=
Convert.ToInt32(((TextBox)(
this
.DataList1.Items[e.Item.ItemIndex].FindControl(
"
TextBox3
"
))).Text);
ObjectDataSource1.Update();
}
protected
void
DataList1_DeleteCommand(
object
source, DataListCommandEventArgs e)
{
job
=
new
Model.Job_Model();
job.Job_id
=
Convert.ToInt32(((Literal)(
this
.DataList1.Items[e.Item.ItemIndex].FindControl(
"
Literal1
"
))).Text);
ObjectDataSource1.Delete();
}
protected
void
ObjectDataSource1_Deleting(
object
sender, ObjectDataSourceMethodEventArgs e)
{
((Model.Job_Model)(e.InputParameters[
0
])).Job_id
=
job.Job_id;
DataBind();
}
protected
void
ObjectDataSource1_Updated(
object
sender, ObjectDataSourceStatusEventArgs e)
{
if
(e.Exception
!=
null
)
{
e.ExceptionHandled
=
true
;
this
.Label1.Text
=
e.Exception.Message;
}
}
}
其他的数据绑定控件(DetailsView,FormView,GridView),代码大同小异,他们都可以自动完成增删改查的功能,所以再这里就不写了。如果有朋友有更好的办法或者建议,可以留言交流一下。 可以留下EMAIL。