ASP做的网站在后台添加文章重新生成之后会把原先数据库里所有的

  1. AutoCMS
  2. /
  3. 建站资讯
  4. /
  5. 网站
logo
贾桂娜

网站  2026-10-14 09:48:02   401

ASP做的网站在后台添加文章重新生成之后会把原先数据库里所有的

一个用ASP搭的小网站,后台加文章,点一下“重新生成”,前台刷新一看,就剩刚发的那篇了,之前几个月攒的文章全没影。打开数据库一查,表里也只剩一条记录。这事我碰到过不止一次,也帮别人收拾过好几回烂摊子。

先说最常见的一种情况。很多老ASP后台的“重新生成”按钮,代码写得很糙。它干的事其实是先把整张文章表清空,再把当前表单里提交的这条插进去。大概长这样:

```asp
  Conn.Execute("DELETE FROM Article")
  sql = "INSERT INTO Article (title, content) VALUES (''" & title & "'',''" & content & "'')"
  Conn.Execute(sql)
  ```

你看着是“重新生成”,它理解成“清空重来”。本来设计意图可能是从别的地方同步数据,结果源就是当前这条提交,数据库直接变成临时中转站。每点一次,老数据就被冲一次。

还有一种更隐蔽。代码里确实有循环,但SQL写错了。比如`SELECT TOP 1 * FROM Article ORDER BY id DESC`,只取最新一条,然后`Do While Not rs.EOF`里面忘了写`rs.MoveNext`,或者循环体外面才写。结果就是要么死循环,要么只处理一条。生成出来的静态页只有一篇,数据库看着没动,但前台翻页全断了,用户以为数据丢了。

再有一种,数据库本身没丢,丢的是静态文件。ASP生成静态页常用FileSystemObject,有些代码图省事,生成前先`DeleteFolder`把整个news目录删掉,再重新建。如果生成过程中间报错——比如某篇文章标题里有特殊字符导致路径创建失败——后面的就全没生成。目录空了,前台自然打不开。这时候数据库里数据还在,但很多人第一反应是去查数据库,一看表里好好的,反而更懵。

Access数据库还有个坑。生成逻辑里如果调用了压缩修复,或者用`SELECT * INTO`新表再改名,中途断电、超时、权限不够,原表可能被删了,新表没建成。这种是真丢,只能翻备份。

怎么判断是哪种?先看数据库表里还有没有记录。表里空了,就是代码里带了DELETE或TRUNCATE。表里有记录但前台没有,就去查生成目录,看静态文件是不是被删了没重建。表里只剩最新一条,多半是循环写错或者只查了一条。

解决起来也不复杂。生成逻辑里别碰DELETE,改成追加或者按ID更新。要重新生成全部,就老老实实`SELECT * FROM Article ORDER BY id`,循环里记得`rs.MoveNext`,每篇单独生成。静态目录别整个删,按文件名覆盖就行。生成前把数据库文件复制一份,或者至少导出一份SQL。Access的话,生成操作和压缩修复别放在同一个请求里做。

还有个习惯问题。很多老ASP系统没有事务,一条SQL执行一半出错就卡在那。加个`On Error Resume Next`再配合手动回滚,虽然土,但比裸奔强。数据库连接用完记得关,别让锁把表锁死。

说到底,“重新生成”这四个字在不同代码里含义差太远。有的只是刷新缓存,有的是全量重建,有的直接清库。接手一个老ASP站,先别急着点那个按钮,把生成页的源码翻出来,搜一下DELETE、TRUNCATE、DeleteFolder、CreateTextFile的第二个参数。看到`True`就要留神,那是覆盖写。看到没有WHERE的DELETE,赶紧备份。

数据丢了也别慌。Access的话,先看有没有`.ldb`锁文件,关掉所有连接再打开,有时候只是锁住了。SQL Server查一下日志,如果恢复模式不是简单,还能做时间点恢复。实在不行,翻服务器上有没有自动备份,或者本地有没有人下载过整站。

最后提醒一句,加文章就加文章,别让“生成”顺带把库清了。这俩事拆开做,麻烦少一半。