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

原创 2004年07月03日 13:31:00
在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 onclick="_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 ************************************************************************

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

ASP对数据库的操作方法

ASP与数据库-连接、写入、修改、删除、显示代码属性与方法         PageCount 属性: 决定 Recordset 对象包括多少“页”的数据。        这里的“页”是数据记录...
  • QIU1988YANG
  • QIU1988YANG
  • 2017年01月23日 10:56
  • 1990

Asp+Sql 对数据库的各种操作

<% //查询方法 //----------------------------(1)------------------------------- Set RsWorkUserInfo = Serv...
  • lazycatw
  • lazycatw
  • 2007年04月10日 10:48
  • 335

第9章 ASP.NET操作数据库

第9章  ASP.NET操作数据库通过对ADO.NET的基本讲解,以及讲解了一些数据源控件的基本用法后,本章将介绍一些ASP.NET操作数据库的高级用法,包括使用SQLHelper,以及数据源控件对数...
  • ddjj_1980
  • ddjj_1980
  • 2010年04月27日 17:32
  • 9336

Asp数据库操作教学代码(原创)

首先要保证已经安装了IIS,有问题再说。读写数据库代码:建立Connection和RecordSet对象Set Cnn = Server.CreateObject("Adodb.Connection"...
  • 54powerman
  • 54powerman
  • 2004年08月22日 23:00
  • 2463

雅慧教你ASP+ACCESS数据库网页基本操作

1、架设IIS服务器或者直接在网上下载可以直接测试运行ASP的软件; 2、在电脑D盘的根目录下,建立一个名为“Web”的文件夹,在该文件夹下建立“data”、“images”、“css”三个文件...
  • u014624988
  • u014624988
  • 2014年11月19日 19:13
  • 660

用ASP代码实现图片写入数据库

用ASP代码实现图片写入数据库 2006-07-22 15:57:40 / 天气: 阴雨 / 心情: 高兴 / 个人分类:学习&工作 首先我们先来熟悉一下将要使用的对象方法。我们用来获取上一个页面传递...
  • lljs3344
  • lljs3344
  • 2007年01月28日 15:55
  • 1175

asp中如何实现网页计数器

     在ASP中,如何实现网页的计数器呢?其实奥妙全在于站点根目录下的GLOBAL.ASA文件下    大家知道,在ASP脚本语言中,有两个对象比较重要,一个是应用程序对象APPLICATION,...
  • ct_hero0902
  • ct_hero0902
  • 2007年04月10日 17:01
  • 2305

asp数据库操作

ASP连接数据库  ASP连接11种数据库语法总结  经常使用到有关数据库的操作。包括连接代码、SQL命令等等,又不曾刻意去记忆它们(我本人是不愿意去记这东东),所以常常在用到的时候又去查书本,翻来翻...
  • longyumen
  • longyumen
  • 2009年12月15日 15:41
  • 286

关于AppDelegate及内部方法的简单介绍

今天来对AppDelegate做一个简单的介绍 一、简单介绍 AppDelegate是整个应用的一个代理,也类似于整个应用的入口和出口(应用启动的时候最先走到这里,应用关闭的时候最后也会走到这里)...
  • wei78008023
  • wei78008023
  • 2015年05月12日 11:24
  • 907

用两个栈实现队列 与 用两个队列实现栈

class Solution { public: void push(int node) { stack1.push(node); } int pop() { ...
  • STILLxjy
  • STILLxjy
  • 2016年09月19日 20:39
  • 551
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在ASP中简化数据库操作的思路和实现
举报原因:
原因补充:

(最多只允许输入30个字)