在ASP中简化数据库操作的思路和实现

在ASP中要修改一个数据库时,我想大多数人的做法都是:用RecordSet得到要修改的数据,把Field的值写到各表单对象的value中,要保存了,就逐个从表单对象中读取值,再一一赋给Field。最简单的典型代码如下:

初始显示代码大致如下:
<%
dim sql
dim rs,cn

sql = " Select * From Table Where PrimaryKey=1 "

... '得到RecordSet

dim sValue(20)
sValue(1) = rs("col1")
sValue(2) = rs("col2")
.... ' 赋值
%>

<!-- 页面中的Html代码 -->
<input name="field1" type="text" value="<%=sValue(1)%>">
<input name="field2" type="text" value="<%=sValue(2)%>">
<input name="field3" type="text" value="<%=sValue(3)%>">
... <!-- 其它要表单对象-->

保存代码大致如下:
<%
dim sql
dim rs,cn

sql = " Select * From Table Where PrimaryKey=1 "

... '得到RecordSet

rs("col1") = Request["field1"]
rs("col2") = Request["field2"]
.... '其它赋值

rs.Update()
%>

我以前就是这么做的。但当我一次以一次碰到类似的任务时,我发现80%的代码都是类似的,并且这种做法有很多不方便的地方:
1.增加和修改只需用同一个流程,只需标明是增加或修改即可。这部分可以标准化。
2.显示代码和保存代码,在取数据时是一致的,我在做asp时,习惯于显示是一个页面,处理用另一个页面,这样做的思路简单,且有利于代码和界面的分离。但代码的维护就有点麻烦了,取数据的代码改变后,必须同步。
3.当在保存代码中判断输入有问题理,需要返回显示界面,并做提示,要保留用户原有的值也是个麻烦事。Asp.net在post-back结构下处理就相当的方便。
4.当表单对象是RadioButton,checkbox或List时,要选择相应的值。这个过程也是大致相同,且麻烦。
5.当表中的Field很多时,给表单赋值和从表单中取数就很长,一旦有改动也很糟糕。
6.应该还有很多不方便的地方。

当我采用asp.net时,我发现aps.net将aps的大多数的不足改进得相当好,代码的复用性极佳,整个应用的体系结构更为合理,在应用程序方面的确有质的飞跃。但时下依然有很多的程序需要用asp,且asp.net必竟十分庞大,于asp有较大的不同。为了在asp中简化数据库操作,并使应用程序体系列合理,我尝试做一些改进,其中参考了asp.net的思想,采用了单页面模式(post-back,极简单的).

想要解决的问题:
1. 在post-back时,表单对象保持上次用户输入的值,类似asp.net的EnableViewState时。可以处理RadioButton,CheckBox和DropDownList表单对象。
2. 可以得到触发post-back的对象名称,模拟asp.net的事件处理结构。当然不会自动实现,需要自己实现该结构。
3. 在表单命名规范下,自动由RecordSet填写表单对象,或将表单的值回填到RecordSet中。同样要支持RadioButton,CheckBox和DropDownList表单对象。

★表单命名规范:"col_" + 字段名称。如表Table中有字段col1则,相应的表单命名为col_col1

目前的样例放在以下地址:http://www.ccpithz.org/sample/,其中的增加和修改页面(edit.asp)用到了改进的思路。

完整的edit.asp页面代码如下:
**************************** Edit.asp Begin ************************************************************************
<!--#include file = "../include/inc.asp"-->
<!--#include file = "../include/AspFrame.asp"-->
<!--#include file = "../include/Datastore.asp"-->
<!--#include file = "BaseLib.asp"-->
<%
' 声明公用变量
dim cn,ds
dim sTitle,sInfo

Page_Load

Sub Page_Load()
' *************************************************************
' 得到信息
' *************************************************************
' 得到Id值
dim nId
nId = CLng(Request("SelectedId"))

dim sSql,sConn
dim cnt
sConn = GetCommonCnStr() '得到数据库连接串
sSql = " Select * From article Where id=" + CStr(nId)
'检索数据
set cn = Server.CreateObject("ADODB.Connection")
cn.Open(sConn)

set ds = new CDatastore
ds.Init cn,sSql

' 第一次访问该面,从数据库中取值填充表单,而在post-back进,将自动保持上次的表单值。
If Not IsPostBack() Then
BindData
End If

' 保存
If IsPostBackObject("save") Then
Save
End If
End Sub

Sub Save
' 默认值
ds.GetParam()
If ds.nMode = 1 Then
ds.m_rs("bj_sort") = 9999
End If

dim nRc
nRc = ds.Update()

sTitle = "修改档案"
sInfo = "数据已保存成功"
End Sub

Sub BindData
ds.SetParam()
If ds.nMode = 1 Then
sTitle = "创建档案"
ds.m_value.Add "rq",FormatDate(Now(),4)
Else
sTitle = "修改档案"
End If
End Sub

%>
<script language="JavaScript" src="../include/utility.js"></script>
<form method="post" name="Form1" id="Form1">
<font size="3">This is a sample.</font>
<table width="98%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="25" bgcolor="#eeeeee"><strong><font size="3" color="#FF6600"><%=sTitle%></font></strong>
| <a οnclick="_PostBack('Form1','save','');" href="#">保存</a> <font color="#FF0000"><%=sInfo%></font></td>
</tr>
</table>
<table width="551" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="79" height="25">标题</td>
<td width="472" height="25"> <input name="col_bt" type="text" id="col_bt" value="<%=ds.m_value("bt")%>"></td>
</tr>
<tr>
<td height="25">日期</td>
<td height="25"> <input name="col_rq" type="text" id="col_rq" value="<%=ds.m_value("rq")%>"></td>
</tr>
<tr>
<td height="25">作者</td>
<td height="25"> <input name="col_zz" type="text" id="col_zz" value="<%=ds.m_value("zz")%>"></td>
</tr>
<tr>
<td height="25">允许回复</td>
<td height="25"><input type="radio" name="col_bj_AllowChild" value="1">
允许
<input type="radio" name="col_bj_AllowChild" value="0">
不允许
<% SelectRadioButtonItem "col_bj_AllowChild",ds.m_value("bj_AllowChild")%></td>
</tr>
<tr>
<td valign="top">内容</td>
<td> <textarea name="col_nr" cols="60" rows="20" id="col_nr"><%=ds.m_value("nr")%></textarea></td>
</tr>
</table>
<% BuildFrameHidden %>
</form>
<% FillPostBackForm %>
***********************************Edit.asp End ************************************************************************

目前仍在研究中,各位在处理似的问题时,都用的什么办法,有些什么想法,欢迎讨论。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值